Mesh概念:Mesh是Unity中的一個組件,稱為網格組件。通俗的講,Mesh是指模型的網格,3D模型是由多邊形拼接而成,而多邊形實際上是由多個三角形拼接而成的。所以一個3D模型的表面其實是由多個彼此相連的三角面構成。三維空間中,構成這些三角形的點和邊的集合就是Mesh。
Mesh組成:
1、頂點坐標數組vertexes
2、頂點在uv坐標系中的位置信息數組uvs
3、三角形頂點順時針或者逆時針索引數組triangles
4、MeshFiler組件,用於增加mesh屬性
5、MeshRender組件,增加材質並渲染出來。
6、可能還需要每個頂點的法線的數組normals

using UnityEngine; using UnityEditor; using System.Collections; public class GenMesh { [MenuItem("GameEditor/scene/Weather/GenMesh")] static public void GenMeshM() { Mesh m1 = CreateRect(); AssetDatabase.CreateAsset(m1, "Assets/_Resource/model/prefab/weather/m1.asset"); } public static Mesh CreateRect() { Mesh mesh = new Mesh(); int particleNum = 10; //頂點坐標 Vector3[] verts = new Vector3[4 * particleNum]; //uv坐標 Vector2[] uvs = new Vector2[4 * particleNum]; //三角形索引 int[] tris = new int[2 * 3 * particleNum]; Vector3 position; for (int i = 0; i < particleNum; i++) { int i4 = i * 4; int i6 = i * 6; position.x = 5 * i; position.y = 5 * i; position.z = 0; //頂點坐標 verts[i4 + 0] = position; verts[i4 + 1] = position + new Vector3(2, 0, 0); verts[i4 + 2] = position + new Vector3(2, 2, 0); verts[i4 + 3] = position + new Vector3(0, 2, 0); //四個頂點在UV坐標系中的位置 uvs[i4 + 0] = new Vector2(0.0f, 0.0f); uvs[i4 + 1] = new Vector2(1.0f, 0.0f); uvs[i4 + 2] = new Vector2(1.0f, 1.0f); uvs[i4 + 3] = new Vector2(0.0f, 1.0f); //順時針繪制三角形0 1 2 / 0 2 3 tris[i6 + 0] = i4 + 0; tris[i6 + 1] = i4 + 1; tris[i6 + 2] = i4 + 2; tris[i6 + 3] = i4 + 0; tris[i6 + 4] = i4 + 2; tris[i6 + 5] = i4 + 3; } mesh.vertices = verts; mesh.triangles = tris; mesh.uv = uvs; mesh.RecalculateBounds(); return mesh; } public static Mesh CreateCircle() { Mesh mesh = new Mesh(); int particleNum = 10; Vector3[] verts = new Vector3[4 * particleNum]; Vector2[] uvs = new Vector2[4 * particleNum]; int[] tris = new int[2 * 3 * particleNum]; Vector3 position; for (int i = 0; i < particleNum; i++) { int i4 = i * 4; int i6 = i * 6; position.x = 5 * i; position.y = 5 * i; position.z = 0; verts[i4 + 0] = position; verts[i4 + 1] = position + new Vector3(2, 0, 0); verts[i4 + 2] = position + new Vector3(2, 2, 0); verts[i4 + 3] = position + new Vector3(0, 2, 0); uvs[i4 + 0] = new Vector2(0.0f, 0.0f); uvs[i4 + 1] = new Vector2(1.0f, 0.0f); uvs[i4 + 2] = new Vector2(1.0f, 1.0f); uvs[i4 + 3] = new Vector2(0.0f, 1.0f); //順時針繪制三角形0 1 2 / 0 2 3 tris[i6 + 0] = i4 + 0; tris[i6 + 1] = i4 + 1; tris[i6 + 2] = i4 + 2; tris[i6 + 3] = i4 + 0; tris[i6 + 4] = i4 + 2; tris[i6 + 5] = i4 + 3; } mesh.vertices = verts; mesh.triangles = tris; mesh.uv = uvs; mesh.RecalculateBounds(); return mesh; } }
代碼示例生成的mesh是這個樣子,未添加MeshRender,即沒有材質和渲染的情況:
添加MeshRender,即有材質和渲染的情況:

using UnityEngine; using System.Collections; /*僅僅創建Mesh * * */ public class CreatMesh : MonoBehaviour { private GameObject mMesh; private Material mMaterial; /* Mesh屬性 * 長寬 * 段數 * 高度 * 高度差 */ private Vector2 size;//長度和寬度 private float minHeight = -10;//最小高度 private float maxHeight = 10;//最大高度 private Vector2 segment;//長度的段數和寬度的段數 private float unitH;//最小高度和最大高度只差,值為正 /* 頂點屬性 * 頂點 * uv * 三角形 */ private Vector3[] vertexes;//頂點數 private Vector2 uvs;//uvs坐標 private int[] triangles;//三角形索引 void Start() { creatMesh(100, 100, 3, 3, -10, 10); } private void creatMesh(float width, float height, uint segmentX, uint segmentY, int min, int max) { size = new Vector2(width, height); maxHeight = max; minHeight = min; unitH = maxHeight - minHeight; segment = new Vector2(segmentX, segmentY); if (mMesh != null) { Destroy(mMesh); } mMesh = new GameObject(); mMesh.name = "CreateMesh"; computeVertexes(); DrawMesh(); } private void computeVertexes() { int sum = Mathf.FloorToInt((segment.x + 1) * (segment.y + 1));//頂點總數 float w = size.x / segment.x;//每一段的長度 float h = size.y / segment.y; GetTriangles(); int index = 0; vertexes = new Vector3[sum]; for (int i = 0; i < segment.y + 1; i++) { for (int j = 0; j < segment.x + 1; j++) { float tempHeight = 0; vertexes[index] = new Vector3(j * w, 0, i * h); index++; } } } private void DrawMesh() { Mesh mesh = mMesh.AddComponent<MeshFilter>().mesh;//網格 mMesh.AddComponent<MeshRenderer>();//網格渲染器 mMaterial = new Material(Shader.Find("Diffuse"));//材質 mMesh.GetComponent<Renderer>().material = mMaterial; /*設置mesh*/ mesh.Clear();//更新 mesh.vertices = vertexes; //mesh.uv mesh.triangles = triangles; mesh.RecalculateNormals(); mesh.RecalculateBounds(); } private int[] GetTriangles() { int sum = Mathf.FloorToInt(segment.x * segment.y * 6);//三角形頂點總數 triangles = new int[sum]; uint index = 0; for (int i = 0; i < segment.y; i++) { for (int j = 0; j < segment.x; j++) { int role = Mathf.FloorToInt(segment.x) + 1; int self = j + (i * role); int next = j + ((i + 1) * role); //順時針 triangles[index] = self; triangles[index + 1] = next + 1; triangles[index + 2] = self + 1; triangles[index + 3] = self; triangles[index + 4] = next; triangles[index + 5] = next + 1; index += 6; } } return triangles; } }