Unity-示例 - 創(chuàng)建四邊形
為了表示平面,Unity 包含了可以在場景中實例化的平面和四邊形原始游戲?qū)ο蟆5?,了解如何使用腳本來自行構(gòu)造四邊形網(wǎng)格很有用。這是進行程序化網(wǎng)格生成的基礎(chǔ)。
注意:Unity 會處理并顯示由三角形組成的幾何體,而不是由四邊形組成的幾何體。這意味著一個四邊形圖元包含兩個三角形。
頂點數(shù)組
首先需要設(shè)置形狀使用的頂點數(shù)組。
以下示例假定四邊形位于 x 軸和 y 軸上,并且腳本中包含變量 width 和 height。
此示例按以下順序提供頂點: 左下角、 右下角、 左上角、 右上角
由于 Unity 檢索網(wǎng)格數(shù)據(jù)屬性的方式,您在自己的數(shù)組中設(shè)置數(shù)據(jù)并隨后將該數(shù)組分配給屬性(例如,分配給?Mesh.vertices
?或?Mesh.normals
)的效率要高得多,而不要通過單個元素訪問屬性數(shù)組。
三角形
接下來需要設(shè)置三角形。一個四邊形由兩個三角形組成,每個三角形由先前創(chuàng)建的頂點數(shù)組中的三個點組成。要指定這些點,請將每個三角形定義為頂點數(shù)組的三個索引。例如,此四邊形的左下方三角形使用索引 0、2 和 1,對應(yīng)于頂點數(shù)組中的坐標(biāo) (0, 0, 0)、(0, height, 0) 和 (width, 0, 0)。順序很重要,因為必須按順時針對角進行排序。右上方的三角形使用索引 2、3 和 1。
法線
在場景中可以看到帶有頂點和三角形的網(wǎng)格,但是 Unity 尚未對網(wǎng)格正確著色,因為這個網(wǎng)格還沒有法線。此示例的法線很簡單,因為這些法線都是相同的。每條法線均指向四邊形本地空間中的負 z 軸方向。添加法線時,Unity 會正確對四邊形著色,但是您需要在場景中有光源才能看到效果。
如果不想自己定義法線,則可以使用?Mesh.RecalculateNormals()。
紋理坐標(biāo)
最后,要正確顯示網(wǎng)格的材質(zhì)上的紋理,請向網(wǎng)格添加紋理坐標(biāo)。紋理坐標(biāo)在 0 到 1 之間。網(wǎng)格中的每個頂點都有一個紋理坐標(biāo),用于指定材質(zhì)的紋理上要采樣的位置。要顯示四邊形上的整個紋理,每個頂點上的紋理坐標(biāo)值都應(yīng)全部為 0 或 1,以便四邊形的每個角都對應(yīng)于紋理的角。
最終的腳本
以下腳本結(jié)合了以上所有內(nèi)容,用于在場景中創(chuàng)建一個四邊形。要使用該腳本: 創(chuàng)建一個新的 C# 腳本(菜單:Assets > Create > C# Script),然后將其命名為 QuadCreator。 打開 QuadCreator 腳本,將示例代碼復(fù)制到其中,然后保存腳本。 回到 Editor 中,在場景中創(chuàng)建一個新的游戲?qū)ο螅ú藛危篏ameObject > Create Empty)。 在 Inspector 中,選擇 Add Component > Scripts > Quad Creator。 將游戲?qū)ο蠓胖迷趫鼍爸兴璧娜魏挝恢谩?進入運行模式。如果在 Scene 視圖或 Game 視圖中看不到該四邊形,請確保從正確的一側(cè)查看;Unity 不會渲染此網(wǎng)格的背面。
using UnityEngine;?
public class QuadCreator : MonoBehaviour
{
? ?
public float width = 1;
? ?
public float height = 1;
? ?
public void Start(){
? ? ? ?
MeshRenderer meshRenderer = gameObject.AddComponent<MeshRenderer>();
meshRenderer.sharedMaterial = new Material(Shader.Find("Standard"));
MeshFilter meshFilter = gameObject.AddComponent<MeshFilter>();
Mesh mesh = new Mesh();
Vector3[] vertices = new Vector3[4]{
new Vector3(0, 0, 0),
new Vector3(width, 0, 0),
new Vector3(0, height, 0),
new Vector3(width, height, 0)};
mesh.vertices = vertices;
int[] tris = new int[6]{
// 左下方三角形
0, 2, 1,
// 右上方三角形
2, 3, 1};
mesh.triangles = tris;
Vector3[] normals = new Vector3[4]{
-Vector3.forward,
-Vector3.forward,
-Vector3.forward,
-Vector3.forward};
mesh.normals = normals;
Vector2[] uv = new Vector2[4]{
new Vector2(0, 0),
new Vector2(1, 0),
new Vector2(0, 1),
new Vector2(1, 1)};
mesh.uv = uv;
meshFilter.mesh = mesh;
}}
注意:此示例代碼在 Start 函數(shù)中,這意味著會在您進入運行模式時執(zhí)行一次,并且網(wǎng)格在整個應(yīng)用程序中不會改變。但是,您可以在 Update 函數(shù)中添加代碼,以使網(wǎng)格在每一幀都更改。請注意,這會大大增加生成網(wǎng)格時消耗資源的強度。