在本教程,我们将用单一的网格创建圆形立方体。

遵循程序网格。是为Unity 5.0.1及以上版本制作的。

各种形状的圆形立方体

合成一个立方体

在解决了二维网格之后,下一步骤是生成三维结构。

来看看一个立方体。从概念上讲,它由六个2D面组成,这些面的位置和旋转使它们包围了一个3D体积。可以用网格的六个实例来完成这个任务。

网格位于XY平面内,面向负Z方向。这就是立方体的-Z面。可以通过复制它来创建+Z面,把它的Y旋转设置为180°,然后重新定位,使两个面都对齐。

-X和+X面的创建方法相同,但Y旋转为90°和270°。如果想的话,也可以给这些面一个不同于Z面的X尺寸,但它们的Y尺寸必须匹配。这四个面必须对齐,以便它们形成一个封闭的环。

-Y和+Y面的X旋转角度为270°和90°。它们的X尺寸应该与Z面的尺寸一致,它们的Y尺寸应该与X面的X尺寸一致。

现在有由六个独立网格组成的立方体。虽然看起来没问题,但并不是很实用。可以通过Mesh.CombineMeshes来组合这些网格,但不妨一次性创建整个立方体。

创建立方体的顶点

为了创建自己的立方体,需要创建一个新的组件脚本。

让我们通过之前教程中的一些代码来引导它。现在唯一的新东西是第三维,所以必须添加zSize。使用一个循环程序和小工具来帮助可视化正在发生的事情。

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class Cube : MonoBehaviour {

	public int xSize, ySize, zSize;

	private Mesh mesh;
	private Vector3[] vertices;

	private void Awake () {
		StartCoroutine(Generate());
	}

	private IEnumerator Generate () {
		GetComponent<MeshFilter>().mesh = mesh = new Mesh();
		mesh.name = "Procedural Cube";
		WaitForSeconds wait = new WaitForSeconds(0.05f);

		yield return wait;
	}

	private void OnDrawGizmos () {
		if (vertices == null) {
			return;
		}
		Gizmos.color = Color.black;
		for (int i = 0; i < vertices.Length; i++) {
			Gizmos.DrawSphere(vertices[i], 0.1f);
		}
	}
}

现在可以在场景中添加一个新的游戏对象,通过添加这个组件把它变成一个立方体。或者替换一个现有对象的网格组件。

在增加立方体顶点之前,首先要知道有多少个顶点。我们已经知道一个面所需的顶点数量。

(#x+1)(#y+1)

把这六个面加在一起,得到总数。

2((#x+1)(#y+1)+(#x+1)(#z+1)+(#y+1)(#z+1))

然而,由于面边缘相互接触,顶点会重叠,导致顶点的重复。立方体的每个角的顶点都是三倍,而其边缘的顶点都是2倍。

剩下的请跳转原文。