虚幻引擎Character详解

虚幻引擎5中,Character 是一个专门为类人双足角色设计的高级 Pawn 子类。它帮你封装好了一套完整的移动、碰撞、动画和网络同步机制,让你不必从零搭建。

下面按结构、核心组件、移动系统、输入、动画、网络同步等模块来拆解。


一、Character 继承关系与职责

text
UObject → AActor → APawn → ACharacter
  • AActor:可以在世界中存在的实体。

  • APawn:可以被控制器(玩家/AI)操控的 Actor。

  • ACharacter:针对双足站立行走的角色,内置了:

    • 统一的胶囊体碰撞(CapsuleComponent)

    • 骨骼网格体

    • 角色移动组件(CharacterMovementComponent)

    • 基础跳跃、蹲伏、攀爬等能力框架

当你需要一个能跑、跳、受重力影响且有动画的角色时,ACharacter 就是最佳起点。


二、ACharacter 的核心组件

在构造函数中,ACharacter 会自动创建并装配以下组件:

组件 类型 作用
CapsuleComponent UCapsuleComponent 根组件,作为碰撞和移动的基准形体。角色移动、碰撞检测都基于它。
Mesh USkeletalMeshComponent 骨骼网格体,负责渲染和动画。默认是 CapsuleComponent 的子级
CharacterMovement UCharacterMovementComponent 角色的“物理大脑”:处理移动模式、加速度、速度、重力、网络预测等。
ArrowComponent 编辑器辅助 仅可视,指示朝向,不影响运行时。

关键结构关系:
Capsule 为根,Mesh 挂在它下面。移动和碰撞只依赖 Capsule,而骨骼形体可以自由地随动画运动(相对偏移),这就是“Root Motion”和应用物理的基础。


三、CharacterMovementComponent(灵魂所在)

这是 ACharacter 最强大的部分,它并不是纯物理模拟(不是刚体),而是一种运动学移动方案,带重力、摩擦力、步高、斜坡处理等。

主要移动模式(MovementMode)

  • MOVE_Walking:行走/奔跑,斜坡、楼梯自动处理。

  • MOVE_NavWalking:导航网格行走(一般给 AI 用)。

  • MOVE_Falling:空中,受重力,可空中控制。

  • MOVE_Flying:飞行,无视重力,自由六自由度移动。

  • MOVE_Swimming:水中,浮力、游泳速度等。

  • MOVE_Custom:完全自定义移动逻辑。

核心参数(编辑器或代码中调整)

  • MaxWalkSpeed:最大行走速度。

  • MaxAcceleration:地面加速度。

  • BrakingDeceleration:松手后的制动力。

  • JumpZVelocity:跳跃初速度。

  • GravityScale:重力倍率(1.0 = 标准重力)。

  • AirControl:空中移动响应力度(0~1)。

  • CanCrouch / CrouchedHalfHeight:下蹲功能及高度。

重要方法

  • AddMovementInput():最常用的输入驱动。

  • DoJump() / Crouch() / UnCrouch():跳跃、下蹲。

  • LaunchCharacter(FVector LaunchVelocity, bool bOverrideXY, bool bOverrideZ):施加爆发力(击飞、弹跳器)。

  • GetLastMovementInputVector():获取上一次移动输入方向。


四、输入绑定 —— UE5 推荐 Enhanced Input

UE5 主推 Enhanced Input(增强输入系统),相比旧版 Action/Axis 映射更灵活。

典型设置步骤(蓝图或C++):

  1. 创建 InputAction(例如 IA_Move、IA_Look、IA_Jump)。

  2. 创建 InputMappingContext(IMC),将 InputAction 和键位绑定。

  3. 在角色蓝图(或C++的 SetupPlayerInputComponent())中添加映射上下文。

  4. 通过回调或 BindAction 处理输入。

C++ 示例:

cpp
void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
    Super::SetupPlayerInputComponent(PlayerInputComponent);
    if (UEnhancedInputComponent* EnhancedInput = Cast<UEnhancedInputComponent>(PlayerInputComponent))
    {
        EnhancedInput->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AMyCharacter::Move);
        EnhancedInput->BindAction(LookAction, ETriggerEvent::Triggered, this, &AMyCharacter::Look);
        EnhancedInput->BindAction(JumpAction, ETriggerEvent::Started, this, &ACharacter::Jump);
        EnhancedInput->BindAction(JumpAction, ETriggerEvent::Completed, this, &ACharacter::StopJumping);
    }
}

在 Move() 里:

