虚幻引擎5中,Character 是一个专门为类人双足角色设计的高级 Pawn 子类。它帮你封装好了一套完整的移动、碰撞、动画和网络同步机制,让你不必从零搭建。
下面按结构、核心组件、移动系统、输入、动画、网络同步等模块来拆解。
一、Character 继承关系与职责
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++):
-
创建
InputAction(例如 IA_Move、IA_Look、IA_Jump)。 -
创建
InputMappingContext(IMC),将 InputAction 和键位绑定。 -
在角色蓝图(或C++的
SetupPlayerInputComponent())中添加映射上下文。 -
通过回调或
BindAction处理输入。
C++ 示例:
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() 里:
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:下蹲状态。
-
Velocity、Acceleration 等。
Root Motion(根骨骼运动):
如果动画包含根骨骼位移,CharacterMovement 可以接管这部分运动,常用于攻击连段、翻越等“不由输入直接控制”的运动。需在动画资源中勾选 EnableRootMotion,并在 AnimBP 中启用 Root Motion 节点。
Anim Notify / State Event:
用于脚步声、伤害帧判定、技能触发等。
六、网络同步(多人游戏基础)
角色移动的复制采用了 客户端预测 + 服务器校验(Server Reconcile) 模型,你几乎不需要手动干预就能平滑工作。
复制流程:
-
客户端:本地立即执行移动(预测),渲染流畅。
-
客户端:构建
FCharacterMoveResponseData打包操作发送给服务器(ServerMove RPC)。 -
服务器:执行相同的移动,检验位置/状态。
-
服务器:如果差异过大,发送校正数据(
ClientAdjustPosition),客户端会回溯并重新应用预测。
主要依赖:
-
CharacterMovementComponent的bReplicateMovement默认为 true。 -
APawn的bReplicateMovement控制是否复制整体位置。 -
需要确保
ACharacter派生类中设置bReplicates = true。
常见网络问题:
-
角色在客户端瞬移或抖动:通常是预测校正触发,调整
MaxPredictionError或确保碰撞一致。 -
动作不同步:跳跃、蹲伏等也通过 ServerMove 发送,自定义动作需要用 RPC 或自定义移动数据发送。
七、常见功能实现技巧
1. 自定义蹲伏高度
CharacterMovement->GetNavAgentPropertiesRef().bCanCrouch = true; CharacterMovement->CrouchedHalfHeight = 40.f;
2. 调整趴下(Prone)
把趴下当作蹲伏的扩展,自定义移动模式或使用 MOVE_Custom 并修改胶囊体高度。
3. 翻越/攀爬(Mantle)
利用射线检测前方障碍高度,再用 LaunchCharacter 或 Root Motion 插值移动,或者用新的 Motion Warping 插件(UE5)处理。
4. 击退/弹飞
FVector Knockback = ImpactDirection * KnockbackForce; LaunchCharacter(Knockback, true, true);
5. 冲刺
动态修改 MaxWalkSpeed:绑定 Shift 按下事件,将速度提升为跑动速度。
八、UE5 特色变化 / 新系统
-
Enhanced Input:替代旧输入,推荐作为人物输入方案。
-
Motion Warping(运动扭曲):允许在动画根骨骼运动中动态调整目标位置,实现精准的翻越、近战打击吸附。
-
Chaos Physics:默认物理引擎,但 CharacterMovement 依然保持运动学模式,可以使用
PhysicalAnimation混合物理与动画。 -
角色网络改进:新的
Iris复制系统(实验性)在特定配置下可以优化角色移动复制。
九、最佳实践总结
-
不要随意旋转或移动 Capsule:移动工作交给
AddMovementInput和CharacterMovement,旋转由Controller->SetControlRotation控制。 -
Mesh 相对位置偏移:常用
(0,0,-90)让网格体对齐胶囊底部。保持 Mesh 原点在脚底。 -
动画蓝图只读不写移动速度:通过读取
Velocity驱动状态机,不要直接修改Speed等变量。 -
物理模拟只在需要时开启:例如布娃娃死亡,需禁用
CharacterMovement并设置 Mesh 物理模拟。 -
网络游戏里禁用客户端的 Tick 移动计算:默认组件已处理好,不要额外写。
感谢您的来访,获取更多精彩文章请收藏本站。









暂无评论内容