粒子效果
这个例子中包含两个例子系统:上部的一团粒子和下部的圆环状粒子。上部的粒子中,左侧的较大的Sprite和右侧的一团粒子颜色会同时发生改变;下部的粒子中,有一个粒子沿着圆环在运动,并且在运动满一周后随机改变颜色,同时,其经过的每个粒子都会相应得转变位运动粒子的颜色。
Niagara蓝图部分
本例的主要目的是展现Particle Attribute Reader的作用。其中,又有两个Niagara System——一个是GPU粒子,一个是CPU粒子。表明该特性在GPU和CPU粒子上都适用。
上部分表现的是CPU粒子系统的Particle Attribute Reader。其中负责被读的就是名为Source的Emitter,负责读其他Emitter参数的就是名为Reader的Emitter。
下部分表现的是GPU粒子系统的Particle Attribute Reader。其中负责被读的就是名为Leader的Emitter,负责读其他Emitter参数的就是名为Ring的Emitter。
效果实现分析
CPU粒子:
Source——负责生成一个随机颜色的Sprite并会有随机的颜色变化。
值得一提的是,该粒子的Lifetime是根据Emitter.CurrentLoopDuration来的,而这个值是在Emitter State里从System.CurrentLoopDuration里读取并写入到Emitter.CurrentLoopDuration中的。而这个数据,在System Update阶段就进行赋值了的。
Reader——读取其他Emitter的属性,为我所用。
在Emitter Spawn阶段,设置属性读取器Attribute Reader,读取Source的属性。
在自定义的模块Read Color From Emitter中,将读取到的颜色属性写入到本粒子的Color属性中。
该模块主要是使用了Get Color by Index的函数来获取颜色属性,赋予到Particles.Color上。
GPU粒子:
Leader——生成一个绕圆心旋转的点(粒子、Sprite)
主要是依靠Rotate Around Point模块,旋转速率(每秒的旋转)为1/Lifetime,这样就可以保证一个Lifetime转一圈。
Ring——读取Leader里的粒子属性并依照属性进行判断,并选择性得做颜色的赋予。
主要还是 解读Read Color From Emitter:这里还是一个赋予颜色的操作,但是却不单单只读取了颜色属性(还有位置属性)。这里所作的判断是,如果当前粒子与被读粒子的距离小于规定的值的话,那么就将被读粒子的颜色赋予该粒子的Color,负责保持不变。
总结
Attribute Reader像是一个中间的数据缓冲区,可以让数据在Emitter间共享。