总览
Enhanced Input 解决的是“输入不再是一张全局按键表”的问题。玩家按下 W,不应该永远等于 MoveForward:站着时是移动,开车时是油门,打开背包时也许是 UI 导航,瞄准时还要叠一层灵敏度、死区和触发规则。UE5.8 的 Enhanced Input 把这件事拆成四层:UInputAction 表示要做什么,UInputMappingContext 表示当前场景怎么把按键映射到动作,UEnhancedInputLocalPlayerSubsystem 负责给本地玩家装/卸这些 Context,UEnhancedInputComponent 负责把 Action 事件绑定到 gameplay 代码。
一句话心智模型:Gameplay 只关心 Action,Mapping Context 决定“这时候哪个键触发这个 Action”,Modifier 改输入值,Trigger 决定什么时候算触发,User Settings 负责把玩家自定义键位保存下来。
专题分篇目录
| 篇章 | 你会学到什么 | 读完能做什么 |
|---|---|---|
| 一 | 从零跑通一个第三人称角色 | 创建 IA/IMC、加默认 Mapping Context、绑定 Move/Look/Jump |
| 二 | Input Action 的值类型和事件 | 分清 Boolean、Axis1D/2D/3D 和 Started/Triggered/Completed |
| 三 | Mapping Context、优先级和输入模式 | 会做走路/载具/菜单/瞄准的 Context 切换 |
| 四 | Modifier 和 Trigger 实战 | 会配置 WASD 2D、手柄死区、Hold、Tap、Chord |
| 五 | C++/蓝图绑定与输入栈 | 会写安全的 SetupPlayerInputComponent 和组件优先级 |
| 六 | 玩家改键、保存和 Profile | 会做设置界面的改键、第二键位、重置默认、保存读取 |
| 七 | 按键冲突检测和改键 UI | 会提示占用、保留键、类型不匹配,并决定是否允许覆盖 |
| 八 | 键鼠、手柄和平台差异 | 会处理轴向、灵敏度、设备过滤、键位显示和平台 Redirect |
| 九 | Gameplay 与 UI 输入怎么共存 | 会做暂停菜单、背包、对话、输入模式过滤和 UI 回退 |
| 十 | 多人、调试和生产规范 | 会处理本地多人、网络边界、ShowDebug、PlayerInputDebugger 和上线检查 |
核心架构
Hardware key or axis
-> UInputMappingContext maps key to UInputAction
-> Mapping-level Modifiers run first
-> Action-level Modifiers run after that
-> Triggers decide Started/Ongoing/Triggered/Completed/Canceled
-> UEnhancedInputComponent dispatches bound delegates
-> Gameplay code reads FInputActionValue or FInputActionInstance
源码里 UInputAction 明确写着:Gameplay 代码绑定的是 Input Action,而不是具体按键。UInputMappingContext 是“某个输入上下文里的 key-to-action 集合”。FEnhancedActionKeyMapping 上的 Modifier 会先于 Action 资产上的 Modifier 执行。UEnhancedInputComponent 的注释也提醒:绑定本身不消费输入,真正阻止低优先级映射通常要靠 Mapping Context 优先级或绑定上的 consume 设置。
它和旧输入系统有什么区别
旧系统像一张项目级表:Action Mapping 和 Axis Mapping 放在 Project Settings 里,名字固定,运行时切换靠代码绕。Enhanced Input 则把映射资产化、上下文化、可叠加。你可以同时加载 IMC_Default、IMC_Combat、IMC_Interact,也可以打开菜单时加一个高优先级 IMC_UI,让 Esc、鼠标、手柄导航进入 UI。
更重要的是改键。UE5.8 推荐走 UEnhancedInputUserSettings、UEnhancedPlayerMappableKeyProfile、FMapPlayerKeyArgs 和 FPlayerKeyMapping。旧的 UPlayerMappableInputConfig 在源码里已经标记 deprecated,新的保存入口是 User Settings。
项目落地建议
先按“动作语义”命名 Input Action:IA_Move、IA_Look、IA_Jump、IA_Interact、IA_Aim、IA_Fire。不要命名成 IA_W 或 IA_LeftMouse,那会把物理按键和 gameplay 语义绑死。Mapping Context 按场景命名:IMC_Default、IMC_Combat、IMC_Vehicle、IMC_Menu、IMC_PhotoMode。
生产项目里建议把输入分成四类:基础移动永远在低优先级;临时玩法能力用中优先级;UI/菜单用高优先级;调试输入只在非 Shipping 或开发者模式加。这样“为什么我的 E 键不交互了”可以从 Context 列表和优先级一步步查。
常见坑
- 在 Pawn 上绑定输入,却忘了给 Local Player Subsystem 添加 Mapping Context。
IA_Move设成 Boolean,代码里却Value.Get<FVector2D>()。- 给 WASD 2D 轴忘记
Swizzle和Negate,导致前后左右乱跳。 - 运行时改键直接改
UInputMappingContext::MapKey,没有走 User Settings,玩家下次进游戏丢配置。 - 改键 UI 没做
QueryMapKeyInActiveContextSet,玩家能把射击和跳跃绑到同一个键。 - 多人游戏把输入结果当服务器可信数据,应该让服务器验证 gameplay 行为,而不是相信客户端“我按了什么”。
源码依据
EnhancedInput.uplugin 在 UE5.8 中是 Input 分类、默认启用、非 Beta,运行时模块名为 EnhancedInput。UInputAction 持有值类型、触发器、修饰器和 Player Mappable 设置;UInputMappingContext 持有 DefaultKeyMappings,旧 Mappings 在 5.7 起弃用;UEnhancedInputLocalPlayerSubsystem 提供 Add/Remove Mapping Context、输入模式、User Settings 和 Mapping Query;UEnhancedInputUserSettings 提供 MapPlayerKey、UnMapPlayerKey、SaveSettings、AsyncSaveSettings、Profile 和注册 IMC。
源码路径索引
Engine/Plugins/EnhancedInput/EnhancedInput.upluginEnhancedInput/Public/InputAction.hEnhancedInput/Public/InputMappingContext.hEnhancedInput/Public/EnhancedInputComponent.hEnhancedInput/Public/EnhancedInputSubsystems.hEnhancedInput/Public/UserSettings/EnhancedInputUserSettings.hEnhancedInput/Public/InputModifiers.hEnhancedInput/Public/InputTriggers.hEnhancedInput/Public/InputMappingQuery.h