Unity3d Mesh篇(二)— 创建Unity Logo平面

news2024/9/21 11:04:40

文章目录

  • 前言
  • 一、Mesh组成
  • 二、使用步骤
      • GetVertices方法
      • GetNormal方法
      • GetTriangles方法
      • OnDrawGizmos方法
  • 三、效果
  • 四、总结


前言

本篇将使用C#脚本实现在Unity中创建平面,并通过调整顶点、UV坐标和三角形来生成Unity Logo 的效果。


一、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 = "Mesh02";
    StartCoroutine(GeneratePlane());
}

GeneratePlane协程用于生成平面。首先调用GetVertices()方法来生成顶点,然后设置Mesh的顶点、UV坐标和法线。接着调用GetTriangles()方法来生成三角形。

private IEnumerator GeneratePlane()
{
    yield return GetVertices();
    
    // 设置 _mesh 的顶点、UV 和法线
    _mesh.vertices = _vertices;
    _mesh.uv = _uv;
    _mesh.normals = _normal;
    yield return GetTriangles();
}

GetVertices方法

用于生成顶点。通过嵌套循环,在二维平面上生成一系列顶点,并计算UV坐标和法线。

private IEnumerator GetVertices()
{
    _vertices = new Vector3[(sequenceX + 1) * (sequenceY + 1)];
    _uv = new Vector2[_vertices.Length];
    _normal = new Vector3[_vertices.Length];
    int i = 0;
    for (int y = 0; y < sequenceY + 1; y++)
    {
        for (int x = 0; x < sequenceX + 1; x++)
        {
            _vertices[i] = new Vector3(x, y);
            _uv[i] = new Vector2((float)x / sequenceX, (float)y / sequenceY);
            _normal[i] = GetNormal(y);

            i++;
            yield return new WaitForSeconds(0.2f);
        }
    }
}

GetNormal方法

用于获取顶点的法线。这里简单地根据奇偶行返回不同的法线方向

private Vector3 GetNormal(int y)
{
    // 如果 y 是偶数,则返回向上的法线,否则返回向下的法线
    return y % 2 == 0 ? Vector3.up : Vector3.down;
}

GetTriangles方法

用于生成三角形。通过两层循环,计算每个矩形的两个三角形,并设置Mesh的三角形数组。

private IEnumerator GetTriangles()
{
    // 初始化三角形数组
    int[] triangles = new int[sequenceX * sequenceY * 6];
    int startIndex = 0;
    int trianglesIndex = 0;

    for (int y = 0; y < sequenceY; y++)
    {
        for (int x = 0; x < sequenceX; x++)
        {
            triangles[trianglesIndex] = startIndex;
            triangles[trianglesIndex + 1] = startIndex + sequenceX + 1;
            triangles[trianglesIndex + 2] = startIndex + 1;

            _mesh.triangles = triangles;
            yield return new WaitForSeconds(0.2f);
            triangles[trianglesIndex + 3] = startIndex + sequenceX + 1;
            triangles[trianglesIndex + 4] = startIndex + sequenceX + 2;
            triangles[trianglesIndex + 5] = startIndex + 1;

            startIndex++;
            trianglesIndex += 6;
            _mesh.triangles = triangles;
            yield return new WaitForSeconds(0.2f);
        }

        startIndex++;
    }
}

OnDrawGizmos方法

用于在Scene视图中绘制顶点的辅助图形,方便调试和观察

private void OnDrawGizmos()
{
    if (_vertices == null) return;
    for (int i = 0; i < _vertices.Length; i++)
    {
        // 遍历所有顶点,绘制球形代表每个顶点
        Gizmos.DrawSphere(_vertices[i], 0.2f);
    }
}

三、效果

在这里插入图片描述

四、总结

通过本篇教程,你学会了如何利用Mesh对象在Unity中生成简单的平面,并通过设置顶点、UV坐标和三角形来生成Unity Logo 的效果。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

