[饥荒独立游戏制作] 4-7.随机数种子及Mesh地面的绘制
伪随机与随机数种子因为计算机中的随机是伪随机(体现在多次生成n个数,每次结果都一样),随机一般要基于一些外部的输入,常见的就是根据当前时间,但是我们也可以设置基于什么条件,这个条件就是种子。//C#随机数种子System.Random rand = new System.Random(,);//Unity随机数种子Random.InitState(1);print(Random.value...
·
伪随机与随机数种子
因为计算机中的随机是伪随机(体现在多次生成n个数,每次结果都一样),随机一般要基于一些外部的输入,常见的就是根据当前时间,但是我们也可以设置基于什么条件,这个条件就是种子。
//C#随机数种子
System
.
Random
rand
=
new
System
.
Random
(
,
)
;
//Unity随机数种子
Random
.
InitState
(
1
)
;
print
(
Random
.
value
)
;
添加随机数种子
在生成的坐标中添加Unity随机数种子(伪随机,随机数种子一样,每次生成的地图都一样,因此可以进行存档)。
Random
.
InitState
(
randomSeed
)
;
float
randomX
=
Random
.
Range
(
0
,
10000
)
;
float
randomZ
=
Random
.
Range
(
0
,
10000
)
;
float
y
=
Mathf
.
PerlinNoise
(
x
*
lacunarity
+
randomX
,
z
*
lacunarity
+
randomZ
)
*
tileHeightMultiply
;
项目准备
引入程序框架
导入UnityPackage或者直接将框架文件夹拖入Assets下即可。 源代码链接
程序集定义
框架部分的代码已经确定,通常情况下不希望重新编译,通过额外设定程序集与CSharp做分离,在框架根目录下新建一个Assembly Definition即可。

实时绘制一个Mesh作为地面
Panel
Unity自带的Panel作为地面存在问题:
-
顶点数量较多
-
UV信息导致贴图角度不对(z轴反了) 因此需要自己绘制一个矩形作为地面。
绘制三角网格和矩形
[
Button
(
"生成地图"
)
]
public
void
GenerateMap
(
)
{
Mesh
mesh
=
new
Mesh
(
)
;
mesh
.
vertices
=
new
Vector3
[
]
{
new
Vector3
(
0
,
0
,
0
)
,
new
Vector3
(
0
,
1
,
0
)
,
new
Vector3
(
1
,
1
,
0
)
}
;
mesh
.
triangles
=
new
int
[
]
{
0
,
1
,
2
}
;
meshFilter
.
mesh
=
mesh
;
}
首先定义mesh中的顶点坐标,再定义顶点编号(绘制顺序),即可绘制(注意物体可见需要同时有meshRender和meshFilter两个组件),三个点一个三角面,两个三角面构成一个矩形。

对生成Mesh单独封装后绘制矩形地面。
public
MeshRenderer
meshRenderer
;
public
MeshFilter
meshFilter
;
public
int
mapWidth
;
public
int
mapHeight
;
/// <summary>
/// 生成地图
/// </summary>
[
Button
(
"生成地图"
)
]
public
void
GenerateMap
(
)
{
meshFilter
.
mesh
=
GenerateMapMesh
(
mapHeight
,
mapWidth
)
;
}
private
Mesh
GenerateMapMesh
(
int
height
,
int
width
)
{
Mesh
mesh
=
new
Mesh
(
)
;
mesh
.
vertices
=
new
Vector3
[
]
{
new
Vector3
(
0
,
0
,
0
)
,
new
Vector3
(
0
,
0
,
height
)
,
new
Vector3
(
width
,
0
,
height
)
,
new
Vector3
(
width
,
0
,
0
)
}
;
mesh
.
triangles
=
new
int
[
]
{
0
,
1
,
2
,
0
,
2
,
3
}
;
return
mesh
;
}
设置Mesh的UV
UV介绍
UV包含在Mesh中,将模型拍平成多个面。

对于矩形面片,UV和mesh一致(只有一个面)。
设置地形MeshUV
mesh
.
uv
=
new
Vector2
[
]
{
new
Vector3
(
0
,
0
)
,
new
Vector3
(
0
,
1
)
,
new
Vector3
(
1
,
1
)
,
new
Vector3
(
1
,
0
)
,
}
;
对于创建的Mesh,必须设置UV才能正确的显示贴图,四个点规定了vu的形状,贴图会对应自动缩放,生成的效果图片较暗,缺少光照信息。

mesh
.
RecalculateNormals
(
)
;
计算光照法线后。

更多推荐
所有评论(0)