在 Seamless Travel 过程中,FSeamlessTravelHandler::CopyWorldData() 会将 NetDriver 从旧 World 迁移到新 World(通过 NetDriver->SetWorld(LoadedWorld) 和 LoadedWorld->SetNetDriver(NetDriver))但是 ReplicationDriver 的 Outer 仍然是旧 World,没有被迁移。当旧 World 被 GC 销毁时,ReplicationDriver 也会因为 Outer 是旧 World 而被 GC 销毁,导致 NetDriver->GetReplicationDriver() 返回 nullptr,网络复制功能失效。我在CopyWorldData后面加上迁移ReplicationDriver的逻辑之后就可以了,是否应该这样改呢?
[Attachment Removed]
重现步骤
用我们的项目,开启ReplicationGraph,在DS上用Seamless的ServerTravel切换场景,新的场景里无法正常通过ReplicationGraph进行网络同步,因为NetDriver->GetReplicationDriver() 返回 nullptr
[Attachment Removed]
后来发现是我们自己的代码写错了,把ReplicationGraph的outer设置成了World,导致在SeamlessTravel的时候跟着前面的world销毁了,看原本的代码设计可能是希望不要销毁ReplicationGraph的,所以没事了,感谢回复~
[Attachment Removed]
TonyChen1
(TonyChen1)
4
您好,从描述上看我觉得直接在CopyWorldData加上对迁移ReplicationDriver的逻辑是一种处理方式,这个问题我可能需要反馈一下看看能否在后面版本中修复,谢谢反馈
[Attachment Removed]
TonyChen1
(TonyChen1)
5
看起来引擎默认创建的时候在UReplicationDriver::CreateReplicationDriver设置的outer是TransientPackage其实是考虑了跨world的情况,看起来是你们项目后面设置了outer导致的问题,问题解决了就好,感谢反馈~
[Attachment Removed]