粒子效果
中间的圆环粒子旋转,同时伴有音效,音效和旋转速度有着一定的关联。同时会不时得发射出一些sprite粒子,有红蓝两种颜色。红色粒子不受重力,但是受到明显的阻力影响,当期运动速度小到一定程度后(或者和速度没有关系而是一段时间后),会爆裂成更多更细小的粒子,并伴有爆裂的音效(参考烟花);蓝色粒子受重力,并且会与其他模型产生碰撞,碰撞后碎裂成功更多更细小的粒子,并伴有碎裂的音效。
Niagara蓝图部分
这是我们至今为止遇到的发射器(Emitter)最多的一个Niagara系统,但是无须担心,在我们的拆解下,一切都会清晰明了起来。
在总览蓝图的时候,我们需要知道从粒子播放音频现在是只支持CPU粒子(当然,其实对应到GPU粒子上我们也会有响应的应对解决办法,但是目前为止这不重要)。
蓝图中有总共5个Emitter,其中每一竖列可以看作是服务于同一系粒子的发射器:最左侧的竖列负责红色粒子及其碎裂后的粒子;中间的竖列负责蓝色粒子及其碎裂后的粒子;最右侧的负责旋转的圆环。有了这些的概念后,我们进入下面的实现分析。(这里需要吐槽一句UE5中Niagara所有脚本模块都大写,看得我人有点晕)
效果实现分析
红色Sprite粒子——初速度,阻力,减速,爆裂,音效,红色子Sprite粒子。
Particle Spawn中的Add Velocity in Cone赋予初速度,Particle Update里的Drag赋予阻力。
Play Audio负责播放音效:Audio Player负责拿到待播放的音频,然后通过PlayAudio这个布尔量来控制播放。这里传了一个参数Data Instance.Alive,即粒子是否还“活着”,我们希望粒子消亡时候播放爆裂的音频,所以需要做一个取反操作(加一个负号)。此外Pitch和Volume是两个比较重要调控音频播放属性的参数,分别控制音调和大小(关于声音我并不是非常专业,大概知道他们分别控制波的频率和振幅,从而影响声音的外在表现)。
然后,红色粒子爆裂成子粒子是由事件系统完成——Generate Death Event。然后由接受到这个事件的Emitter(接收到的还有位置location等信息),其负责爆裂效果的子粒子的生成。
蓝色Sprite粒子——初速度,重力,碰撞,爆裂,蓝色子Sprite粒子。
与红色粒子类似,所需要注意的不同点,就是蓝色粒子中的碰撞这一要素,很容易想到我们之前用过的Collision。这里PlayAudio里采用了CollisionValid参数,这个参数是在Collsion模块被写入,所以最好Play Audio模块要放在Collision模块的下方,否则的话会有落后一帧的误差。
这里依旧采用了Generate Death Event,但是粒子的碰撞并不会把粒子撞死,怎么办?当然我们可以用Generate Collision Event来传输事件,但是此时我们就是希望粒子在碰撞后就死亡,这里在Collision里,有Age Colliding Particles,即编辑碰撞的粒子的年龄,通过Advanced Aging Rate来调控粒子需要“加速多长的事件”,这里填了1000,就是粒子瞬间老去了1000岁,可不就立马原地去世嘛。
圆环Mesh粒子——旋转,音效速度和旋转速度
首先在Spawn阶段拿到播放的音频。
圆环旋转的实现,主要是使用了Mesh Rotation Force以及相应的解算器Solve Rotational Forces and Velocity。
此时实现了运动,但是还没有声音。只是想把音频播放出来很容易,Play Persistent Audio即是。并且后面的Update Persistent Audio Volume和Update Persistent Audio Pitch就是用来分别调控音频的两项属性的。可以注意到,他们都使用了一个名为Remapped Total Energy,这是前面Find Kinetic and Potential Energy写入的一个0到1之间的值,目的是描述动能,然后通过这个动能来动态改变音频的属性,如此便实现了音频和动能(速度)的关联。
总结
音频的这部分功能都还属于实验阶段,并且仅限于CPU粒子,但是其玩法还是比较多样的。同时,在这个例子中已经有一点迹象,即随着学习到的知识和技术点的增加,实现同一个功能或者效果其实可以有多种的方案,随着系统越来越复杂,评价实现方案的性能将是一个越来越重要的问题。