在Unity中動態創建Mesh-以Quad為例
在Unity中,Mesh不只是只能從3dsmax等建模軟體中導入,也可以使用腳本進行動態創建。那為什麼要動態創建Mesh呢?主要是因為其自由度,動態創建的Mesh我們可以自己去定義他生成時的屬性,不用被一開始匯入的模型所限制,例如創建一個弧形的話可以定義它與中心的距離與其弧長。再講動態創建Mesh之前,先來了解一下什麼是Mesh!
Mesh是Unity中的一個組件,也就是模型的網格,為物件外型的基本框架,一個模型是由多邊形拼接而成,而一個多邊形,其實是由多個三角面結合而成。在三維空間中,構成這些三角面的邊以及三角形的點的集合就是Mesh。
今天我們就來動態創建一個簡單的Quad作為示例,首先建立一個PrimitiveBase的父類。不管想要動態創建哪種形狀,一開始的初始化與最後的賦值都會交給它處理。
這個類一開始就聲明了一個3D物件必須要有的Mesh Renderer和Mesh Filter兩個組件。確保添加腳本時如果沒有這兩個組件會主動幫你添加。而ExecuteInEditMode則是能在Editor模式就讓腳本進行運作。
要創建一個Mesh必須要有三個陣列,分別為頂點陣列、三角形陣列與UV陣列。
(1)頂點座標陣列(Vertices):用於記錄Mesh中的頂點座標,是一個Vector3陣列。
(2)三角形陣列(Triangles):為頂點的陣列,每個三角形包含三個索引,是一個int的陣列。
(3)紋理座標陣列(UVs):定義了圖片上每個點的位置的資訊,以決定表面紋理的貼圖位置。為一個Vector2陣列。
再來就是創建子類QuadMesh繼承於PrimitiveBase,此類用來記錄該多邊形的屬性與計算各頂點座標的位置。
這邊要注意的是三角形索引陣列的順序, 三角形的渲染順序與三角形正面法線採左手螺旋定則,也就是說一個三角形要能被看到必須要以順時鐘的方向去定義且頂點座標與UV的順序也必須與其呼應(都是以0->1->2->3去賦值)。
把這個腳本掛在一個Empty GameObjectg上再賦予其長寬就可以動態創建出一個Quad了。
有了這些基礎就可以在上面加以發揮創意,添加材質與新的不同形狀的Mesh。
Reference:
https://docs.unity3d.com/ScriptReference/Mesh.html
https://www.youtube.com/watch?v=cKJ6dQfgcAU