原因
在模拟端,UE4 的 Character 类型移动同步是依靠属性同步来实现的
Character 类型的对象通常会被加入到 RG 的网格同步节点中的动态节点
而 Replication Graph 默认的网格同步节点
UReplicationGraphNode_GridSpatialization2D
的单个网格实现是
UReplicationGraphNode_GridCell
其中管理动态对象的节点获取函数为
1 | UReplicationGraphNode* UReplicationGraphNode_GridCell::GetDynamicNode() |
故而,Character 同步一般用到的是 UReplicationGraphNode_ActorListFrequencyBuckets 节点
这个节点中,会有分帧同步的策略,所以不太适合 Movment 这种需要每帧同步的内容
处理方式
幸运的是,Grid Cell 节点提供了 CreateDynamicNodeOverride 成员,可以让我们自定义动态成员节点
所以我们可以创建自己的节点来管理动态成员
比如
在我们的自定义节点下创建分帧以及 Actor List 两个子节点
然后根据不同的策略把 Actor 加入不同的子节点中即可
在这里,我们只需要把 Character 类型的策略设置为不分帧,或者把需要更精确同步运动的单个 Character 设置为不分帧