https://catlikecoding.com/unity/tutorials/rounded-cube/
在本教程,我们将用单一的网格创建圆形立方体。
遵循程序网格。是为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);
}
}
}
现在可以在场景中添加一个新的游戏对象,通过添加这个组件把它变成一个立方体。或者替换一个现有对象的网格组件。
在增加立方体顶点之前,首先要知道有多少个顶点。我们已经知道一个面所需的顶点数量。
katex(#y+1)[/katex]
把这六个面加在一起,得到总数。
[katex]2((#x+1)(#y+1)+(#x+1)(#z+1)+(#y+1)(#z+1))[/katex]
然而,由于面边缘相互接触,顶点会重叠,导致顶点的重复。立方体的每个角的顶点都是三倍,而其边缘的顶点都是2倍。
剩下的请跳转原文。