UE4移动同步

UE4移动同步

1 相关类


  • UCharacterMovementComponent

2 同步流程


同步流程如下图所示.

Synchronization

  • 步骤 1: 客户端接收玩家输入。

  • 步骤 2: 本地执行PerformMovement执行移动模拟。

  • 步骤 3: 客户端存储最新移动数据NewMoveSavedMoves列表中,由FNetworkPredictionData_Client_Character.管得。NewMove为FSavedMove_Character结构, 包括位置、旋转、时间等信息。

  • 步骤 4: 若发送过于频繁,客户端会将NewMove缓存至PendingMove,等待下一次发送。

  • 步骤 5: 客户端找到时间最远的一次未确认的关键帧数据,并调用ServerMoveOld发送服务器。

  • 步骤 6: 若PendingMove存在,则调用ServerMoveDual同时发送两个移动数据。

  • 步骤 7: 若PendingMove不存在,则调用ServerMove发送一次数据。

  • 步骤 8: 服务器收到客户端的请求数据。

  • 步骤 9: 若移动合法,则调用ClientAckGoodMove通知客户端并同步至模拟端。

  • 步骤 10: 若移动非法,则调用ClientAdjustPosition通知客户端并发送正确位置进行校正。

  • 步骤 11: 客户端若收到ClientAckGoodMove,则缓存最近一次确认的移动数据至LastAckedMove

  • 步骤 12: 客户端移除SaveMoves列表中LastAckedMove时间戳之前的移动数据。

  • 步骤 13: 若客户端收到ClientAdjustPosition,则根据服务器发来的位置进行校正位置。

  • 步骤 14: 客户端移除SaveMoves中此次非法移动之前的所有移动,并在ClientUpdatePositionAfterServerUpdate中重播所有未确认的移动,保证表现。

对于模拟端玩家,收到服务器的同步数据时(OnRep_ReplicatedMovement),客户端在接收到服务器同步的ReplicatedMovement时,会产生回调函数触发SmoothCorrection的执行,从当前客户端的位置平滑的过度到服务器同步的位置。在没有收到服务器消息的时候根据上一次服务器传过来的数据(包括速度与旋转等)在本地执行Simulate模拟(保证本地表现流畅),等着下一个同步数据到来。

参考

[1] Gameplay Framework Quick Reference

Tags: UE4 Synchronization Vistied:
Share: Twitter Facebook LinkedIn