一眨眼学习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 使用世界坐标系
大家看看效果,清楚的可以看到曲线分为两部分,***部分较短 第二部分较长。
怎么样? 绘制线的方法不难学吧?在已知线段位置的情况下我们可以使用上面的方法去设置这条线,但是如果线段的位置是在游戏过程中动态的产生就得在代码中去动态的去设置。
创建脚本Main.cs 绑定到摄像头上,运行游戏绘制线的话须要在Main中去拿到line这个对象的实例。这就是一个比较重要的知识点了。
一些重要的方法,在编辑器中编辑的一些东西,在代码中也可以做到。
LineRenderer.SetWidth(0.1,0.1) ; 设置线段起始点与结束点的宽度 (参数1 为起始点 参数2为结束点)
LineRenderer.SetColor(Color.black,Color.white); 设置线段起始点与结束点的颜色 (参数1 为起始点颜色 参数2为结束点颜色)
LineRenderer.SetVertexCount(5); 设置线段数量。
LineRenderer.useWorldSpace = true; 是否使用世界坐标系,和上面编辑器对应。
[代码]c#/cpp/oc代码:
02 |
using System.Collections; |
03 |
using System.Threading; |
05 |
public class Main : MonoBehaviour { |
08 |
private GameObject LineRenderGameObject; |
11 |
private LineRenderer lineRenderer; |
13 |
//设置线段的个数,标示一个曲线由几条线段组成 |
14 |
private int lineLength = 4; |
16 |
//分别记录4个点,通过这4个三维世界中的点去连接一条线段 |
17 |
private Vector3 v0 = new Vector3(1.0f,0.0f,0.0f); |
18 |
private Vector3 v1 = new Vector3(0.0f,1.0f,0.0f); |
19 |
private Vector3 v2 = new Vector3(0.0f,0.0f,1.0f); |
20 |
private Vector3 v3 = new Vector3(1.0f,0.0f,0.0f); |
24 |
//通过之前创建的对象的名称,就可以在其它类中得到这个对象, |
25 |
//这里在main.cs中拿到line的对象 |
26 |
LineRenderGameObject = GameObject.Find ("line"); |
28 |
//通过游戏对象,GetComponent方法 传入LineRenderer |
29 |
//就是之前给line游戏对象添加的渲染器属性 |
31 |
lineRenderer = (LineRenderer)LineRenderGameObject.GetComponent ("LineRenderer"); |
33 |
//设置线段长度,这个数值须要和绘制线3D点的数量想等 |
35 |
lineRenderer.SetVertexCount(lineLength); |
50 |
lineRenderer.SetPosition (0, v0); |
51 |
lineRenderer.SetPosition (1, v1); |
52 |
lineRenderer.SetPosition (2, v2); |
53 |
lineRenderer.SetPosition (3, v3); |
通过上面代码的设置,运行游戏,发现全新的一个三角形曲线赫然的映入我们的眼帘,有了上面的方法我们就可以组合的绘制出各种各样的3D 游戏曲线了,这里MOMO使用的是颜色,大家也可以添加一个贴图~
绘制面的话~,因为3D世界中游戏面全都是用三角形来拼起来的(出于效率的考虑),所以大家所看到的面其实都是用三角面拼接起来的。那么下面我们看看在 Unity3D 中如何绘制三角形平面。先创建一个GameObject对象,我命名为face,然后给这个对象添加两个Mesh属性, 添加MeshFilter(网格过滤器)与mesh Renderer(网格渲染器)属性,这样子就可以绘制网格面了。
为了给网格面贴图,我给mesh Renderer 渲染器添加一个材质,贴上一张图片~ 在3D 的世界中两点可以确定一条线,那么三点就肯定能确定一个面,3D世界中的面一定是三角形拼凑组成,任何3D的面的所需要的坐标点的数量 一定是3的倍数。和绘制线一样,MOMO还是创建一个脚本绑定在摄像头中,然后去访问上面创建的face游戏对象 去渲染三角面~
[代码]c#/cpp/oc代码:
02 |
using System.Collections; |
04 |
public class Main : MonoBehaviour { |
07 |
// Update is called once per frame |
10 |
//通过object对象名 face 得到网格渲染器对象 |
11 |
MeshFilter meshFilter = (MeshFilter)GameObject.Find("face").GetComponent(typeof(MeshFilter)); |
14 |
Mesh mesh = meshFilter.mesh; |
16 |
//API中写的不是提清楚,我详细的在说一遍 |
19 |
//三个点确定一个面,所以Vector3数组的数量一定是3个倍数 |
21 |
//这里的数量为6 也就是我创建了2个三角面 |
23 |
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)}; |
25 |
//设置贴图点,因为面确定出来以后就是就是2D |
30 |
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)}; |
33 |
//设置三角形索引,这个索引是根据上面顶点坐标数组的索引 |
37 |
mesh.triangles= new int []{0,1,2,3,4,5}; |
Build and Run 运行效果后清楚的可以看到两个三角形。MOMO提醒大家 善用三角平面可以绘制出各种各样的游戏面出来噢~哇咔咔~