转自:http://www.xuanyusong.com/archives/561
一眨眼学习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 使用世界坐标系
大家看看效果,清楚的可以看到曲线分为两部分,第一部分较短 第二部分较长。
C#
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
|
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(网格渲染器)属性,这样子就可以绘制网格面了。
C#
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
|
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愿和 大家好好学习,大家一起进步哈~!!!