Mapz's Blog

可以递归的函数指针

UE5:解决ReplicationGraph导致的模拟端移动不连续问题

原因

在模拟端,UE4 的 Character 类型移动同步是依靠属性同步来实现的

Character 类型的对象通常会被加入到 RG 的网格同步节点中的动态节点

而 Replication Graph 默认的网格同步节点

UReplicationGraphNode_GridSpatialization2D

的单个网格实现是

UReplicationGraphNode_GridCell

其中管理动态对象的节点获取函数为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
UReplicationGraphNode* UReplicationGraphNode_GridCell::GetDynamicNode()
{
if (DynamicNode == nullptr)
{
if (CreateDynamicNodeOverride)
{
DynamicNode = CreateDynamicNodeOverride(this);
}
else
{
DynamicNode = CreateChildNode<UReplicationGraphNode_ActorListFrequencyBuckets>();
}
}

return DynamicNode;
}

故而,Character 同步一般用到的是 UReplicationGraphNode_ActorListFrequencyBuckets 节点

这个节点中,会有分帧同步的策略,所以不太适合 Movment 这种需要每帧同步的内容

处理方式

幸运的是,Grid Cell 节点提供了 CreateDynamicNodeOverride 成员,可以让我们自定义动态成员节点

所以我们可以创建自己的节点来管理动态成员

比如

在我们的自定义节点下创建分帧以及 Actor List 两个子节点

然后根据不同的策略把 Actor 加入不同的子节点中即可

在这里,我们只需要把 Character 类型的策略设置为不分帧,或者把需要更精确同步运动的单个 Character 设置为不分帧