要动态生成平面网格,需要使用Unity3D中的Mesh类。下面是完整攻略:
步骤一:创建一个空物体
在Unity3D工程中,创建一个空物体,这将作为生成的平面网格的父物体。
步骤二:创建一个空的Mesh
使用Unity3D中的Mesh类来创建一个Mesh实例。这个Mesh实例将被用来存储我们动态生成的网格。
Mesh mesh = new Mesh();
步骤三:生成顶点位置
要生成平面网格,需要确定每个顶点的位置。在这个例子中,我们生成一个10×10大小的平面。
Vector3[] vertices = new Vector3[100];
for(int i = 0; i < 10; i++){
for(int j = 0; j < 10; j++){
vertices[i * 10 + j] = new Vector3(i, 0, j);
}
}
mesh.vertices = vertices;
这里我们使用了一个二重循环,生成了一个从(0,0,0)到(9,0,9)的平面。每个顶点的位置是Vector3对象,所以我们将所有顶点的位置存储在一个长度为100的数组vertices[]中,并将这个数组赋值给我们新创建的Mesh实例的vertices属性。
步骤四:生成三角形索引列表
将平面网格划分为三角形,需要一个三角形索引列表来连接各个顶点。在这个例子中,我们生成一个简单的三角网格。
int[] triangles = new int[96];
for(int i = 0; i < 9; i++){
for(int j = 0; j < 9; j++){
int index = i * 10 + j;
int triangleIndex = i * 18 + j * 6;
triangles[triangleIndex] = index;
triangles[triangleIndex + 1] = index + 10;
triangles[triangleIndex + 2] = index + 1;
triangles[triangleIndex + 3] = index + 1;
triangles[triangleIndex + 4] = index + 10;
triangles[triangleIndex + 5] = index + 11;
}
}
mesh.triangles = triangles;
这里,我们使用了一个二重循环,生成一个简单的三角网格。每个三角形由三个顶点来定义,因此,我们需要18个索引来定义每个三角形。将所有的索引存储在一个长度为96的数组triangles[]中,将其赋值给我们的Mesh实例的triangles属性。
步骤五:生成UV纹理坐标
在平面网格上贴上纹理,需要给每个顶点赋予对应的UV坐标。在这个例子中,我们将正方形的纹理图案应用到这个平面上,每个顶点的UV坐标都相同。
Vector2[] uv = new Vector2[100];
for(int i = 0; i < 10; i++){
for(int j = 0; j < 10; j++){
uv[i * 10 + j] = new Vector2((float)i / 9, (float)j / 9);
}
}
mesh.uv = uv;
使用一个二重循环,将长度为100的数组uv[]初始化。给每个顶点分配UV坐标。
步骤六:生成网格法线
为了添加光照和阴影效果,需要计算每个三角形的法线。Unity3D中的Mesh类已经提供了计算法线的函数。
mesh.RecalculateNormals();
步骤七:将网格附加到空物体上
现在,我们已经完成了网格的生成。最后一步是将这个网格附加到我们在第一步中创建的空物体上。
GameObject plane = new GameObject("Plane");
MeshFilter filter = plane.AddComponent<MeshFilter>();
filter.mesh = mesh;
MeshRenderer renderer = plane.AddComponent<MeshRenderer>();
这里,我们将在前面创建的新物体上添加组件。首先,我们将一个MeshFilter组件添加到新物体上,然后将我们计算出的Mesh实例附加给它。接下来,我们添加一个MeshRenderer组件,使新物体能够渲染我们的网格。
示例一:
使用这个方法,我们可以创建各种不同形状、大小、材料的平面。例如,以下代码将生成一个矩形形状的平面,并将它附加到Scene视图的(0,0,0)处:
Mesh mesh = new Mesh();
Vector3[] vertices = new Vector3[4];
vertices[0] = new Vector3(-1, 0, -1);
vertices[1] = new Vector3(1, 0, -1);
vertices[2] = new Vector3(-1, 0, 1);
vertices[3] = new Vector3(1, 0, 1);
mesh.vertices = vertices;
int[] triangles = new int[]{0, 2, 1, 2, 3, 1};
mesh.triangles = triangles;
Vector2[] uv = new Vector2[]{
new Vector2(0, 0),
new Vector2(1, 0),
new Vector2(0, 1),
new Vector2(1, 1)
};
Vector3[] normals = new Vector3[]{
Vector3.up, Vector3.up, Vector3.up, Vector3.up
};
mesh.uv = uv;
mesh.normals = normals;
GameObject plane = new GameObject("Plane");
MeshFilter filter = plane.AddComponent<MeshFilter>();
filter.mesh = mesh;
MeshRenderer renderer = plane.AddComponent<MeshRenderer>();
示例二:
我们可以通过在上面代码中加入一些随机图案的UV纹理坐标,创建一个很有趣的平面,例如:
Mesh mesh = new Mesh();
Vector3[] vertices = new Vector3[4];
vertices[0] = new Vector3(-1, 0, -1);
vertices[1] = new Vector3(1, 0, -1);
vertices[2] = new Vector3(-1, 0, 1);
vertices[3] = new Vector3(1, 0, 1);
mesh.vertices = vertices;
int[] triangles = new int[]{0, 2, 1, 2, 3, 1};
mesh.triangles = triangles;
Vector2[] uv = new Vector2[]{
new Vector2(Random.value, Random.value),
new Vector2(Random.value, Random.value),
new Vector2(Random.value, Random.value),
new Vector2(Random.value, Random.value)
};
Vector3[] normals = new Vector3[]{
Vector3.up, Vector3.up, Vector3.up, Vector3.up
};
mesh.uv = uv;
mesh.normals = normals;
GameObject plane = new GameObject("Plane");
MeshFilter filter = plane.AddComponent<MeshFilter>();
filter.mesh = mesh;
MeshRenderer renderer = plane.AddComponent<MeshRenderer>();
以上便是生成平面网格的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Unity3D动态生成平面网格 - Python技术站