点击蓝字关注我们吧!
目录 |
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 关键字用于构造对象或结构体的新实例。然后调用一个特殊的构造函数方法,该方法与它所属的类或结构的名字相同。