為了方便把這些cube放到了一個空的父物體下(這里就不再用圖片展示了)
這個代碼就是把獲取所有的cube的position存到了一個列表中
void DrawMesh(Vector3[] vec)
{
//創建一個空的gameObject 這里我的名字就叫做box
GameObject box = new GameObject("Box");
//為其添加MeshFilter、MehsRenderer 它獲取mesh資源,運用MeshRenderer渲染到屏幕上
box.AddComponent<MeshFilter>();
box.AddComponent<MeshRenderer>();
Mesh mesh = new Mesh();
//將這些cube的position存到了一個數組中
Vector3[] top_Vec = vec;
List<int> top_list = new List<int>();
for (int i = 0; i < top_Vec.Length - 1; i++)
{
//通過不同的三個頂點為網格創建三角形,網格是由多個三角形構成的一個面,構成三角形的個數為(n-2)個(注:注意這個小練習的頂點有5個但實際上是由3個三角形拼成的,但是top_list中有4組信息,但我們可以將這個列表計算一下
0,1,4 1,2,3 2,3,2 3,4,1 這四組單2,3,2 這一組其實是一條線並非一個三角形)
top_list.Add(i);
top_list.Add(i + 1);
top_list.Add(top_Vec.Length - i - 1);
}
//儲存定點信息
mesh.vertices = top_Vec;
//將遍歷三角形的頂點順序儲存到列表中並轉化成數組, 我認為它會自動解析這個數組(以每三個點進行解析吧)
mesh.triangles = top_list.ToArray();
//重新計算法線、uv
mesh.RecalculateBounds();
mesh.RecalculateNormals();
box.GetComponent<MeshFilter>().mesh = mesh;
//這里的材質是我自己設置的
box.GetComponent<MeshRenderer>().material = material;
注意:1.想要構成一個面這些點必須按照順序擺放,如果不按順序會構不成一個面或者其中某幾個點構成一個面(說白了就是缺少三角形)
2.這些點建議按順時針擺放,因為生成的mesh渲染的時候是單面材質在正面可以看到渲染而背面卻看不到,如果不小心按逆時針擺放的話把shader -> Nature->SpeedTree cill選擇off 修改材質的shader就可以看到了(原因我還沒搞懂)
效果如圖