【用途】 该技能聚焦 Unreal Engine 中基于 C++ 的角色与移动实现,以 ACharacter 及其内置 UCharacterMovementComponent(CMC)为核心。适用于创建行走、奔跑、跳跃、游泳、飞行的玩家或 AI 角色,配置移动参数,切换或自定义移动模式,从 C++ 注入根运动,调试网络预测异常,以及在 CMC 与实验性 Mover 插件之间做选择。载具、无人机等非人形移动体建议使用普通 APawn 或 UFloatingPawnMovement。
【ACharacter 提供的组件】 UCapsuleComponent:根碰撞胶囊体,CMC 假定其垂直对齐,通过 GetCapsuleComponent() 访问。 USkeletalMeshComponent:动画网格体,通过 GetMesh() 访问,需偏移使脚部位于胶囊体底部,且默认朝向 +X。 UCharacterMovementComponent:全部移动逻辑,通过 GetCharacterMovement() 访问。 移动相关类层级为 UMovementComponent → UNavMovementComponent → UPawnMovementComponent → UCharacterMovementComponent;APawn::AddMovementInput 累积输入,由 CMC 每帧消费。
【主要能力】 典型第三人称角色骨架:将 SpringArm 挂到胶囊体根组件而非网格体,设置 TargetArmLength、bUsePawnControlRotation;摄像机挂到 SpringArm;关闭 bUseControllerRotationYaw,开启 bOrientRotationToMovement,并配置 RotationRate、MaxWalkSpeed、JumpZVelocity、GravityScale。
移动输入:在 Enhanced Input 的 2D 轴动作回调中,按控制旋转的偏航构造旋转矩阵,分别沿 X、Y 轴调用 AddMovementInput。视角输入使用 AddControllerYawInput 与 AddControllerPitchInput。AI 通过 UAIController 寻路,导航系统内部驱动 AddMovementInput。
跳跃与下蹲:调用 Jump()/StopJumping();通过 JumpMaxCount 支持多段跳,JumpMaxHoldTime 控制长按高度。下蹲前必须先设置 GetNavAgentPropertiesRef().bCanCrouch = true,否则 Crouch() 会静默无效;之后可调用 Crouch()/UnCrouch()。
移动模式:CMC 以 MovementMode 枚举跟踪 Walking、Falling、Swimming、Flying、Custom 五种状态,分别对应 PhysWalking、PhysFalling、PhysSwimming、PhysFlying、PhysCustom。运行时用 SetMovementMode 切换,SetDefaultMovementMode 恢复默认;OnMovementModeChanged 在 CMC 和 Character 上均会触发。自定义模式需继承 CMC 并重写 PhysCustom,再通过 ObjectInitializer.SetDefaultSubobjectClass 替换默认 CMC 子类。
旋转模式:bOrientRotationToMovement(朝速度方向旋转,典型第三人称)、bUseControllerRotationYaw(角色偏航跟随控制器,典型第一人称或横移)、bUseControllerDesiredRotation(平滑转向控制器)三者互斥,应只选其一。
根运动源:可通过 FRootMotionSource_JumpForce 等根运动源在 C++ 中注入参与预测循环的程序化位移,用 ApplyRootMotionSource 应用,RemoveRootMotionSource 按名称移除;动画蒙太奇驱动的根运动在 RootMotionMode 非 NoRootMotionExtraction 时自动经 CMC 流动。
网络:CMC 内置客户端预测与服务器校正循环(PerformMovement、FSavedMove_Character)。所有移动应通过 AddMovementInput/Jump/LaunchCharacter 驱动以便正确保存与重放;自定义预测状态需继承 FSavedMove_Character 并重写 GetCompressedFlags、SetMoveFor、PrepMoveFor;NetworkMaxSmoothUpdateDistance 控制校正时瞬移与插值的切换;ReplicatedMovementMode 将模式同步到模拟代理。
关键属性:MaxWalkSpeed、MaxWalkSpeedCrouched、MaxAcceleration、GroundFriction、BrakingDecelerationWalking、GravityScale、JumpZVelocity、AirControl、RotationRate、bConstrainToPlane(2D 游戏平面约束)等。
【Mover 插件】 Engine/Plugins/Experimental/Mover/ 中的 Mover 是 CMC 的长期替代方向:不依赖 ACharacter、移动模式为模块化对象而非枚举分支、使用回滚网络(Network Prediction 插件或 Chaos 网络物理)替代 CMC 的客户端 RPC 模型、状态受保护不允许直接改速度。其 API、数据格式与属性仍可能破坏性变更。Epic 表示 Mover 达到生产状态后 CMC 仍将“在可预见的未来”继续受支持;UE 5.8+ 新项目仅在需要模块化架构或非胶囊形状且能接受实验状态时考虑 Mover。
【常见陷阱】 对联网角色使用 SetActorLocation 会绕过预测;同时开启 bOrientRotationToMovement 与 bUseControllerRotationYaw 会导致每帧互相拉扯;未设 bCanCrouch 时下蹲静默失败;SpringArm 挂到网格体会随骨骼旋转;网格体未偏移会导致脚部与朝向错位;自定义 PhysCustom 必须通过 CMC 子类注入而非仅在 Character 中重写;JumpMaxHoldTime 非零却未调用 StopJumping() 会持续累积竖直速度;运行时移动 Static 移动性组件无效,需设为 Movable;水体积重叠会自动改变 CMC 的水中模式。
【版本说明】 UPROPERTY 成员使用 TObjectPtr<T> 为 UE5+ 惯用写法,旧式裸指针仍可编译。GravityDirection(UE 5.x 引入)为 BlueprintReadOnly 属性,可用于墙面行走,并经由 ReplicatedGravityDirection 复制。CharacterMovementConstants::AsyncCharacterMovement CVar 可启用异步 CMC 更新,5.8 中为实验性,建议先关闭测试。引擎头文件行号随补丁版本漂移,路径与类/函数名相对稳定。
【官方文档】 Characters:https://dev.epicgames.com/documentation/unreal-engine/characters-in-unreal-engine Gameplay Framework:https://dev.epicgames.com/documentation/unreal-engine/gameplay-framework-in-unreal-engine Mover:https://dev.epicgames.com/documentation/unreal-engine/mover-in-unreal-engine Mover 与 CMC 对比:https://dev.epicgames.com/documentation/unreal-engine/comparing-mover-and-character-movement-component-in-unreal-engine 网络与多人:https://dev.epicgames.com/documentation/unreal-engine/networking-and-multiplayer-in-unreal-engine
【限制】 资料未提供收费、价格、平台支持范围、性能数据或使用效果等信息,暂未提供。