教程地址:https://www.bilibili.com/video/BV1fE411b7at
在月神的Niagara基础教程,弹道的制作中,连续开枪会出现连线错乱
这是版本的问题,我尝试用教程使用的UE4.23版本制作也是不会有这个问题的,在重新开火的时候,粒子会被杀死,重新发射,也就没有这个问题,
在新版本4.25下即时蓝图开火激活勾选了Reset,也不会杀死旧粒子,当然,如果要杀死肯定也是可以的,但我觉得弹道突然消失很奇怪,那一定也有办法让连线正常起来。
为了这个问题,费了好几天了,当然也学到了不少内容
首先,我们可以去绑定(Binding)下找线索
我们可以通过设置Ribbon ID来控制哪些粒子连成一条线
通过RibbonLinkOrder可以控制连线的顺序
顺序这里不用动,我们只需要设置RibbonID
那怎么设置呢?
这里用到蓝图,在内容浏览器右键-FX-Niagara Module Script,创建蓝图,重命名Set RibbonID
创建了蓝图,我们需要在发射器中调用它,进入发射器面板,粒子更新模块添加我们的蓝图Set Ribbon
ID,如果找不到的话注意是不是勾选了仅库
接下来处理蓝图内容。
双击打开蓝图,里面是这样的
我们要设置RibbonID,所以输出端添加RibbonID
那要设置什么值给它呢?这个大家要思考一下
当RibbonID一样的时候,Ribbon就会连城一条线,而我们之前连续开枪的不同弹道相互连线也就是因为他们的RibbonID相同,所以都会进行连线。
原理说清楚了,那我们要如何为每条弹道设置不同的RibbonID?
这里我们需要一个变量,每次开枪的时候它都是不同的,最早我想的是获取开枪次数,没次开枪值都是不同的,但没找到相关参数。所以我换个思路,我又想到能不能获取开枪的时间,但也没找到,最后,我利用能找到的参数,NormalizedAge,标准化年龄
直接把NormalizedAge连过去是不行的,因为两个属性的数据类型不同,年龄是浮点型,而RibbonID是NiagaraID类型。(这里不知道的可以在属性上稍作停顿,会有提示信息)
为了连接数据,我们需要对数据做处理,右键输入niagaraID,注意看下图,中断列表和创建列表都有一个NiagaraID,这里的不同你可以都点出来看下就清楚了,就是转接口公母的区别,是niagaraID转成其它数据,还是其他数据转成NiagaraID
这里我们要转成NiagaraID,所以用创建下的NiagaraID,把数据连接上
现在你尝试开枪,会发现还是不管用,这是因为什么,是因为我们得到的NormalizedAge始终是一个0-1的数,我猜测它只认整数,所以对结果乘了1000,并取整,结果真是这样,并且把取整函数去掉结果也是没问题的
现在你在尝试连续开枪,每次的弹道就不会相互连接了
数据验证
这里另外提一点,如果你尝试了结果并不对,那你是不是很困惑,不知道问题出在哪里了,
这里我推荐把属性值显示出来
比如我们要验证每条弹道的RibbonID值是不同的,我们就把这个属性显示出来
像这样,你可以知道原来每条弹道的值还是一样的,那肯定就是数据没传过去或者连接错了
那要怎么把属性显示出来?这个在前面文章有说过,
我们使用Sprite显示模式,贴图上做文章,把属性值贴在材质上显示出来
这里我用了颜色属性,把NiagaraID值赋给颜色红通道,然后在材质上把红通道的数值显示出来
可以看到,我再给NiagaraID值的同时,也把值传给了红通道
优化
时间过了一周,当我看完整个教程重新复习这个案例的时候,有了更好一点的解决方案
我们之前的setRibbonID是添加在粒子更新上的,也就是每帧的RiboonID值都是在更新的,而如果把setRibbonID添加在粒子生成模块只会去生成时的值,后面不会再更新,但是由于NormalizedAge是随粒子出生到死亡映射值为0-1,这有什么问题,问题在于粒子刚出生时NormalizedAge值一定为0,如果值不更新,每个粒子的RibbonID就都为0,都会连线。
那这次发现了系统模块下的Age,每次生成粒子的时间不同ID就不同,这是我们更加合适的
而处理系统Age,引擎模块下有个Time也能实现同样的结果
这样优化的好处是RibbonID是在粒子生成模块而不是粒子更新模块,ID只计算一次而不用没帧更新
如有问题请再联系我
乾杯
志伟