Unity通過指令碼建立Mesh(網格)
阿新 • • 發佈:2022-04-08
1.建立一個帶Mesh的物體
Unity中的網格作為元件不能脫離物體單獨存在
新建指令碼CreateMesh
public class CreateMesh: MonoBehaviour { void Start() { //該方法會新建一個名為Mesh的GameObject,該物體上包含一個 MeshFilter 和一個 MeshRenderer GameObject gameObject = new GameObject("Mesh", typeof(MeshFilter), typeof(MeshRenderer)); gameObject.transform.localScale = new Vector3(30, 30, 1);//放大一點,避免到時候看不見 } }
然後將指令碼搭載到場景中任意物體上
點選執行後場景出現名為Mesh的物體,包含MeshFilter
和 MeshRenderer
,也可自行新增元件
這裡Mesh Filter中的Mesh為None
因為我們還沒有建立Mesh
2.通過指令碼建立Mesh
Unity中Mesh由頂點、三角面和UV座標組成
如果我們建立一個正方形,需要先宣告相應陣列
修改Create Mesh
//public class CreateMesh: MonoBehaviour //{ // void Start() //{ Vector3[] vertices = new Vector3[0]; //宣告頂點陣列 Vector2[] uv = new Vector2[0]; //宣告uv向量 int[] triangles = new int[0]; //宣告三角形陣列 Mesh mesh = new Mesh(); //宣告網格 //對網格進行賦值引用 mesh.vertices = vertices; mesh.uv = uv; mesh.triangles = triangles; //GameObject gameObject = new GameObject("Mesh", typeof(MeshFilter), typeof(MeshRenderer)); //gameObject.transform.localScale = new Vector3(30, 30, 1); //將新建物體的 MeshFilter 設為新建的 網格(Mesh) gameObject.GetComponent<MeshFilter>().mesh = mesh; //} //}
這時執行後Mesh Filter 中 Mesh 不再是null,而是我們剛剛宣告的 網格,只是這個網格還沒有相應的資料
繼續修改CreateMesh
//public class GameHandler5 : MonoBehaviour //{ //這裡聲明瞭一個材質,給它賦值一個帶貼圖的材質,不用材質也行 public Material material; //void Start() //{ //這裡我們建立一個正方形網格,所以需要4個頂點、4個UV點和6條邊 Vector3[] vertices = new Vector3[4]; Vector2[] uv = new Vector2[4]; int[] triangles = new int[6]; //宣告頂點的位置 vertices[0] = new Vector3(0, 1); vertices[1] = new Vector3(1, 1); vertices[2] = new Vector3(0, 0); vertices[3] = new Vector3(1, 0); //宣告UV的位置 uv[0] = new Vector2(0, 1); uv[1] = new Vector2(1, 1); uv[2] = new Vector2(0, 0); uv[3] = new Vector2(1, 0); //宣告三角邊,這裡三角邊是根據上面的頂點來進行連線的,每三個頂點構成一個三角邊 //這裡後面的int型別引數對應 vertices[]陣列中的頂點 triangles[0] = 0; triangles[1] = 1; triangles[2] = 2; triangles[3] = 2; triangles[4] = 1; triangles[5] = 3; //Mesh mesh = new Mesh(); //將設定好的引數進行賦值 mesh.vertices = vertices; mesh.uv = uv; mesh.triangles = triangles; //GameObject gameObject = new GameObject("Mesh", typeof(MeshFilter), typeof(MeshRenderer)); //gameObject.transform.localScale = new Vector3(30, 30, 1); //gameObject.GetComponent<MeshFilter>().mesh = mesh; gameObject.GetComponent<MeshRenderer>().material = material; } }
這個正方形存在 4個頂點、分為兩個三角形共 6 條邊、和 4 頂點 UV
執行結果
圖片很暗是因為場景中沒有光照