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开销)。

相关文章
相关标签/搜索