了解红帽认证,看这篇就够了!

红帽公司成立于1993年&#xff0c;是全球首家收入超10亿美元的开源公司&#xff0c;总部位于美国&#xff0c;分支机构遍布全球。 红帽公司作为全球领先的开源和Linux系统提供商&#xff0c;其产品已被业界广泛认可并使用&#xff0c;尤其是RHEL系统在业内拥有超高的Linux系统…

css3d制作正方体

使用css3d技术 &#xff0c;制作一个可以动态动画的正方体模型 效果图&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html> <head><style>/* 设置高度宽度100%并且左右居中、上下居中 */html,body {width: 100%;height: 100%;display: flex…

C#串口 Modbus通讯工具类

一、安装Modbus包 二、创建modbushelper类 1、打开串口 public bool IfCOMOpend; //用于实例内的COM口的状态 public SerialPort OpenedCOM;//用于手动输入的COM转成SERIAL PORT /// <summary> /// 打开串口 /// </summary> /// <param name="COMname&quo…

2-22算法习题总结

贪心问题 凌乱的yyy / 线段覆盖 题目背景 快 noip 了&#xff0c;yyy 很紧张&#xff01; 题目描述 现在各大 oj 上有 n n n 个比赛&#xff0c;每个比赛的开始、结束的时间点是知道的。 yyy 认为&#xff0c;参加越多的比赛&#xff0c;noip 就能考的越好&#xff08;假…

Day04-课后练习以及参考答案(流程控制语句_循环结构)

文章目录 巩固题1、5个一行输出1-100之间的偶数2、趣味折纸3、实现输出如下任一个数字三角形4、计算这一天是这一年的第几天 拔高题1、计算这一天是这一年的第几天2、计算这一天是在打鱼还是晒网3、打印『X』对称图形4、打印空心菱形 巩固题 1、5个一行输出1-100之间的偶数 &…

【更新】ARCGIS之成片区开发方案报备坐标txt格式批量导出工具(定制开发版)

序言 之前开发的成片区开发方案报备格式是按湖北省的标准定制的&#xff0c;目前&#xff0c;自然资源部又有了新的格式要求&#xff0c;现在新增国标版的成片区开发方案报备格式导出。 之前版本软件详见&#xff1a;软件介绍 一、软件简介 本软件是基于arcgis二次开发的工具&…

YOLOv9 | 利用YOLOv9训练自己的数据集 -> 推理、验证(源码解读 + 手撕结构图)

一、本文介绍 本文给大家带来的是全新的SOTA模型YOLOv9的基础使用教程&#xff0c;需要注意的是YOLOv9发布时间为2024年2月21日&#xff0c;截至最近的日期也没有过去几天&#xff0c;从其实验结果上来看&#xff0c;其效果无论是精度和参数量都要大于过去的一些实时检测模型&…

C++力扣题目 392--判断子序列 115--不同的子序列 583--两个字符串的删除操作 72--编辑操作

392.判断子序列 力扣题目链接(opens new window) 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;&quo…

中科大计网学习记录笔记(十三):UDP 套接字编程 | 传输层概述和传输层的服务

前言&#xff1a; 学习视频&#xff1a;中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版&#xff0c;James F.Kurose&#xff0c;Keith W.Ross&#xff09;》课程 该视频是B站非常著名的计网学习视频&#xff0c;但相信很多朋友和我一样在听完前面的部分发现信…

LangChain支持哔哩哔哩视频总结

是基于LangChain框架下的开发&#xff0c;所以最开始请先 pip install Langchain pip install bilibili-api-python 技术要点&#xff1a; 使用Langchain框架自带的Document loaders 修改BiliBiliLoader的源码&#xff0c;自带的并不支持当前b站的视频加载 源码文件修改&a…

Microsoft的PromptBench可以做啥?

目录 PromptBench简介 PromptBench的快速模型性能评估 PromptBench数据集介绍 PromptBench模型介绍 PromptBench模型加载遇到的问题 第一次在M1 Mac上加载模型 vicuna和llama系列模型 PromptBench各个模型加载情况总结 PromptBench的Prompt快速工程 chain of thought…

【Qt学习】QLineEdit 控件 属性与实例(登录界面,验证密码,正则表达式)

文章目录 1. 介绍2. 实例使用2.1 登录界面2.2 对比两次密码是否相同2.3 通过按钮显示当前输入的密码&#xff08;并对2.2进行优化&#xff09;2.4 结语 3. 正则表达式3.1 QRegExp3.2 验证输入内容 4. 资源代码 1. 介绍 关于 QLineEdit 的详细介绍&#xff0c;可以去查阅官方文…

【Spring】IoC容器 控制反转 与 DI依赖注入 三种实现方式 总结 第五期

目录 1 - 4 期三种配置方式总结1. XML方式配置总结2. XML注解方式配置总结3. 完全注解方式配置总结 整合Spring5-Test5搭建测试环境 1 - 4 期 介绍 IoC DI Xml实现 IoC DI 注解 Xml 实现 IoC DI 完全注解实现 三种配置方式总结 1. XML方式配置总结 所有内容写到xml格式…

Linux第63步_为新创建的虚拟机添加必要的目录和安装支持linux系统移植的软件

1、创建必要的目录 输入密码“123456”&#xff0c;登录虚拟机 这个“zgq”&#xff0c;是用户名&#xff0c;也是下面用到的的“zgq”目录。 1)、创建“/home/zgq/linux/”目录 打开终端&#xff0c;进入“/home/zgq/”目录 输入“mkdir linux回车”&#xff0c;创建“/ho…

VUE3使用three.js显示3D模型

使用3D模型作为自动化系统的界面已经成为潮流。尽管在AutomationML 中推荐COLLADA作为 3D 模型的标准。但是COLLADA的开发者khronos 集团却已经开发了COLLADA的后继者glTF 。glTF 2.0已经成为国际标准ISO/IEC 12113:2022。 Khronos声称-‘glTF是3D里的JPEG’。目前看来glTF 更加…

【Linux】 login命令使用

login命令 在 Linux 中用于创建一个新的会话&#xff0c;并在新会话中登录用户。这个命令通常在终端中自动执行&#xff0c;当你打开一个新的终端会话或者通过 SSH 远程连接到 Linux 服务器时。 在命令后面附加欲登入的用户名称&#xff0c;它会直接询问密码&#xff0c;等待…

软件压力测试:测试方法与步骤详解

随着软件应用的不断发展&#xff0c;用户对系统性能的要求也逐渐提高。在不同的负载条件下&#xff0c;系统必须能够保持稳定、高效的运行。软件压力测试是一种验证系统在各种负载情况下性能表现的关键手段。本文将详细探讨软件压力测试的方法和步骤。 1. 明确测试目标 在进行压…

canvas水波纹效果,jquery鼠标水波纹插件

canvas水波纹效果&#xff0c;jquery鼠标水波纹插件 效果展示 jQuery水波纹效果&#xff0c;canvas水波纹插件 HTML代码片段 <div class"scroll04wrap"><h3>发展历程</h3><div class"scroll04"><p>不要回头&#xff0c;一…

Sora背后的论文(1):使用 lstms 对视频展现进行无监督学习

之前那篇《Sora背后的32篇论文》发出后&#xff0c;大家都觉得不错&#xff0c;有很多小伙伴都开始啃论文了。 那么我就趁热打铁&#xff0c;把这32篇论文的通俗解读版贴一下。 从去年开始&#xff0c;我基本上形成了一个思维方式&#xff0c;任何事情做之前先看看 有没有好的…

C++力扣题目 647--回文子串 516--最长回文子序列

647. 回文子串 力扣题目链接(opens new window) 给定一个字符串&#xff0c;你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#xff0c;也会被视作不同的子串。 示例 1&#xff1a; 输入&#xff1a…