我们测试出,如果一帧内按顺序执行 activate(true)->setlocation, 拖尾会从旧的location开始,而不是新set的。必须顺序要先setlocation了再执行activate(true)才正常。
niagara特效的Ribbon拖尾,位置采样更新按理说应该是在下一帧处理才对? activate时会采样一次位置信息吗?麻烦指导下相关代码😂 NiagaraVM代码有点复杂
我们测试出,如果一帧内按顺序执行 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。这个函数在蓝图中也是可用的。
希望这能帮助您解决问题。