Unity基础系列(四)——构造分形(递归的实现细节)

本文介绍了如何在Unity中利用C#脚本创建3D分形,通过递归和协程实现分形的生长过程。内容包括理解分形概念、实例化游戏对象、递归和协程的使用、添加随机性,以及通过调整子节点的旋转、比例和颜色来增加分形的复杂性和视觉效果。
摘要由CSDN通过智能技术生成

点击蓝字关注我们吧!

目录

1 如何构建分形

2 展示内容

3 构造子节点

4 塑造子节点

5 创建多个子节点

6 更多的子节点,更好的代码

7 爆炸性生长

8 添加颜色

9、随机化Mesh

10 使分形不规则

11 旋转分形

12 添加更多的不确定

本文重点:

1、实例化游戏对象

2、了解递归

3、使用协程

4、添加随机性

分形是一个非常有意思的东西,而且大部分时候都很漂亮。在本教程中,我们将编写一个小的C#脚本,让它完成一些类似分形的行为。

这里假设你已经能够了解一些Unity的基本操作,并且能够创建基本的C#脚本了。如果这些还不熟悉的话,可以再复习一下第一章 时钟 相关的内容。

这是一篇比较旧的教程,里面提到的漫反射和镜面材质可能已经不使用与Unity2017了,所以可以忽略这些,但除此之外,这篇教程所展示的内容还是很有意思的。

(创建随机的3D分形)

1 如何构建分形

在开始构建3D分形之前,先要理解分形的概念。

简单的来说就是一个粗糙的几何物体,可以分为若干部分,每个部分都是(或者近似)该物体缩小后的形状。可以将其应用到Unity中的对象hierarchy中来实现这个效果。比如从某个根对象开始,然后向其中添加较小但在其他方面相同的子对象。

手动完成该操作将会非常麻烦,因此创建脚本来完成。

创建一个新项目和一个新场景。在里面放了一个方向光,把相机移到一个合适的角度,也可以随意设置。

继续创建一个用于分形的材质。材质很简单,仅仅使用specular 着色器与默认设置即可,比起漫反射,这个看起来更舒服一些。

创建一个新的空游戏对象并将其放置在原点。这将是分形的母体。然后创建一个名为Fractal的新C#脚本,并将其添加到对象上。

(工程创建)

2 展示内容

脚本有了,那么分形是什么样子的呢?这里通过在 Fractal 组件脚本中添加一个公共的Mesh和材料material

来实现它的可配置性。然后插入一个Start方法,在其中添加一个新的MeshFilter组件和一个新的MeshRenderer组件。同时,直接分配对应的网格和材料给它们。

什么是mesh?

按照传统理解,mesh是图形硬件用来绘制复杂东西的结构。它是一个3D对象,要么从外部导入到Unity中,这是Unity的默认形状之一,要么是由代码生成。mesh需要包含3D空间中的点集合,以及由这些点定义的一组三角形(最基本的2D形状)。由三角形构成网格所代表的任何表面。

大部分时候,你不会意识到你看到的其实是一堆三角形。

什么是材质?

材质用来定义物体的视觉特性。它们可以是非常简单(比如一个恒定的颜色),也可以非常复杂。材质一般要包括一个着色器和任何着色器需要的数据。

着色器基本作用是告诉显卡如何绘制物体的多边形。标准漫射着色器使用单一的颜色和可选的纹理,结合场景中的光源,来确定多边形的外观。这里使用的是稍微复杂的镜面着色器,同时模拟了一个亮点。

Start函数什么时候调用组件创建之后,处于active状态,并且在第一次调用它的Update方法之前(如果它有的话),Start方法会被Unity调用。而且只调用一次。

AddComponent 怎么用?

AddComponent方法可以创建特定类型的新组件,并将其附加到游戏对象,返回对其的引用。这就是为什么我们可以立即访问组件的值。当然也可以使用中间变量。

MeshFilter Filter=gameObject.AddComponent();

filter.mesh=Mesh;

这里展示了一个特殊的语法。因为它是一个通用方法,实际上是可以处理一系列类型的模板。你可以通过在尖括号中传入参数它来告诉它应该使用什么类型。

现在可以把我们定制的材质分配给fractal组件了。还可以通过单击属性旁边的点并从弹出窗口中选择Unity默认的立方体来分配Mesh。弄完之后,进入播放模式时,就会显示一个立方体了。当然,也可以在代码里手动添加组件。

(运行时可以看到组件了)

3 构造子节

该如何为这个分形创作子节点呢?最简单的方法就是在Start函数里创建一个新的Game Object并向其添加一个Fractal组件,试一下。

new 干了什么事情?

new 关键字用于构造对象或结构体的新实例。然后调用一个特殊的构造函数方法,该方法与它所属的类或结构的名字相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值