unity編輯器拓展七——指令碼建立模型
阿新 • • 發佈:2019-02-08
描述:
其實這個教程到處都是,我真正想做的是把模型分成N個等分,實現動態載入。但是在網上搜索了很久,也沒有搜尋
到合適的方法,要麼就是不寫清楚,捨不得把程式碼全部放出來。要麼就是自帶地形的切割,最想要的是,t4m 刷完後直
接將模型分成N分,所以只能苦逼的從最mesh最基礎的開始學吧。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using System; public class CreatMesh : Editor { [MenuItem("tool/creatMesh")] static void CreaMesh() { creatVertAadTriangels(); } //建立頂點 三角面 static void creatVertAadTriangels() { /*mesh屬性 * 長寬 * 段數 */ Vector2 size = new Vector3(10, 10); //長寬(因為是平面,所以就xy了 不要高度了) Vector2 segment =new Vector2 (10,10);//xy段數 /*mesh組成部分 * 頂點 * uv * 三角形索引 * 法線 */ Vector3[] verters;//頂點陣列 Vector2[] uv;//uv陣列 int[] triangles; //三角形索引 //1.頂點陣列賦值 int countVert = Mathf.FloorToInt ((segment.x + 1) * (segment.y + 1)); //根據長寬計算出總的頂點數 轉換成int型別 float w = size.x / segment.x; //計算每一段的寬度 float h = size.y / segment.y; //計算每一段的長度 int index01 = 0; verters = new Vector3[countVert]; uv = new Vector2[countVert]; for (int i = 0; i < segment.y + 1; i++) { for (int j = 0; j < segment.x + 1; j++) { verters[index01] = new Vector3(j * w, 0, i * h); //建立每個點 (按照xy的段數距離)並且給頂點陣列賦值 float u = j / segment.x; //每個點在u上面的位置 float v = i / segment.y; //每個點在v上面的位置 uv[index01] = new Vector2(u, v); //將每個點的uv加到uv數組裡面 index01++; } } Vector2[] uv02 = new Vector2[] {new Vector2(0,0), new Vector2(0.5f, 0), new Vector2(1, 0), new Vector2(0, 1), new Vector2(0.5f, 1), new Vector2(1, 1), }; //3.三角形 int countVertTri = Mathf.FloorToInt ( segment.x * segment.y * 6); //三角形頂點總數:每1*1段有兩個三角形組成 兩個三角形有6個點(包含公用的兩個點),所有總點數 是段數*6 int index02 = 0; triangles = new int[countVertTri]; for (int i = 0; i < segment.y; i++) { for (int j = 0; j < segment.x; j++) { //順時針 int role = Mathf.FloorToInt (segment.x) + 1; //x方向頂點數 int self = j + (i * role); // i=0 j=0的時候 第0行第0個點 i=0 j=1的時候 第0行第1個點 int next = j + ((i + 1) * role); // i=0 j=0的時候 第1行第0個點 i=0 j=1的時候 第1行第1個點 //第一個正方形 //順時針 //第一個三角形 triangles[index02] = self; //i=0 j=0的時候 第0行0個點 triangles[index02 + 1] = next; //i=0 j=0的時候 第1行0個點 triangles[index02 + 2] = next + 1; //i=0 j=0的時候 第1行1個點 //第二個三角形 triangles[index02 + 3] = self; //i=0 j=0的時候 第0行0個點 triangles[index02 + 4] = next + 1; //i=0 j=0的時候 第1行1個點 triangles[index02 + 5] = self + 1; //i=0 j=0的時候 第0行1個點 //一次可以實現6個點的排序,兩個三角形 拼成一個正方形 //隨著j index的增加 繪製第一行的所有正方形 隨著i的增加 一行一行的向上繪製 index02 += 6; } } //渲染 //新建mesh,並對它的屬性賦值 Mesh me = new Mesh(); me.vertices = verters; //mesh頂點賦值 me.triangles = triangles; //mesh三角形索引賦值 me.uv = uv; me.RecalculateNormals(); //自動新增法線資訊 //新建材質球 Material ma = new Material(Shader.Find("Diffuse")); //新建模型,將mesh跟material給他賦值 GameObject m_gameObject = new GameObject("m_newOBJ");//新建一個gameobject m_gameObject.AddComponent<MeshFilter>().sharedMesh = me; //增加meshFilter元件 m_gameObject.AddComponent<MeshRenderer>().sharedMaterial = ma;//增加MeshRenderer元件 } }