關於Unity底層Mesh網格繪制多邊形的實現


首先介紹一下關於自定義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),也可自定義添加材質達到美觀效果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM