在 Unity 中,所有幾何體最終都由 Mesh 組成。要自定義網格數據,必須先實例化一個 Mesh 對象,再為其屬性賦值。
using UnityEngine;
public class ProceduralMesh : MonoBehaviour {
void Start() {
// 1. 創建 Mesh 實例
Mesh mesh = new Mesh();
mesh.name = "CustomMesh";
// 2. 定義頂點位置(必須)
Vector3[] vertices = new Vector3[] {
new Vector3(0, 0, 0),
new Vector3(1, 0, 0),
new Vector3(0, 1, 0),
new Vector3(1, 1, 0)
};
mesh.vertices = vertices;
// 3. 定義三角形索引(必須,決定渲染順序)
int[] triangles = new int[] { 0, 2, 1, 2, 3, 1 }; // 兩個三角形組成一個四邊形
mesh.triangles = triangles;
// 4. 定義法線(可選,影響光照)
Vector3[] normals = new Vector3[vertices.Length];
for (int i = 0; i < normals.Length; i++) normals[i] = Vector3.back; // 面向 -Z
mesh.normals = normals;
// 5. 定義 UV 坐標(可選,用於貼圖)
Vector2[] uv = new Vector2[] {
new Vector2(0, 0), new Vector2(1, 0),
new Vector2(0, 1), new Vector2(1, 1)
};
mesh.uv = uv;
// 6. 重新計算邊界、切線等(可選但推薦)
mesh.RecalculateBounds();
mesh.RecalculateTangents();
// 7. 掛載到 MeshFilter
GetComponent<MeshFilter>().mesh = mesh;
}
}
vertices,再設 triangles,否則索引越界。vertices.Length。mesh.RecalculateNormals() 自動生成。mesh.UploadMeshData(false) 提交到 GPU。

對於大規模網格構建,推薦使用 Mesh.MeshDataArray 配合 Job System 與 Burst Compiler,實現多線程離線構建,大幅提升性能。