首先介紹一下關於自定義Mesh多邊形所必須的組件:
1.Mesh Filter組件:用於Mesh網格搭建形成形狀樣子
2.Mesh Renderer組件:用於將搭建出來的形狀渲染出來,通俗來講就是給他皮膚,給他顏色等等
我們都知道各個圖形都是由很多個小的三角形組拼出來的,那么形成我們的Mesh所需要的條件就跟三角形有關
1.頂點坐標:一個Vector3[] 數組
2.指定三角形的頂點排序: 一個Int[] 數組
3.UV、法線、切線的重新制定:Unity內置方法已經寫好
這里通過一個例子說明一下Mesh繪制多邊形問題:
首先,在場景中我們新建一個Plane面,並設置其標簽Tag為“Ground”,用於我們手動取點檢測
然后,新建取點腳本“GetEnterPoints”,用於收集我們在Plane面上的點(掛掛載在場景中)
接下來,新建生成多邊形腳本“CreateMesh”,用於生成我們自定義的多邊形
最后,運行點擊進行測試
當然,腳本的類名根據需要自定義更改,下面附上代碼與效果圖
“GetEnterPoints”腳本:
1 using UnityEngine; 2 using System.Collections; 3 using System.Collections.Generic; 4 5 6 //獲取組成多變形點類 7 public class GetEnterPoints : MonoBehaviour 8 { 9 //存儲手動獲取到的多邊形點列表 10 private List<Vector3> m_enterPoints = new List<Vector3>(); 11 12 // Update is called once per frame 13 void Update () { 14 15 //左鍵取點 16 if (Input.GetMouseButtonDown(0)) 17 { 18 //屏幕位置轉射線 19 Ray tRay = Camera.main.ScreenPointToRay(Input.mousePosition); 20 //射線返回點信息 21 RaycastHit tHit; 22 //發射射線 23 if(Physics .Raycast( tRay ,out tHit )) 24 { 25 //如果打在地面上,則將點存儲起來 26 if (tHit.transform.tag == "Ground") 27 { 28 //這里為了形成的面不與原先底板重合,提升了一個高度 29 m_enterPoints.Add(tHit.point + new Vector3(0, 1, 0)); 30 } 31 } 32 } 33 34 //右鍵形成面 35 if (Input.GetMouseButtonDown(1)) 36 { 37 //形成面至少三點 38 if (m_enterPoints.Count > 2) 39 { 40 //調用形成多變形方法 41 CreateMesh tCreatMesh = new CreateMesh(); 42 tCreatMesh.DoCreatPloygonMesh(m_enterPoints.ToArray()); 43 44 //每次繪制完清空手動獲取的點列表 45 m_enterPoints.Clear(); 46 47 } 48 49 } 50 51 } 52 }
“CreateMesh”腳本:
1 using UnityEngine; 2 using System.Collections; 3 using System.Collections.Generic; 4 5 6 // 創建自定義Mesh類 7 public class CreateMesh : MonoBehaviour { 8 9 10 /// <summary> 11 /// 生成自定義多邊形方法 12 /// </summary> 13 /// <param name="s_Vertives">自定義的頂點數組</param> 14 public void DoCreatPloygonMesh(Vector3 []s_Vertives) 15 { 16 //新建一個空物體進行進行繪制自定義多邊形 17 GameObject tPolygon = new GameObject("tPolygon"); 18 19 //繪制所必須的兩個組件 20 tPolygon.AddComponent<MeshFilter>(); 21 tPolygon.AddComponent<MeshRenderer>(); 22 23 //新申請一個Mesh網格 24 Mesh tMesh = new Mesh(); 25 26 //存儲所有的頂點 27 Vector3[] tVertices = s_Vertives; 28 29 //存儲畫所有三角形的點排序 30 List<int> tTriangles = new List<int>(); 31 32 //根據所有頂點填充點排序 33 for (int i = 0; i < tVertices .Length -1; i++) 34 { 35 tTriangles.Add(i); 36 tTriangles.Add(i+1); 37 tTriangles.Add(tVertices .Length -i-1); 38 } 39 40 //賦值多邊形頂點 41 tMesh.vertices = tVertices; 42 43 //賦值三角形點排序 44 tMesh.triangles = tTriangles.ToArray(); 45 46 //重新設置UV,法線 47 tMesh.RecalculateBounds(); 48 tMesh.RecalculateNormals(); 49 50 //將繪制好的Mesh賦值 51 tPolygon.GetComponent<MeshFilter>().mesh = tMesh; 52 53 } 54 55 }
繪制前效果與繪制后效果:
當然,根據需要自定義取點(點數大於等於3),也可自定義添加材質達到美觀效果。