unity3d 公告板

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開銷)。

相關文章
相關標籤/搜索