文章目录
- 前言
- 一、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 中的网格操作。