UE 角色移动同步全流程:主控端 → DS → 3P 模拟端

动画版完整文档

在线版(网页知识库):打开交互动画文档 —— 单文件、自包含,含交互沙盘(播放/单步/RTT/位置误差/平滑模式)、位置曲线动画、网络平滑循环动画,以及 14 章详细流程与 文件:行号 索引。
本地版:同目录的 UE 角色移动同步全流程 主控端-DS-3P模拟端.html,可在 Obsidian 文件浏览器中打开,或交给系统默认浏览器(Obsidian 不支持内嵌 HTML 页面,需外部打开)。
本文件是 Obsidian 检索用的索引与速查;网页知识库由仓库根目录 site/ 下的 Quartz 5 构建。

一句话

UE 的角色移动不是「服务器算好位置发给所有人」,而是三端各司其职的一条闭环:主控端不等服务器、先按输入自己动并保存每次移动的存档;DS 收到输入后在权威世界里重放同一段移动、判断客户端算得对不对;3P 模拟端只接收 DS 定期广播的权威快照,用网格偏移把离散快照补成连续画面。

核心链路

端LocalRole位置来源主要工作
主控端 1PROLE_AutonomousProxy本地预测值(可被纠正)ControlledCharacterMove → ReplicateMoveToServer → PerformMovement(本帧立即动)→ FSavedMove_Character 存档 → ServerMovePacked 上行
DSROLE_Authority权威值ServerMovePacked_ServerReceive → ServerMove_HandleMoveData → ServerMove_PerformMovement(校验时间戳、MoveAutonomous 重放)→ ServerMoveHandleClientError → Ack / ClientAdjustPosition;同时按 NetUpdateFrequency 写 ReplicatedMovement
3P 模拟端ROLE_SimulatedProxy服务器快照 + 本地平滑OnRep_ReplicatedMovement → PostNetReceiveLocationAndRotation → SmoothCorrection(记 MeshTranslationOffset)→ SmoothClientPosition 逐帧衰减 → SimulatedTick / 动画更新

主控端闭环:收到 Ack → ClientAckGoodMove 丢弃已确认 SavedMoves;收到纠正 → ClientAdjustPosition 置 bUpdatePosition,下一帧 ClientUpdatePositionAfterServerUpdate 回到权威位置并重放所有未确认 SavedMoves。

容易记错的五点

  1. UE 5.8 默认走 Packed 路径:p.NetUsePackedMovementRPCs = 1。打包路径是 ServerMovePacked_ServerReceive:9949 → ServerMove_HandleMoveData:9994 → ServerMove_PerformMovement:10033,不是旧的 ServerMove_Implementation:10153;响应走 ClientMoveResponsePacked。
  2. 主控端收不到 ReplicatedMovement:该属性是 COND_SimulatedOrPhysics(ActorReplication.cpp:593-596),只发给 SimulatedProxy / 物理模拟 Actor。主控端的位置闭环走 Ack / 纠正 RPC,与下行属性复制是两条独立通道。
  3. Capsule ≠ Mesh:3P 上 Capsule 立即跳到权威位置,Mesh 留在视觉旧位置,差值记进 MeshTranslationOffset 并逐帧衰减。碰撞/命中判定用前者,玩家眼睛看到的是后者。
  4. 纠正不会”跳回过去”:客户端接受权威状态后会把 RTT 期间所有未确认的 SavedMoves 重新 MoveAutonomous 一遍,看起来只是轻微回拉。
  5. 引擎基线不是纯原生:F:\PX_Trunk\UE(UE 5.8.2)含 CODE_WALK 插桩,且 CMC.cpp:8623-8636 有一处对 3P Mesh 平滑的实质改动;项目业务层扩展(UGPCharacterMovementComponent、FPX* 三件套、3P 整链路重写)单列在主文档第 12 章。

主文档章节

00 一句话总览 · 01 动画沙盘 · 02 三端角色与设计动机 · 03 主控端本地预测与 SavedMove · 04 上行 ServerMove 家族与打包 · 05 DS 校验/重放/纠错 · 06 下行 ReplicatedMovement 属性复制 · 07 3P 接收与网络平滑 · 08 Ack / 纠正与回滚重放 · 09 角色动画系统如何拿到移动数据 · 10 端到端时序与延迟构成 · 11 CVar / 配置速查 · 12 PX 项目落地差异 · 13 函数索引与代码位置

关于「动画支持」的两层含义:① 文档内的交互动画演示(第 1 章);② UE 角色动画蓝图的数据来源、Tick 依赖与 RootMotion 复制(第 9 章)。两者主文档都覆盖。

代码基准

  • 引擎:F:\PX_Trunk\UE(UE 5.8.2,Branch UE5,CompatibleChangelist 55116800)
  • 项目:F:\PX_Trunk\PX\Source\GPFramework\GPGameplay\Character\Movement\
  • 已有资料:PX\Docs\MovementSystem\、PX\Docs\PerfExplore\3p-movesmooth-sweep-skip\(含示意代码,需与现网代码核对)
  • 四份行号级分析底稿在 harness 工作区 research/(autonomous.md / server.md / simproxy.md / project.md),未纳入本笔记库。

相关笔记