文章目录
- 前言
- 一、Mesh组成
- 二、使用步骤
- GetVertices方法
- GetTriangles方法
- OnDrawGizmos方法
- 三、效果
- 四、总结
前言
在 Unity 中,创建立方体是学习和理解网格(Mesh)基础知识的重要一步。本篇教程将介绍如何使用 C# 脚本在 Unity 中创建一个简单的立方体,并使用 MeshFilter 和 MeshRenderer 组件来渲染它。
一、Mesh组成
顶点(vertex):顶点是物体表面上的点,用 Vector3 类型表示它们在局部空间中的位置。
法线(normal):法线是顶点的方向,用 Vector3 类型表示它们在局部空间中的单位向量。
UV 坐标(uv):UV 坐标是顶点的纹理坐标,用 Vector2 类型表示它们在纹理图像中的位置。
三角形(triangle):三角形是物体表面上的面,用整数数组表示它们由哪些顶点组成。每个三角形由三个顶点索引构成,顶点索引是顶点数组中的位置。
二、使用步骤
首先,我们需要在 Unity 中创建一个空的 3D 项目。然后,我们需要在场景中添加一个空的游戏对象,我们可以把它命名为 “Triangle” ,这将是我们的网格生成器。为了让我们的网格能够显示在屏幕上,我们还需要给它添加一些组件,分别是:
MeshFilter:这个组件允许我们上传和存储我们的网格数据,以供 Unity 的图形 API 渲染。
MeshRenderer:这个组件负责渲染我们的网格,我们给它指定一个材质来改变网格的颜色和外观。
C# 脚本:这个组件是我们编写网格生成逻辑的地方,我们把它命名为 “Test”
下图是我们的游戏对象在inspector面板中的样子:
首先,我们需要在游戏对象上添加MeshFilter组件和MeshRenderer组件。这可以通过RequireComponent属性来实现,它会在挂载脚本的时候,自动添加指定的组件。
//挂载脚本的时候,自动添加下面的组件
[RequireComponent(typeof(MeshFilter)),RequireComponent(typeof(MeshRenderer))]
在Start方法中,我们首先创建了一个Mesh对象,并将其赋值给MeshFilter组件。然后,我们启动一个协程GeneratePlane()来生成平面。
private void Start()
{
_mesh = new Mesh();
GetComponent<MeshFilter>().mesh = _mesh;
_mesh.name = "Mesh03";
StartCoroutine(GeneratePlane());
}
这个协程用于生成立方体。首先调用 GetVertices 方法生成顶点,然后设置 Mesh 的顶点数组,接着调用 GetTriangles 方法生成三角形,最后设置 Mesh 的三角形数组。
private IEnumerator GenerateCube()
{
yield return GetVertices(Vector3.zero, 1f);
_mesh.vertices = _vertices;
yield return GetTriangles();
}
GetVertices方法
根据指定的中心点和立方体大小,生成立方体的顶点数组
private IEnumerator GetVertices(Vector3 center,float cubeSize)
{
_vertices = new Vector3[8];
// 清除网格的数据
_mesh.Clear();
// 计算正方形的四个顶点的坐标
float halfEdge = cubeSize / 2;
_vertices[0] = center + new Vector3(-halfEdge, -halfEdge, -halfEdge);
yield return new WaitForSeconds(0.2f);
_vertices[1] = center + new Vector3(halfEdge, -halfEdge, -halfEdge);
yield return new WaitForSeconds(0.2f);
_vertices[2] = center + new Vector3(-halfEdge, -halfEdge, halfEdge);
yield return new WaitForSeconds(0.2f);
_vertices[3] = center + new Vector3(halfEdge, -halfEdge, halfEdge);
yield return new WaitForSeconds(0.2f);
_vertices[4] = center + new Vector3(-halfEdge, halfEdge, -halfEdge);
yield return new WaitForSeconds(0.2f);
_vertices[5] = center + new Vector3(halfEdge, halfEdge, -halfEdge);
yield return new WaitForSeconds(0.2f);
_vertices[6] = center + new Vector3(-halfEdge, halfEdge, halfEdge);
yield return new WaitForSeconds(0.2f);
_vertices[7] = center + new Vector3(halfEdge, halfEdge, halfEdge);
}
GetTriangles方法
生成立方体的三角形数组,共 36 个三角形。
private IEnumerator GetTriangles() {
_triangles = new int[36];
_triangles[0] = 0;
_triangles[1] = 1;
_triangles[2] = 2;
_mesh.triangles = _triangles;
yield return new WaitForSeconds(0.2 f);
_triangles[3] = 1;
_triangles[4] = 3;
_triangles[5] = 2;
_mesh.triangles = _triangles;
yield return new WaitForSeconds(0.2 f);
_triangles[6] = 6;
_triangles[7] = 5;
_triangles[8] = 4;
_mesh.triangles = _triangles;
yield return new WaitForSeconds(0.2 f);
_triangles[9] = 6;
_triangles[10] = 7;
_triangles[11] = 5;
_mesh.triangles = _triangles;
yield return new WaitForSeconds(0.2 f);
_triangles[12] = 5;
_triangles[13] = 7;
_triangles[14] = 1;
_mesh.triangles = _triangles;
yield return new WaitForSeconds(0.2 f);
_triangles[15] = 7;
_triangles[16] = 3;
_triangles[17] = 1;
_mesh.triangles = _triangles;
yield return new WaitForSeconds(0.2 f);
_triangles[18] = 4;
_triangles[19] = 5;
_triangles[20] = 0;
_mesh.triangles = _triangles;
yield return new WaitForSeconds(0.2 f);
_triangles[21] = 5;
_triangles[22] = 1;
_triangles[23] = 0;
_mesh.triangles = _triangles;
yield return new WaitForSeconds(0.2 f);
_triangles[24] = 6;
_triangles[25] = 4;
_triangles[26] = 0;
_mesh.triangles = _triangles;
yield return new WaitForSeconds(0.2 f);
_triangles[27] = 0;
_triangles[28] = 2;
_triangles[29] = 6;
_mesh.triangles = _triangles;
yield return new WaitForSeconds(0.2 f);
_triangles[30] = 7;
_triangles[31] = 6;
_triangles[32] = 2;
_mesh.triangles = _triangles;
yield return new WaitForSeconds(0.2 f);
_triangles[33] = 3;
_triangles[34] = 7;
_triangles[35] = 2;
_mesh.triangles = _triangles;
yield return new WaitForSeconds(0.2 f);
}
OnDrawGizmos方法
用于在Scene视图中绘制顶点的辅助图形,方便调试和观察
private void OnDrawGizmos()
{
if (_vertices == null) return;
for (int i = 0; i < _vertices.Length; i++)
{
// 遍历所有顶点,绘制球形代表每个顶点
Gizmos.DrawSphere(_vertices[i], 0.2f);
}
}
三、效果
四、总结
通过本教程,你学会了如何使用 C# 脚本在 Unity 中创建一个简单的立方体,并使用 MeshFilter 和 MeshRenderer 组件来渲染它。立方体的创建是理解网格基础知识的重要一步,希望本教程能够帮助你更深入地了解 Unity 中的网格操作。