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