Altar 和 Artefact
这两个组件没什么可看的。主要就是有个飘荡的动画。另外注意Artefact是PSB格式的,用PSD importer直接导入进来的。
Wand的shader
查看Wand的Shader,同样,这种不断运动的,都有一个随时间变化的输入。
将向上方的移动与下方移动相乘之后,形成紊乱的噪声变化。Remap可以修改其边界。注意这里用Rectangle来做描边的应用。
Magic Fire
Magic Fire就是普通的火焰粒子效果。由于之前对于粒子研究不够深入。这里我准备完整看一下粒子。
粒子系统
从文档看,现在支持的粒子系统有内置粒子和 Visual Effect Graph两种,视效图运行在GPU上,可以模拟上百万的粒子,适用于更宏大的场景。这里只关注内置的粒子系统。
粒子效果预览面板中的Simulate Layers作用是控制哪些层的粒子效果是不用选择也可以显示的。
主模块
StartLifetime 控制粒子的寿命,寿命变为0粒子就消失了
Start Color, 控制粒子的初始颜色,如果给予渐变色,那么在Duration的不同阶段使用相应的颜色。
Gravity Modifier, 控制重力,如果给予Curve,那么是在Duration的不同阶段产生相应的重力(影响本粒子系统下的所有粒子)
Simulation Space 控制粒子整个系统随着哪个物体而相对运动。当为local时,移动该粒子系统所在的Obj,已经发出的粒子也会跟着运动。如果为World,已经发出的粒子不会跟着运动。
Delta Time ,scale会使用time设定中的time scale设置值来计时。Time的设定参考Time,其中的time scale设置可以设定整个游戏的速度快慢或者暂停。例如可以实现慢动作效果。那么unscale就是忽略time中的time scale设定,这样可以实现游戏暂停时的粒子效果。
Scaling Mode, 控制transform的缩放对粒子的影响,Hierarchy的话,父物体的scale会影响到子物体上的粒子,local的话,只有本物体的scale会影响粒子。shape的话,只影响发生粒子的那个区域的scale,不影响粒子本身。
发射模块
Rate over Time 每单位时间发射的粒子数量
Rate over Distance 每移动单位距离,发射的粒子数量。当移动时发射,可以模拟车辆尾气等移动时发出的粒子。
Bursts, 在duration的某个时间开始,发出多少的粒子,发几次,间隔多少,概率多少。
形状模块
这里可选的形状非常的多,而且可以通过下方的编辑按钮来编辑它们的大小,形状,旋转等。
另外对于Texture和Clip相关的使用,后续还有待深入了解,这里先不仔细研究了。
Mesh,MeshRender,Sprite,SpriteRender都类似,都是用Mesh或者Sprite来控制发射粒子的形状。
Velocity over Lifetime 模块
可以用曲线调整整个生命周期内的速度变化情况
Limit Velocity Over Lifetime 模块
控制速度随时间减小的情况。 这里的speed只是设置速度限制,Dampen或Drag来控制速度减小的幅度。
Inherit Velocity 模块
控制当父物体变化时,粒子的速度如何反应。只在 Simulation Space设置为World时生效。
略去若干 by speed, by lifetime的模块。大同小异
噪声模块
对粒子的移动增加一些随机噪声的扰动。Octaves可以控制用多少层来模拟,越多的话对性能消耗越大。Scroll Speed可以让噪声开始滚动。 Position Amount,Rotation Amount和Size Amount分别可以控制位置,旋转和大小受噪声的影响。
碰撞模块
如果模式设置为了Planes,你可以定义若干个平面,粒子在碰撞到这些平面后,会反弹。可以点+号来新建,也可以使用已有的物体。它会在已有的物体的位置创建一个平面(无限大),你只可以修改平面的位置,角度。Dampen,Bounce分别对应粒子与平面发生碰撞后的效果,减缓移动,或者受到弹力的影响加速弹开。
如果模式设置为World,它可以与世界中的已经定义的Collider发生作用。
Collider Force 可以在撞击时给Collider一个力。这样粒子就可以撞动collider了。下面的multiply by Angle等是说可以让这个力受粒子的角度,大小的影响,从而让撞击更真实。
Trigger模块
可以定义一系列colliders,当粒子与这些collider发生碰撞时,在Inside,OutSide,Enter,Exit等不同状态,允许kill掉粒子,或者调用Callback。Radius Scale是控制粒子的碰撞边缘的大小。以便碰撞更精准。
关于Callback的例子参见 https://docs.unity3d.com/Manual/PartSysTriggersModule.html
子发射器模块
允许在粒子生命周期的特定时刻,在粒子的位置创建一个新的子发射器。例如子弹离开枪管的烟雾,和火球撞击后产生的爆炸,可以用子发射器来实现。子系统可以选择继承父系统的一些属性或者全部属性
Texture Sheet Animation模块
粒子的贴图不是固定的,而是在一组图中选择,如果选择Sprite模式,可以编辑一组Sprite(这组Sprite需要共享一个大的Texture),然后粒子会从这组Sprite里面挑选一个作为贴图。如果选择Grid模式,则根据Grid的切片来选择其中一个作为贴图。这里的Texture指的是它的Render里面指定的材质所展现出来的贴图。
光模块
选择一个光照Prefab,让粒子可以发光。
Trail模块
添加拖尾效果。Pariticles模式给粒子单独加拖尾,Ribbon模式把多个粒子链接起来。
Radio设定有拖尾的粒子的概率。
Lifetime拖尾的生命周期,相对于粒子生命周期的比值
Minimum Vertex Distance,粒子最少需要滑行某段距离之后才能有拖尾出现。
World Space 移动时拖尾跟随粒子移动的方式是相对于粒子系统本身还是相对于世界
Split Sub Emitter Ribbons, 当拖尾用于sub emitter时,从同一个粒子系统发出的粒子共享Ribbon。
自定义数据模块
据称,可以自己定义数据格式,然后在脚本中设置,并在Shader中使用。这里不做更深讨论。参考Particle System vertex streams
渲染模块
Render模式,Billboard会永远把粒子面向摄像机。拉伸的Billboard根据摄像机的移动,粒子的长度,速度等计算拉伸的效果。Mesh,用多边形而不是贴图来渲染粒子。
Sort Mode,粒子排序的模式,可以按照到相机的远近或者出生的顺序来排序。
Sorting Fudge,越低的话,粒子越容易出现在系统中其他透明物体之前。这个是针对全系统的渲染次序,不是针对单个粒子的。
Render Alignment, Billboard面对的方向。
Masking, 定义对于Sprite Mask如何显示
Sorting Layer, 用于2D的Sorting Layer
Order in Layer,用于2D,在Sorting layer中的次序。
总结
虽然粒子的所有文档都看完了,蛋,并不代表就能做出很好的粒子效果了。还是要多看多练,这东西需要经验和创意。
( ̄▽ ̄)"
Glyph符文
Glyph符文的Shader,看过了Wand的,就会发现它们非常的类似,不再介绍了。
日间荧光飞舞的特效
看完所有的粒子效果,正好顺便把白天和夜晚的特效看一下。下图是白天森林中一些神秘的粒子飞舞的效果(虫子?胡贴?)这个效果主要注意把Shape设置成Rectangle,然后注意旋转它的X Rotation,让它与画面平行。然后设置Start Speed为0。然后加上Noise,设置粒子的Material为Particle-Glow-Lit。然后设置一个Color Over Lifetime为从透明到全白再到透明的效果,主要的效果就出来了。其他基本都是在此基础上微调。
烟尘滚滚的效果
下图是Dust的效果,我专门把start Color的透明去掉,以便看得更明显。这里注意Velocity Over Time的使用,用Curve来控制速度,让烟尘不断向右移动。另外就是Texture Sheet Animation的使用,贴图中定义好了不同尺寸的烟尘, 分为5x5个小格,这样就会循环地产生不同样式的烟尘。
夜晚的特效
夜晚的特效是飞舞的萤火虫,基本上跟白天的效果差不多。
夜晚的萤火虫效果是这样的:
但是我注意到其中有几个效果是自始至终都没有用到的,是多余的。图中的Fireflies_influence_Sara, Fireflies_Front, Particles_Wind_Trail自始至终没有用到。
其中后两个都是特效,一个也是萤火虫飞舞,另一个是吹风。Front那个带了一个External Force的组件,让它可以受外力作用。而Influence Sara那个带了个Particle System Force Field, 而这个组件可以将Front的萤火虫吹开。我估计作者本身是想把这个组件放到Sara身上,当Sara跑过时,萤火虫纷纷避开。但是不知道为何这个效果并没有完成就放上来了。
关于Particle System Force Field,也是非常有用的东西。其中Direction是沿特定方向的力的强弱,此外还有Gravity是引力,Drag是阻力。
曲线编辑器的Bug
在这里查看粒子曲线的时候,发现编辑器只能放大,不能缩小。论坛上找到似乎有人报同样的问题。版本2019.3.0f3。https://answers.unity.com/questions/1681500/particle-system-curves-bug.html
Unity Collaborate
在查看Package Manager的时候,我发现它使用了Unity Collaborate的包。
简单查看一下文档,这个包用于团队多人在线协作,将内容存储在云端。由于我用的是Git,所以没有深入的研究。不过用Git来存储二进制的文件的话,后期整个git库的性能可能会受到一些影响。不知道这个Collaborate能否解决图片,音频等二进制文件的版本问题。有懂的欢迎指教。