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;本地当帧完成 |
| DS | MoveAutonomous → PerformMovement → 同一个 PhysWalking | 同一套物理在权威世界重放,AdjustFloorHeight 的结果写进 ReplicatedMovement.Location.Z |
| 3P 模拟端 | SimulateMovement | MoveSmooth 纯水平外推 → 精简 FindFloor → AdjustFloorHeight;最终高度由服务器快照兜底 |
五个关键结论
- 1P 与 DS 跑同一个
PhysWalking,差别只在两端世界的碰撞/其它角色状态;3P 不消费输入、不调CalcVelocity、不走完整的StepUp/CheckFall流程。 - 原生 3P 有本地贴地:
SimulateMovement的FindFloor(:2328)与AdjustFloorHeight(:2364)。但AdjustFloorHeight:6395明确跳过 SimulatedProxy 的bForceNextFloorCheck置位——地面状态的最终裁判仍是下一个网络包。 - 外推是纯水平:
MaintainHorizontalGroundVelocity(:5674)把地面速度 Z 清零 → 终点 Z 继承起点;上坡被 sweep 截断、下坡悬空,本地贴地只能补一部分。 - Capsule ≠ Mesh:
SmoothCorrection:8245把 Capsule 直拍到权威位置,差值记入MeshTranslationOffset,由SmoothClientPosition:8426逐帧衰减;贴地判定只看 Capsule。 - PX 项目移除了 3P 本地贴地:
NewSimulateMovement在MoveSmooth后直接收尾,包间 Z 完全继承,贴地交给下一个网络包;px.SimProxy.MovementEnginePure = 1可一键回退到原生链路。
关键代码位置速查
| 函数 | 行号 | 作用 |
|---|---|---|
PerformMovement | :2790 | 物理帧总入口,:3057 调 StartNewPhysics |
StartNewPhysics | :3554 | :3579 MOVE_Walking → PhysWalking |
PhysWalking | :5692 | walking 主循环,: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 | :2208 | 3P 贴地外推主链路 :2304-2417 |
MoveSmooth | :6951 | :6977 地面 MoveAlongFloor / :6982 空中 sweep |
SmoothCorrection / SmoothClientPosition | :8245 / :8426 | Capsule 直拍 / Mesh 偏移衰减 |
除注明外行号均在
Private\Components\CharacterMovementComponent.cpp;ACharacter::PostNetReceiveLocationAndRotation在Character.cpp:2004,AActor::GatherCurrentMovement在ActorReplication.cpp:438。
相关笔记
- UE 角色移动同步全流程 主控端-DS-3P模拟端 —— 三端同步总览
- MoveAlongFloor —— 沿地面移动
- 多人移动平台 —— MovementBase 相关场景
- 网页知识库搭建说明 —— 本知识库的构建与发布方式