文章目录

  • 前言
  • 一、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面板中的样子:

unity3d mesh生成骨骼_数组

首先,我们需要在游戏对象上添加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);
    }
}

三、效果

unity3d mesh生成骨骼_3d_02

四、总结

通过本教程,你学会了如何使用 C# 脚本在 Unity 中创建一个简单的立方体,并使用 MeshFilter 和 MeshRenderer 组件来渲染它。立方体的创建是理解网格基础知识的重要一步,希望本教程能够帮助你更深入地了解 Unity 中的网格操作。