版本UE5.1
因为最近需要做一个功能性的效果。A B 粒子都在一个位置持续发射,并且B粒子发射的多个粒子要跟随着A做变化性的运动
(资料图片仅供参考)
比如B发射5个粒子围绕A的运动方向做环绕运动
因为自己对Niagara也不太熟悉。如有不对的地方希望大家指出
下面是我的测试和最后的解决办法
首先想到的是去看官方的案例找相关的例子。最后在粒子高级案例里面找到了相关的案例
这两个采用的就是Partile Attibute Reader 用这个读取A粒子的相关数据,也可以读取自身前一帧的数据
具体用法就是要么:B粒子中的Emitter Sapwn 中创建一个,并且在Emitter Name中输入要读取发射器的名字。或者在引用的地方输入
有个前提就是得把粒子的ID先固定就是如下图
然后我们在Module里面就可以读取相关的很多数据比如:Bool、Int、Float、Vector2D、Vector、Vector4、Color、NiagaraID、Quaternion
引用的数据的方式有两种:粒子的ID或者Index索引。但是难就难在最初的我不太了解这两个是啥。大致知道是某种编号。ID的话倒是了解一点,但不知道它结果分为Index 和Acquire Tag组合在一起的。
在官方高级案例2.2中提到:这个ID与Index不同,它被保证在每一帧之间是稳定的。索引是一个从0到NumParticles-1的值,因此可以随着粒子的死亡和出生而改变。
似懂非懂的感觉⊙﹏⊙∥(结果一入ID的坑这才刚开始,掉进去了一个星期)
回到正题
在Niagara工具中我找到了多个ID和index
这个工具可以帮助我们查看粒子的信息,以帮助我们找到我们需要的和验证
经过我的研究发现Array Index 是持久固定的数量(场景中存在的粒子个数决定),好像也就是Execution Index。而且每个粒子会经历这里面的所有数值。就是第一个发射出来的粒子是0,后面发射出来的就依次增加成为 1 2 3 ....但是当第一个粒子死亡时候之前是1的就变成了0 2就变成了1。
中间的两个Index和Tag 和起来就是上面说的ID。ID是唯一的这也是能精准找到我们想要的粒子的数据重要的东西
UniqueID是持续增加的并且不会因为粒子死亡而改变。出生就被按顺序赋予
还有一个工具就是UE5后才有的Debug功能,这样在场景中就能看到数据就方便了很多
并且还能暂停和缓速播放
官方案例中基本上都是用的瞬间发射Burst,这样的话它的ID这些就能很好的获取。理解起来也相对于持续发射简单。(虽然开始我也理解了很久(ง •_•)ง )
先把准备工作做好
因为要一直跟着A运动,那么就每帧都得去获取A的信息,那么就在Particle Update里面创建一个Module。
Num是我建立的参数代表B粒子发射的数量
我想的是如果B要跟着A走那么就得获取A的位置Position。
或者和A做相同的运动,那么就得获取速度Velocity。速度里面也包含方向
但是通过我测试发现获取粒子的速度比获取位置要好的多,因为每一帧都在获取,获取位置不方便粒子变化,因为变化后下一帧就又会被定义到新的位置,这样粒子容易出现闪现和颤抖的感觉。处理起来就没有速度方便,获取位置就得去做比速度多的处理,做过渡等,所以后面就都获取A粒子的速度了
这里呢需要我们操作的地方有三个
Attribute是需要填入我们需要获取的数据的名字
ParticleReader需要链接信息的来源
最后就是这里粒子的信息我还不知道用ID 还是Index
3.1使用粒子ID获取
我一开始就获取粒子的ID开始(因为获取输入ID就出来了)ID是B粒子的ID
结果却大不相同,当1对1是确实什么问题都没有。但当1对N时它读取的信息就不对。通过工具发现都发射一个粒子时候ID是一样的,B发射多个的时候只有一个和A一样。
但是通过工具就发现了同一时间发射出来的粒子ID后面的tag是一样的,只是前面的Index不一样。所以做了一个数据处理就能解决
到这里基本上的效果已经实现了。A B粒子都采用Burst发射,然后一秒循环一次。
3.2使用Index获取
顺势获取ID拆分处理的Index,以为一切顺利
结果当A的第一个粒子死亡时,它的采样却又不对了,采样ID都没出现。当时也不知道啥原因,去官网也找了,也没找到。都是当我最后研究出来才知道这里Index并不是ID里面拆分出来的Index。它是用的Execution Index
4.使用持续发射Rate
4.1使用粒子Index
把AB粒子就按照上图那样链接方式。把发射方式改成Rate,但是就出现了下面的问题。当A粒子第一个死亡后。B粒子同一秒中发射出来的粒子先发射出来的粒子运动轨迹不一样,有种突然被拉扯过去的感觉
这种应该就是官方说的Index不稳定,它会随着粒子死亡发生改变。所以还是改成ID采集
4.2使用粒子ID
但是把也不顺利,因为粒子B是持续发射,它的每一个Acquire Tag都是不一样的,就算把ID的Index统一了但Tag不一样,所以就出现了只有一个粒子跟随,其他粒子采集的ID不对,就只能再原地
所以就得把Tag解决。通过我们的观察可以发现Tag是个很大的值,而且持续增加。而且只有同一时间发射出来的粒子Tag就是完全一样的,所以Tag应该就和时间相关。这方面我也是通过https://zhuanlan.zhihu.com/p/427618536里面了解到的。AcquireTag 就是粒子系统的TickCount,也就是运行的tick次数
但是呢我需要统一Tag,持续发射的值都不一样。我们需要和A粒子一样的Tag,所以我们再A粒子生成的时候去获取相应的Tag
但是问题还是没有得到解决,思路应该是对的,所以我又增加了两个值来Debug
通过这样发现当B粒子死亡时,原来执行Index为N的变成了N-1。如当第一个粒子死亡时候原来为4的变成了3,那么它通过取整就从取2 Index的值变成了取1 Index值,这样就不太对。所以我们还得增加点判断
先把两个不同的Index储存起来,然后获取当前需要跟随的A粒子的ID,并通过Get ID by ID这个节点来做判断依据。当Index01(执行索引)发生变化的时候,那么B粒子肯定采集不到相同ID的A粒子,那么就会给出一个False。那么我们这时候就把Index01(执行索引)加1,然后重新定义Index01(执行索引)
最后我们再来获取A粒子的速度,这样就解决了
最后就是如果修改了东西后结果场景中没反应,或者编号这些不对,那可能是Niagara编译问题。我们可以在点击保存和编译,并且把场景中粒子的自动激活重新取消打勾再勾上。选中粒子再按按/,它就会恢复正常。
要是还是不对那就得多检查写对了吗
希望大家如果有不对或者更好的理解,欢迎大家讨论讨论
Copyright 2015-2022 南极游戏网版权所有 备案号:粤ICP备2022077823号-13 联系邮箱: 317 493 128@qq.com