Ribbon拖尾位置更新疑问

我们测试出,如果一帧内按顺序执行 activate(true)->setlocation, 拖尾会从旧的location开始,而不是新set的。必须顺序要先setlocation了再执行activate(true)才正常。

niagara特效的Ribbon拖尾,位置采样更新按理说应该是在下一帧处理才对? activate时会采样一次位置信息吗?麻烦指导下相关代码😂 NiagaraVM代码有点复杂

您好,

感谢您的询问。

您可以提供一些额外信息帮助我们调查吗?

- 您提到的逻辑是使用蓝图还是 C++ 执行的?

- 在 Activate 和 SetLocation之间有其他逻辑吗?请问您在这里指的是 SetActorLocation 还是 Component 上的 SetWorldLocation?

- 如果将 fx.Niagara.SystemSimulation.AllowASync 设为 0,这里的行为仍然一致吗?

如果可以的话,希望您能提供一个简单的测试项目。

通常情况下,Niagara Data Interfaces 是在 FNiagaraSystemSimulation::Tick_GameThread 中更新的。Actor Component 的 Transform 信息也是在这个位置被拷贝到并行的 Niagara 模拟线程上的。

希望这个回答能帮到您。

-先是业务代码有这个问题,然后使用纯蓝图模拟测试,结果一样

-fx.Niagara.SystemSimulation.AllowASync 0 测试结果一样

-​抱歉,原特效资产应该拿不出仓库了😂 。我仔细说一下逻辑过程

蓝图Actor身上挂一个niagaraComponent放拖尾特效,component的autoActivate=false。

1.首次激活,SetActorTickEnabled(true)->SetActorHiddenInGame(false)->niagaraComponent.Activate(true)->SetActorLocation

2.模拟移动,逐帧SetActorLocation

3.停止移动并隐藏,niagaraComponent.Deactivate()->SetActorHiddenInGame(true)->SetActorTickEnabled(false)

4.二次激活 ​SetActorTickEnabled(true)->SetActorHiddenInGame(false)->niagaraComponent.Activate(true)->SetActorLocation,此时会从上一停止点到当前位置的残留拖尾

您好,

我们在本地测试时发现交换 SetActorLocation 和 Activate 的顺序并不会影响最终行为。可能您遇到的问题和 Niagara System 上面的某个具体设置有关。

如果您需要在重新激活 Niagara System 时进行一个深度重置,可以尝试调用 UNiagaraComponent::ReinitializeSystem。这个函数在蓝图中也是可用的。

希望这能帮助您解决问题。