Unity3d Mesh篇(三)— 创建立方体

文章目录

  • 前言
  • 一、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 中的网格操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/498807.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开启你的闲鱼探索之旅!利用商品详情关键词API,找到独一无二的宝藏商品

闲鱼是中国最大二手交易平台之一&#xff0c;拥有数亿用户。每天都有大量的宝贝被上架&#xff0c;有些宝贝非常独特&#xff0c;只有一两个被发布。如何找到这些独一无二的宝藏商品呢&#xff1f;幸运的是&#xff0c;我们可以利用联讯数据商品详情关键词API来实现这个目标。 …

普通索引和唯一索引详解

前言 面试的时候有时会问面试者&#xff0c;普通索引和唯一索引有什么区别。很多人&#xff0c;甚至工作很多年的工程师回答的千篇一律 “普通索引可以有重复的值&#xff0c;唯一索引不能有重复的值”。于是我又问&#xff0c;这两个索引这两个索引效率哪个高&#xff0c;很少…

【Vue】插槽-slot

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Vue ⛺️稳中求进&#xff0c;晒太阳 插槽 作用&#xff1a;让组件内部一些 结构 支持 自定义 插槽的分类&#xff1a; 默认插槽。具名插槽。 基础语法 组件内需要定制的结构部分&…

AI:145-智能监控系统下的行人安全预警与法律合规分析

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

Python算法100例-2.10 马克思手稿中的数学题

完整源代码项目地址&#xff0c;关注博主私信源代码后可获取 1.问题描述2.问题分析3.算法设计4.确定程序框架5.完整的程序6.运行结果 1&#xff0e;问题描述 马克思手稿中有一道趣味数学问题&#xff1a;有30个人&#xff0c;其中有男人、女人和小孩&#xff0c;他们在同一家…

安装DGL注意事项

安装DGL注意事项 一、首先得确定自己电脑或者服务器环境安装的 python 和 cuda 版本是多少&#xff0c;然后选择对应的dgl进行安装&#xff0c;而不是直接使用下面的代码直接进行安装&#xff0c;否则会报错。 pip install dgl # 这种直接安装方式不妥DGL backend not select…

【Activiti7系列】Activi7简介和基于Spring Boot整合Activiti7(流程设计器)

本文将介绍Activiti7基础概念及基于Spring Boot整合Activiti7(流程设计器)的具体步骤。 作者&#xff1a;后端小肥肠 1. 前言 在企业级应用中&#xff0c;业务流程的管理和执行是至关重要的一环。Activiti7是一个强大的开源工作流引擎&#xff0c;它提供了灵活的流程定义、任务…

C++初阶:模版相关知识的进阶内容(非类型模板参数、类模板的特化、模板的分离编译)

结束了常用容器的介绍&#xff0c;今天继续模版内容的讲解&#xff1a; 文章目录 1.非类型模版参数2.模板的特化2.1模版特化引入和概念2.2函数模版特化2.3类模板特化2.3.1全特化2.3.1偏特化 3. 模板分离编译3.1分离编译概念3.2**模板的分离编译**分析原因 1.非类型模版参数 模板…

深入理解Linux线程(LWP):概念、结构与实现机制(1)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;会いたい—Naomile 1:12━━━━━━️&#x1f49f;──────── 4:59 &#x1f504; ◀️ ⏸ ▶️ ☰ &a…

日志项目2

【C - 基于多设计模式下的同步&异步日志系统】 文章目录 【C - 基于多设计模式下的同步&异步日志系统】项目开发7. 日志系统框架设计7.1 模块划分7.2 模块关系图 8. 代码设计8.1 实用类设计8.2 日志等级类设计8.3 日志消息类设计8.4 日志输出格式化类设计8.5 日志落地(…

【前端素材】推荐优质在线手表商城电商网页 WristArc平台模板(附源码)

一、需求分析 1、系统定义 在线服饰购物商城是指一个通过互联网提供服装和配饰购买服务的电子商务平台。这类商城通常提供一个网站或移动应用程序&#xff0c;让顾客可以浏览、选择和购买各种类型的服装、鞋帽、包包、配饰等时尚商品。 2、功能需求 在线手表商城是指一个通…

【前端素材】推荐优质在线高端蜂蜜商城电商网页Beejar平台模板(附源码)

一、需求分析 1、系统定义 在线礼品商城平台是一种通过互联网提供礼品购买服务的电子商务平台。这类平台通常为消费者和商家提供一个交易和互动的虚拟空间&#xff0c;使用户可以浏览、选择和购买各种礼品产品。 2、功能需求 在线礼品商城平台是一种通过互联网提供礼品购买…