cpp
void AMyCharacter::Move(const FInputActionValue& Value)
{
    FVector2D MovementVector = Value.Get<FVector2D>();
    if (Controller)
    {
        const FRotator YawRotation(0, Controller->GetControlRotation().Yaw, 0);
        const FVector ForwardDir = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
        const FVector RightDir = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
        AddMovementInput(ForwardDir, MovementVector.Y);
        AddMovementInput(RightDir, MovementVector.X);
    }
}

五、动画集成(Animation Blueprint)

ACharacter 和动画蓝图深度绑定,通常借助 AnimInstance 获取角色状态。

动画蓝图中可访问的关键变量:

  • Speed:水平速度大小,用于切换待机/行走/奔跑。

  • Direction:朝向与速度方向夹角,处理走跑转向。

  • bIsInAir / IsFalling:是否在空中(跳跃/落下状态)。

  • bIsCrouching:下蹲状态。

  • VelocityAcceleration 等。

Root Motion(根骨骼运动):
如果动画包含根骨骼位移,CharacterMovement 可以接管这部分运动,常用于攻击连段、翻越等“不由输入直接控制”的运动。需在动画资源中勾选 EnableRootMotion,并在 AnimBP 中启用 Root Motion 节点。

Anim Notify / State Event:
用于脚步声、伤害帧判定、技能触发等。


六、网络同步(多人游戏基础)

角色移动的复制采用了 客户端预测 + 服务器校验(Server Reconcile) 模型,你几乎不需要手动干预就能平滑工作。

复制流程:

  1. 客户端:本地立即执行移动(预测),渲染流畅。

  2. 客户端:构建 FCharacterMoveResponseData 打包操作发送给服务器(ServerMove RPC)。

  3. 服务器:执行相同的移动,检验位置/状态。

  4. 服务器:如果差异过大,发送校正数据(ClientAdjustPosition),客户端会回溯并重新应用预测。

主要依赖:

  • CharacterMovementComponent 的 bReplicateMovement 默认为 true。

  • APawn 的 bReplicateMovement 控制是否复制整体位置。

  • 需要确保 ACharacter 派生类中设置 bReplicates = true

常见网络问题:

  • 角色在客户端瞬移或抖动:通常是预测校正触发,调整 MaxPredictionError 或确保碰撞一致。

  • 动作不同步:跳跃、蹲伏等也通过 ServerMove 发送,自定义动作需要用 RPC 或自定义移动数据发送。


七、常见功能实现技巧

1. 自定义蹲伏高度

cpp
CharacterMovement->GetNavAgentPropertiesRef().bCanCrouch = true;
CharacterMovement->CrouchedHalfHeight = 40.f;

2. 调整趴下(Prone)

把趴下当作蹲伏的扩展,自定义移动模式或使用 MOVE_Custom 并修改胶囊体高度。

3. 翻越/攀爬(Mantle)

利用射线检测前方障碍高度,再用 LaunchCharacter 或 Root Motion 插值移动,或者用新的 Motion Warping 插件(UE5)处理。

4. 击退/弹飞

cpp
FVector Knockback = ImpactDirection * KnockbackForce;
LaunchCharacter(Knockback, true, true);

5. 冲刺

动态修改 MaxWalkSpeed:绑定 Shift 按下事件,将速度提升为跑动速度。


八、UE5 特色变化 / 新系统

  • Enhanced Input:替代旧输入,推荐作为人物输入方案。

  • Motion Warping(运动扭曲):允许在动画根骨骼运动中动态调整目标位置,实现精准的翻越、近战打击吸附。

  • Chaos Physics:默认物理引擎,但 CharacterMovement 依然保持运动学模式,可以使用 PhysicalAnimation 混合物理与动画。

  • 角色网络改进:新的 Iris 复制系统(实验性)在特定配置下可以优化角色移动复制。


九、最佳实践总结

  1. 不要随意旋转或移动 Capsule:移动工作交给 AddMovementInput 和 CharacterMovement,旋转由 Controller->SetControlRotation 控制。

  2. Mesh 相对位置偏移:常用 (0,0,-90) 让网格体对齐胶囊底部。保持 Mesh 原点在脚底。

  3. 动画蓝图只读不写移动速度:通过读取 Velocity 驱动状态机,不要直接修改 Speed 等变量。

  4. 物理模拟只在需要时开启:例如布娃娃死亡,需禁用 CharacterMovement 并设置 Mesh 物理模拟。

  5. 网络游戏里禁用客户端的 Tick 移动计算:默认组件已处理好,不要额外写。

感谢您的来访,获取更多精彩文章请收藏本站。

THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容