Unity 3D 建立Mesh(一)
阿新 • • 發佈:2019-02-06
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; } }