当前位置: 网站首页 >> 手游 > >> 正文

当前要闻:UE5 Niagara 关于跟随其他Emitter的ID相关的笔记

时间:2023-02-17 19:59:45 来源:哔哩哔哩

1.概括想法

版本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的坑这才刚开始,掉进去了一个星期)

2.工具介绍

回到正题

在Niagara工具中我找到了多个ID和index

这个工具可以帮助我们查看粒子的信息,以帮助我们找到我们需要的和验证

经过我的研究发现Array Index 是持久固定的数量(场景中存在的粒子个数决定),好像也就是Execution Index。而且每个粒子会经历这里面的所有数值。就是第一个发射出来的粒子是0,后面发射出来的就依次增加成为 1 2 3 ....但是当第一个粒子死亡时候之前是1的就变成了0  2就变成了1。

中间的两个Index和Tag 和起来就是上面说的ID。ID是唯一的这也是能精准找到我们想要的粒子的数据重要的东西

UniqueID是持续增加的并且不会因为粒子死亡而改变。出生就被按顺序赋予 

还有一个工具就是UE5后才有的Debug功能,这样在场景中就能看到数据就方便了很多

并且还能暂停和缓速播放

3.正式的操作 AB粒子均采用Burst发射

官方案例中基本上都是用的瞬间发射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编译问题。我们可以在点击保存和编译,并且把场景中粒子的自动激活重新取消打勾再勾上。选中粒子再按按/,它就会恢复正常。

要是还是不对那就得多检查写对了吗

希望大家如果有不对或者更好的理解,欢迎大家讨论讨论

关键词: 我们需要 希望大家
x 广告
x 广告

Copyright   2015-2022 南极游戏网版权所有   备案号:粤ICP备2022077823号-13   联系邮箱: 317 493 128@qq.com