一眨眼学习Unity3D 也有一段时间了,基本已经拿下了这套游戏引擎,回过头来想想以前写的RPG 游戏引擎,越来越发现以前写的就是垃圾。人果然是要不断学习与不断进步,好好学习,天天向上。哇咔咔~ 加油!!
最近做一个项目须要去绘制线与绘制面,那么把这两天的学习笔记整理一下,一是给自己留作备忘,二是方便初学者学习。
任何一个无规则曲线它都是有若干个线段组成,及时是圆形它也是又若干个线段组成的,也就是说将若干个线段拼接起来就是我们须要的无规则曲线~那么在3D 的世界中我们须要知道 X Y Z 三个点来确定一条3D线段。
首先先使用Unity编辑器的方式来添加一条线~
Unity -> GameObject -> Create Empty 创建一个空的对象,我命名为line。然后点击 Component -> Miscellaneous -> Line Renderer 给line添加一个线渲染器的属性,Line Renderer是非常中的属性,下面我会详细的说明。
Create -> Material 创建一个材质,做来这个线段的贴图,下面我们看看Line Renderer的一些重要参数。
Cast Shadows: 是否投射阴影。
Receive Shadows: 是否接收阴影。
Materials :设置材质,这里可以设置多个材质, line就是上面我们创建的材质,这里我给line这个材质涂上了红颜色。
Positions:这个属性就比较重要了,它是专门设置线段在3D 世界中的点的坐标,size 设置点的数量 为3 那么将会有3个点,Element 0 Element 1 Element 2 这三个点将确定这条曲线分为两段,第一段是(0,0,1) 到 (0,0,2) ,第二段是 (0,0,2) 到(0,0,4)。
Paramerters
StartWidth :设置起点的宽度
EndWidth: 设置终点的宽度 ,这两项数值默认为1,但是现实起来很宽,所以一般都设置为0.几~
Start Color: 设置起点颜色
Start Color: 设置终点颜色
Use World Space 使用世界坐标系
大家看看效果,清楚的可以看到曲线分为两部分,第一部分较短 第二部分较长。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
using UnityEngine; using System.Collections; using System.Threading; public class Main : MonoBehaviour { //游戏对象,这里是线段对象 private GameObject LineRenderGameObject; //线段渲染器 private LineRenderer lineRenderer; //设置线段的个数,标示一个曲线由几条线段组成 private int lineLength = 4; //分别记录4个点,通过这4个三维世界中的点去连接一条线段 private Vector3 v0 = new Vector3(1.0f,0.0f,0.0f); private Vector3 v1 = new Vector3(0.0f,1.0f,0.0f); private Vector3 v2 = new Vector3(0.0f,0.0f,1.0f); private Vector3 v3 = new Vector3(1.0f,0.0f,0.0f); void Start(){ //通过之前创建的对象的名称,就可以在其它类中得到这个对象, //这里在main.cs中拿到line的对象 LineRenderGameObject = GameObject.Find ("line"); //通过游戏对象,GetComponent方法 传入LineRenderer //就是之前给line游戏对象添加的渲染器属性 //有了这个对象才可以为游戏世界渲染线段 lineRenderer = (LineRenderer)LineRenderGameObject.GetComponent ("LineRenderer"); //设置线段长度,这个数值须要和绘制线3D点的数量想等 //否则会抛异常~~ lineRenderer.SetVertexCount(lineLength); } void Update() { //在游戏更新中去设置点 //根据点将这个曲线链接起来 //第一个参数为 点的ID //第二个 参数为点的3D坐标 //ID 一样的话就标明是一条线段 //所以盆友们须要注意一下! lineRenderer.SetPosition (0, v0); lineRenderer.SetPosition (1, v1); lineRenderer.SetPosition (2, v2); lineRenderer.SetPosition (3, v3); } } |
通过上面代码的设置,运行游戏,发现全新的一个三角形曲线赫然的映入我们的眼帘,有了上面的方法我们就可以组合的绘制出各种各样的3D 游戏曲线了,这里MOMO使用的是颜色,大家也可以添加一个贴图~
绘制面的话~,因为3D世界中游戏面全都是用三角形来拼起来的(出于效率的考虑),所以大家所看到的面其实都是用三角面拼接起来的。那么下面我们看看在Unity3D 中如何绘制三角形平面。先创建一个GameObject对象,我命名为face,然后给这个对象添加两个Mesh属性, 添加MeshFilter(网格过滤器)与mesh Renderer(网格渲染器)属性,这样子就可以绘制网格面了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
using UnityEngine; using System.Collections; public class Main : MonoBehaviour { // Update is called once per frame void Update () { //通过object对象名 face 得到网格渲染器对象 MeshFilter meshFilter = (MeshFilter)GameObject.Find("face").GetComponent(typeof(MeshFilter)); //通过渲染器对象得到网格对象 Mesh mesh = meshFilter.mesh; //API中写的不是提清楚,我详细的在说一遍 //设置顶点,这个属性非常重要 //三个点确定一个面,所以Vector3数组的数量一定是3个倍数 //遵循顺时针三点确定一面 //这里的数量为6 也就是我创建了2个三角面 //依次填写3D坐标点 mesh.vertices = new Vector3[] {new Vector3(5, 0, 0), new Vector3(0, 5, 0), new Vector3(0, 0, 5),new Vector3(-5, 0, 0), new Vector3(0, -5, 0), new Vector3(0, 0, -5)}; //设置贴图点,因为面确定出来以后就是就是2D //所以贴纸贴图数量为Vector2 //第一个三角形设置5个贴图 //第二个三角形设置一个贴图 //数值数量依然要和顶点的数量一样 mesh.uv = new Vector2[] {new Vector2(0, 0), new Vector2(0, 5), new Vector2(5, 5),new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 1)}; //设置三角形索引,这个索引是根据上面顶点坐标数组的索引 //对应着定点数组Vector3中的每一项 //最后将两个三角形绘制在平面中 //数值数量依然要和顶点的数量一样 mesh.triangles= new int []{0,1,2,3,4,5}; } } |
Build and Run 运行效果后清楚的可以看到两个三角形。MOMO提醒大家 善用三角平面可以绘制出各种各样的游戏面出来噢~哇咔咔~
最后欢迎各位盆友可以和MOMO一起讨论Unity3D游戏开发,总的来说这一章还是比较简单的,不过也是非常重要的一章。代码我就不上传了。哇咔咔~ MOMO愿和 大家好好学习,大家一起进步哈~!!!
- 本文固定链接: https://www.xuanyusong.com/archives/561
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!
为什么老是见你说“哇咔咔”,到底啥意思????
有一部国产动漫叫魁拔,魁拔的口头禅,哇咔咔
顶!
点拨了一下,了解了
谢谢你启发了我
其实是个uv坐标,你可以百度下,就知道了。就是贴图的位置,所以几个顶点,就几个uv坐标
momo大神,使用LineRenderer生成一个固定的曲线之后如何让他跟随另一个游戏对象运动(相对静止)。sphere01.transform.parent = gameObjectSphere.transform;我试了这行代码但是不好使,这其中有个问题是对于一个空游戏对象我们给他添加了LineRenderer组件后他的Positions和Transfrom组件里的Position有何区别
MOMO大神,请问用代码创建的环状mesh,那个重复点的uv.x怎么赋值呢?给0或者1都不对啊……
大大,能不能直接把网格mesh的线显示出来而不显示面呢?
找到解决问题的办法了,stripping Level 处 改喂 strip byte code 即可
还想这样改了以后还是没法通过。
你好 , 我也遇到了这个 打包ios时出错的问题,不知道你 有没有解决????
biggest trucks…
[…]that may be the finish of this article. Here you?ll locate some web pages that we think you will value, just click the hyperlinks over[…]…
错误:Assets/Main.cs(20,17): error CS0103: The name `lineRenderer’ does not exist in the current context 代码 LineRenderGameObject =GameObject.Find(“linem”); 这是为什么呢?
请老师帮忙解答一下 谢谢了
linerenderer,画多段线就会出现扭曲的情况,这是什么原因呢?
肿么绘制一个球体。。老师。
老师,这句我不太明白,mesh.uv = new Vector2[] {new Vector2(0, 0), new Vector2(0, 5), new Vector2(5, 5),new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 1)};,为什么是给第一个三角贴五个图,第二个三角贴一个图呢?
又百度了一下,明白了,实际上是前三个数组确定一个贴图的大小,用这个比例贴,三角形上只能贴一个图,后三个数组确定的是第二个三角的贴图比例,因为三点确定出的一个面很小,所以就能贴很多个了
我也纠结这个问题,看完你写的好像懂了,可是这不是成了第一个是一个贴图而第二个三角形成了多个贴图了么,和目的不一样
我已经用LineRenderer实现了在球面画线的功能,但是仍然存在问题,就是把画线的程序发布到ipad上,当手指在ipad上快速滑动时,画出的线是断断续续的。考虑用在中间补点的方法来解决,但是不知道怎么补,是不是归结为这样一个数学问题:已知球面两点,求过这两点的球面曲线方程,然后取值区间,为已知两点的xy值?唉,不知道怎么算,请大神指教一下吧
补充上面的问题,我用Vectrosity插件实现了在游戏对象上画线,但是打包成ios时,出错,Cross compilation job Assembly-UnityScript.dll failed.原因不明。所以考虑用LineRenderer画吧,结果发现它只能画到场景中,不能画到游戏对象上,请教大神还有什么方法可以实现啊?
这个LineRenderer只能把线画在场景中,如果我想把线画到游戏对象上怎么办?
粒子可以做到渲染的效果嗎? 粒子可以偵測到碰撞嗎? 那如果是想要原本顏色是紅色 當藍色碰到他時會慢慢變成藍色 可以做到這樣效果嗎?
請問如果想用兩個2d的物件做出染色的效果因該要怎麼做? 例如 我現在有個紅色的物體 她和另一個藍色物體 碰在一起的接縫處 會出現染色的效果
每次看完都受益匪浅
建议你在看看 后面写的一篇 根据动态的两个轨迹点绘制面
好的,我有个问题,unity可以实现给选中模型描边吗?就是将选中的模型加个轮廓
你是要2D的描边 还是3D的描边? 不过两者都可以做的。 做法有很多,线 面 粒子 效果可以实现。原理就是获取模型的宽与高等参数,就好计算他的显示区域 然后在它周围描边。。
是3D的,比如一个人物模型,我想应该至少知道他轮廓上的点,再绘制线才能实现,但是想要获得这些点,就一点思路都没有。
用下面的代码可以得到模型的整体的包围盒子区域
//得到模型原始高度
float size_y = collider.bounds.size.y;
//得到模型缩放比例
float scal_y = transform.localScale.y;
//它们的乘积就是高度
npcHeight = (size_y *scal_y) ;
但是我不是想对它的包围盒描边 我想对模型本身轮廓描边 这样子可以吗
那我就不太清楚了, 没有那样做过。我觉得如果这样的话 不如让美术做一个动画,我觉得你想实现的效果应该是鼠标放在人物身上 周围出现一些轮廓。
嗯,好的,还是非常感谢的,嘿嘿
不客气 如果你有好的办法自己解决了 还请告诉我一下 大家互相学习 互相进步