UE 角色移动同步全流程:主控端 → DS → 3P 模拟端
动画版完整文档
在线版(网页知识库):打开交互动画文档 —— 单文件、自包含,含交互沙盘(播放/单步/RTT/位置误差/平滑模式)、位置曲线动画、网络平滑循环动画,以及 14 章详细流程与
文件:行号索引。
本地版:同目录的UE 角色移动同步全流程 主控端-DS-3P模拟端.html,可在 Obsidian 文件浏览器中打开,或交给系统默认浏览器(Obsidian 不支持内嵌 HTML 页面,需外部打开)。
本文件是 Obsidian 检索用的索引与速查;网页知识库由仓库根目录site/下的 Quartz 5 构建。
一句话
UE 的角色移动不是「服务器算好位置发给所有人」,而是三端各司其职的一条闭环:主控端不等服务器、先按输入自己动并保存每次移动的存档;DS 收到输入后在权威世界里重放同一段移动、判断客户端算得对不对;3P 模拟端只接收 DS 定期广播的权威快照,用网格偏移把离散快照补成连续画面。
核心链路
| 端 | LocalRole | 位置来源 | 主要工作 |
|---|---|---|---|
| 主控端 1P | ROLE_AutonomousProxy | 本地预测值(可被纠正) | ControlledCharacterMove → ReplicateMoveToServer → PerformMovement(本帧立即动)→ FSavedMove_Character 存档 → ServerMovePacked 上行 |
| DS | ROLE_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。
容易记错的五点
- UE 5.8 默认走 Packed 路径:
p.NetUsePackedMovementRPCs = 1。打包路径是ServerMovePacked_ServerReceive:9949 → ServerMove_HandleMoveData:9994 → ServerMove_PerformMovement:10033,不是旧的ServerMove_Implementation:10153;响应走ClientMoveResponsePacked。 - 主控端收不到
ReplicatedMovement:该属性是COND_SimulatedOrPhysics(ActorReplication.cpp:593-596),只发给 SimulatedProxy / 物理模拟 Actor。主控端的位置闭环走 Ack / 纠正 RPC,与下行属性复制是两条独立通道。 - Capsule ≠ Mesh:3P 上 Capsule 立即跳到权威位置,Mesh 留在视觉旧位置,差值记进
MeshTranslationOffset并逐帧衰减。碰撞/命中判定用前者,玩家眼睛看到的是后者。 - 纠正不会”跳回过去”:客户端接受权威状态后会把 RTT 期间所有未确认的 SavedMoves 重新
MoveAutonomous一遍,看起来只是轻微回拉。 - 引擎基线不是纯原生:
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),未纳入本笔记库。
相关笔记
- UE 不可靠 UDP 实现 与 TCP 对比 — 底层传输视角
- MoveAlongFloor — 本地移动物理视角
- 多人移动平台 — 基于移动平台(MovementBase)的同步场景