返回介绍

示例 - 创建一个广告牌平面

发布于 2021-06-19 18:03:26 字数 2482 浏览 901 评论 0 收藏 0

Unity 自带一个平面 (Plane) 原始对象,但是更简单的平面在二维游戏或 GUI 中可能非常有用,在任何情况下可以做一个好的开始示例。一个最小平面包含四个顶点,界定两个三角形的边角。

第一件事是设置顶点数组。我们假设,该平面在 X 和 Y 轴上,让参数变量决定其宽度和高度。我们将按左下、右下、左上和右上的顺序提供 顶点。

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;

(由于网格 (Mesh) 数据属性在场景后面执行代码,在自己的数组中设置数据然后赋予属性,而不是逐一访问属性数组元素会更为有效。)

接下来是三角形。因为我们想要两个三角形,每个由三个整数界定,所以三角形数组总共拥有六个元素。请记住角的顺时针排序规则,左下角的三角形将使用 0、2、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 的开销)。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文