Unity 自帶具備一個平面的原始對象,但一個簡單的平面在2D遊戲或GUI多是有用的,在任何狀況下做出一個好的開始例子。一個最小的平面包含四個頂點,界定兩個三角形的邊角。數組
第一件事就是設置頂點數組。咱們假設,這個平面在X和Y軸上(就是XOY平面),讓參數變量肯定其寬度和高度。咱們將按順序、左下角、右下角,左上角,右上角提供頂點。編輯器
var vertices: Vector3[] = new Vector3[4];函數
vertices[0] = new Vector3(0, 0, 0);
vertices[1] = new Vector3(width, 0, 0);
vertices[2] = new Vector3(0, height, 0);
vertices[3] = new Vector3(width, height, 0);spa
mesh.vertices = vertices;3d
(因爲網格數據屬性在場景後執行代碼,在本身的數組創建數據而後賦予屬性,更爲有效,而不是一個一個地訪問屬性數組元素)orm
接下來是三角形。由於咱們想要兩個三角形,每一個三角形由三個整數界定,三角形數組總共擁有六個元素。記住邊角順時針排序規則,左下角的三角形將使用0,2,1做爲索引,1,而右上角的用2,3,1。對象
var tri: int[] = new int[6];排序
// Lower left triangle.
tri[0] = 0;
tri[1] = 2;
tri[2] = 1;索引
// Upper right triangle.
tri[3] = 2;
tri[4] = 3;
tri[5] = 1;遊戲
mesh.triangles = tri;
具備頂點和三角形的網格,將在編輯器中可見,但好像沒什麼效果,由於它沒有法線,不能正確着色。平面上的法線是很簡單的 - 他們都是相同的,在平面的本地空間, 頂點指向Z軸負方向。添加了法線,平面能夠正確着色,但記住,你須要在場景添加一個燈光才能看到效果。
var normals: Vector3[] = new Vector3[4];
normals[0] = -Vector3.forward;
normals[1] = -Vector3.forward;
normals[2] = -Vector3.forward;
normals[3] = -Vector3.forward;
mesh.normals = normals;
最後,添加紋理座標網格使其可以正確顯示材質。假設咱們要顯示整個平面的圖像,UV值都會是0或1,對應到的紋理的邊角點。
var uv: Vector2[] = new Vector2[4];
uv[0] = new Vector2(0, 0);
uv[1] = new Vector2(1, 0);
uv[2] = new Vector2(0, 1);
uv[3] = new Vector2(1, 1);
mesh.uv = uv;
完整的腳本可能像這樣:
var width: float;
var height: float;
function Start() {
var mf: MeshFilter = GetComponent(MeshFilter);
var mesh = new Mesh();
mf.mesh = mesh;
var vertices: Vector3[] = new Vector3[4];
vertices[0] = new Vector3(0, 0, 0);
vertices[1] = new Vector3(width, 0, 0);
vertices[2] = new Vector3(0, height, 0);
vertices[3] = new Vector3(width, height, 0);
mesh.vertices = vertices;
var tri: int[] = new int[6];
tri[0] = 0;
tri[1] = 2;
tri[2] = 1;
tri[3] = 2;
tri[4] = 3;
tri[5] = 1;
mesh.triangles = tri;
var normals: Vector3[] = new Vector3[4];
normals[0] = -Vector3.forward;
normals[1] = -Vector3.forward;
normals[2] = -Vector3.forward;
normals[3] = -Vector3.forward;
mesh.normals = normals;
var uv: Vector2[] = new Vector2[4];
uv[0] = new Vector2(0, 0);
uv[1] = new Vector2(1, 0);
uv[2] = new Vector2(0, 1);
uv[3] = new Vector2(1, 1);
mesh.uv = uv;
}
請注意,若是執行的代碼是放在Start 函數裏執行一次,那麼網格在整個遊戲都不變。可是,您能夠很容易地把代碼放在Update函數裏,讓網格每一幀都發生改變(雖然這樣會大大增長CPU開銷)。