UE 原生贴地移动 1P/3P 逻辑

动画版完整文档

在线版(网页知识库):打开交互动画文档 —— 含地形剖面 + 三泳道时序动画、FindFloor / AdjustFloorHeight 闭环、StepUp 三步演示,可切换「原生 UE / PX 项目」对比 3P 贴地差异。
本地版:同目录 UE 原生贴地移动 1P-3P 逻辑.html。Obsidian 不支持内嵌 HTML 页面,请在文件浏览器中打开或交给系统默认浏览器。
本文件是 Obsidian 检索用的索引与速查;代码基准为 F:\PX_Trunk\UE(UE 5.8.2)。

一句话

UE 的「贴地」不是把角色直接放在地面上,而是允许胶囊底部悬浮在一个很窄的区间内:

MIN_FLOOR_DIST = 1.9f;   MAX_FLOOR_DIST = 2.4f;   // CharacterMovementComponent.cpp:99-100

靠每帧 FindFloor 向下探测 + AdjustFloorHeight 把距离拉回中点 2.15 cm。默认 bAlwaysCheckFloor = true(:799),即每帧都真做向下胶囊 sweep。

三端分工

端入口贴地方式
1P 主控端PerformMovement → StartNewPhysics → PhysWalking完整闭环:CalcVelocity → MoveAlongFloor(含 StepUp)→ FindFloor → AdjustFloorHeight → SetBaseFromFloor;本地当帧完成
DSMoveAutonomous → PerformMovement → 同一个 PhysWalking同一套物理在权威世界重放,AdjustFloorHeight 的结果写进 ReplicatedMovement.Location.Z
3P 模拟端SimulateMovementMoveSmooth 纯水平外推 → 精简 FindFloor → AdjustFloorHeight;最终高度由服务器快照兜底

五个关键结论

  1. 1P 与 DS 跑同一个 PhysWalking,差别只在两端世界的碰撞/其它角色状态;3P 不消费输入、不调 CalcVelocity、不走完整的 StepUp / CheckFall 流程。
  2. 原生 3P 有本地贴地:SimulateMovement 的 FindFloor(:2328)与 AdjustFloorHeight(:2364)。但 AdjustFloorHeight:6395 明确跳过 SimulatedProxy 的 bForceNextFloorCheck 置位——地面状态的最终裁判仍是下一个网络包。
  3. 外推是纯水平:MaintainHorizontalGroundVelocity(:5674)把地面速度 Z 清零 → 终点 Z 继承起点;上坡被 sweep 截断、下坡悬空,本地贴地只能补一部分。
  4. Capsule ≠ Mesh:SmoothCorrection:8245 把 Capsule 直拍到权威位置,差值记入 MeshTranslationOffset,由 SmoothClientPosition:8426 逐帧衰减;贴地判定只看 Capsule。
  5. PX 项目移除了 3P 本地贴地:NewSimulateMovement 在 MoveSmooth 后直接收尾,包间 Z 完全继承,贴地交给下一个网络包;px.SimProxy.MovementEnginePure = 1 可一键回退到原生链路。

关键代码位置速查

函数行号作用
PerformMovement:2790物理帧总入口,:3057 调 StartNewPhysics
StartNewPhysics:3554:3579 MOVE_Walking → PhysWalking
PhysWalking:5692walking 主循环,:5726 子步迭代
MoveAlongFloor:5591:5601 地面法线投影,:5602 sweep,:5642 StepUp
FindFloor:7261:7287 缓存门控,:7290 ComputeFloorDist,:7326 Perch
ComputeFloorDist:7110:7177 向下胶囊 sweep
AdjustFloorHeight:6335:6362 区间判定,:6367 MoveDist,:6397 强制下帧检测
StepUp:7613:7680 上 / :7691 前 / 向下扫回;失败 RevertMove
CheckFall / StartFalling:5432 / :5458走出边缘 → MOVE_Falling
SimulateMovement:22083P 贴地外推主链路 :2304-2417
MoveSmooth:6951:6977 地面 MoveAlongFloor / :6982 空中 sweep
SmoothCorrection / SmoothClientPosition:8245 / :8426Capsule 直拍 / Mesh 偏移衰减

除注明外行号均在 Private\Components\CharacterMovementComponent.cpp;ACharacter::PostNetReceiveLocationAndRotation 在 Character.cpp:2004,AActor::GatherCurrentMovement 在 ActorReplication.cpp:438。

相关笔记