2、输入映射与动作绑定:配置项目输入设置,绑定键盘鼠标事件到角色动作
好,咱们接着聊。上一章我们把项目骨架搭起来了,角色也能跑了。但有个问题——角色怎么响应你的操作?键盘按W,角色往前走;鼠标一晃,视角跟着转。这背后就是输入映射和动作绑定。
说白了,就是把「你按了什么键」翻译成「角色该干什么事」。这个翻译过程,Unreal 做得挺巧妙。我个人习惯把输入系统分成三层:输入映射(Input Mapping)、动作绑定(Action/Axis Binding)、逻辑响应(Event Graph)。
2.1 项目输入设置:从哪里开始配?
打开 Edit → Project Settings → Engine → Input。你会看到两个大块:Action Mappings 和 Axis Mappings。
- Action Mappings:处理「按下/松开」这种瞬间事件。比如跳跃、射击、交互。
- Axis Mappings:处理「连续变化」的输入。比如移动方向、视角旋转。
我在项目中遇到过不少新手,把跳跃绑成 Axis,结果角色一跳一卡一卡的。记住:开关型用 Action,连续型用 Axis。
核心原则:
- Action:按一次触发一次,适合跳跃、开火、拾取
- Axis:持续输出数值,适合移动、视角、油门
2.2 配置键盘鼠标映射
咱们先配最基础的移动和视角。在 Axis Mappings 里添加:
| 名称 | 键位 | 缩放值 | 说明 |
|---|---|---|---|
| MoveForward | W | 1.0 | 向前走 |
| MoveForward | S | -1.0 | 向后走 |
| MoveRight | D | 1.0 | 向右走 |
| MoveRight | A | -1.0 | 向左走 |
| Turn | Mouse X | 1.0 | 水平视角 |
| LookUp | Mouse Y | 1.0 | 垂直视角 |
嗯,这里要注意:缩放值决定了输入的方向。W 是 +1.0,S 是 -1.0,这样你按 W 时角色朝前,按 S 时朝后。同一个 Axis 可以绑定多个键,Unreal 会自动累加。
Action Mappings 里加一个跳跃:
| 名称 | 键位 | 说明 |
|---|---|---|
| Jump | Space Bar | 跳跃 |
小技巧:我习惯把 Axis 的键位名写成「Mouse X」而不是「MouseX」。中间加个空格,Unreal 的自动补全才认。踩过这个坑的人应该不少。
2.3 在角色蓝图里绑定动作
配置完映射,下一步就是在角色蓝图里「接住」这些输入。打开你的角色蓝图,找到 Event Graph。
右键搜索 Setup Player Input Component 节点。这个节点会在角色被玩家控制时自动调用。你想想看,它就像个「接线员」,把输入映射和你的逻辑连起来。
从 Setup Player Input Component 拉出引脚,添加:
- InputAxis MoveForward → 连到 CharacterMovement 的 AddMovementInput
- InputAxis MoveRight → 同样连到 AddMovementInput,但方向是右向量
- InputAxis Turn → 连到 AddControllerYawInput
- InputAxis LookUp → 连到 AddControllerPitchInput
- InputAction Jump → 连到 Jump 节点
代码大概长这样(蓝图节点逻辑,但用文字描述):
// 伪代码,对应蓝图节点连线
// 移动
InputAxis_MoveForward(Value) {
AddMovementInput(GetActorForwardVector(), Value);
}
InputAxis_MoveRight(Value) {
AddMovementInput(GetActorRightVector(), Value);
}
// 视角
InputAxis_Turn(Value) {
AddControllerYawInput(Value);
}
InputAxis_LookUp(Value) {
AddControllerPitchInput(Value);
}
// 跳跃
InputAction_Jump(KeyEvent) {
if (KeyEvent == IE_Pressed) {
Jump();
} else if (KeyEvent == IE_Released) {
StopJumping();
}
}
注意:我曾经见过有人把 Turn 和 LookUp 直接连到 SetActorRotation。结果角色一转头,整个身体跟着转,移动方向全乱套。正确的做法是用 AddControllerYawInput 和 AddControllerPitchInput,它们只影响控制器的旋转,不影响角色的朝向。角色的朝向由 CharacterMovement 自动处理。
2.4 输入优先级与阻塞
有时候你会遇到这种情况:角色在播放动画时,不希望玩家还能移动。比如开箱子动画、过场动画。这时候就需要 输入阻塞。
Unreal 提供了 Input Priority 和 Enable Input 机制。我常用的做法是:
- 在角色蓝图中添加一个 Custom Event: DisableInput
- 调用 Disable Input 节点,传入 Self 和 Player Controller
- 动画播放完后,调用 Enable Input 恢复
你想想看,如果不做这个处理,玩家在开箱子时还能按 WASD 乱跑,那动画和移动就打架了。嗯,这个坑我踩过不止一次。
最佳实践:
- 在角色蓝图中统一管理输入开关
- 用 Input Disable 而不是把输入映射删掉
- 记得在 BeginPlay 时确保输入是开启状态
2.5 调试输入映射
配置完了怎么验证?打开控制台(~键),输入 showdebug input。屏幕上会显示当前按下的键和对应的 Axis/Action 值。我调试时几乎必开这个。
如果发现某个键没反应,先检查:
- 映射名称拼写是否正确(大小写敏感)
- 角色是否继承了 InputComponent
- Player Controller 是否成功 Possess 了角色
我记得有一次,配了半天角色不动,最后发现是 Player Controller 的 Auto Possess Player 设成了 Disabled。这种低级错误,排查起来最费时间。
2.6 扩展:支持手柄和自定义键位
输入映射天然支持手柄。你只需要在同一个 Axis/Action 下添加手柄对应的键位就行。比如 MoveForward 再加一个 Gamepad Left Thumbstick Y-Axis。
如果你想让玩家自定义键位,可以用 Input Mapping Context(UE5 的增强输入系统)或者自己写一个 SaveGame 来存储键位配置。我个人更推荐 UE5 的增强输入,它把映射和上下文分开了,管理起来更清晰。
不过咱们这章讲的是传统输入系统,增强输入后面会单独开一章聊。先把这个基础打牢。
个人习惯:我一般会在项目初期就把所有输入映射列一个表格,贴在项目 Wiki 上。团队协作时,谁要加新操作,先查表,避免重复定义。比如「跳跃」已经绑了 Space,新来的策划又想绑一个键,一看表就知道冲突了。
好,输入映射和动作绑定就聊到这儿。下一章我们深入角色移动组件,看看怎么让角色跑起来更自然。到时候会聊到加速度、摩擦系数、空气控制这些参数。嗯,都是调优时绕不开的东西。