Unity3d Mesh篇(三)

您所在的位置:网站首页 正方体快捷键是什么 Unity3d Mesh篇(三)

Unity3d Mesh篇(三)

2024-07-10 09:26| 来源: 网络整理| 查看: 265

文章目录 前言一、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().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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3