问题1:跟随平台移动,碰撞弹开

第0步:两个角色站在MovementBase上保持不动。

第1步:移动平台Actor的Tick中,会移动MovementBase,移动的方向是两个角色的直线上,并且向角色C2方向,移动的幅度大于两个角色间的距离。

第2步:执行角色C1移动组件的Tick,此过程中会做角色C1的跟随移动,即角色C1跟随MovementBase的移动。

问题来了。角色C1做跟随移动过程中,会被角色C2所Block,因为角色C2还未做跟随移动。

因此,角色C1最终会掉离MovementBase,或表现出来被C2隔空弹开。

第3步:执行角色C2移动组件的Tick,角色C2跟随移动路径上没有其他角色Block,因此不会有问题。

基于Base的移动

UE4官方的处理方式是使用MovementBase,主控端设置Base,同步位置到DS,DS将Base同步到模拟端。

计算时,在角色的同一个Tick中做跟随Base的移动和相对移动,模拟端收到同步数据时,使用DS的Base和角色位置,Mesh做一定的平滑插值,没同步数据时,模拟端本地模拟移动。
下面两步是在角色移动组件的Tick中分两步但是是一次Tick完成的。

void UCharacterMovementComponent::MaybeUpdateBasedMovement(float DeltaSeconds)

void UCharacterMovementComponent::UpdateBasedMovement(float DeltaSeconds)

解决方式

调整Tick依赖,优先处理所有物体跟随平台的运动,这期间关闭彼此碰撞。更新位置后打开碰撞(避免C1占了C2位置(导致C2移动时被弹开))。之后处理各自的相对运动。