UE5.8 Enhanced Input 喂饭级专题

UE5.8 Enhanced Input 增强输入喂饭级入门到实战专题

基于 UE5.8 EnhancedInput 源码,从创建 Input Action 和 Mapping Context 讲到角色绑定、Modifier、Trigger、运行时改键、冲突检测、手柄/键鼠、UI 输入、多人和调试生产规范。

总览

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 负责把玩家自定义键位保存下来。

UE5.8 Enhanced Input 增强输入喂饭级入门到实战专题 配图
Enhanced Input 的学习路线:先把 IA/IMC 跑起来,再处理优先级、修饰器、触发器、改键和生产调试。

专题分篇目录

篇章 你会学到什么 读完能做什么
从零跑通一个第三人称角色 创建 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_DefaultIMC_CombatIMC_Interact,也可以打开菜单时加一个高优先级 IMC_UI,让 Esc、鼠标、手柄导航进入 UI。

更重要的是改键。UE5.8 推荐走 UEnhancedInputUserSettingsUEnhancedPlayerMappableKeyProfileFMapPlayerKeyArgsFPlayerKeyMapping。旧的 UPlayerMappableInputConfig 在源码里已经标记 deprecated,新的保存入口是 User Settings。

项目落地建议

先按“动作语义”命名 Input Action:IA_MoveIA_LookIA_JumpIA_InteractIA_AimIA_Fire。不要命名成 IA_WIA_LeftMouse,那会把物理按键和 gameplay 语义绑死。Mapping Context 按场景命名:IMC_DefaultIMC_CombatIMC_VehicleIMC_MenuIMC_PhotoMode

生产项目里建议把输入分成四类:基础移动永远在低优先级;临时玩法能力用中优先级;UI/菜单用高优先级;调试输入只在非 Shipping 或开发者模式加。这样“为什么我的 E 键不交互了”可以从 Context 列表和优先级一步步查。

常见坑

  • 在 Pawn 上绑定输入,却忘了给 Local Player Subsystem 添加 Mapping Context。
  • IA_Move 设成 Boolean,代码里却 Value.Get<FVector2D>()
  • 给 WASD 2D 轴忘记 SwizzleNegate,导致前后左右乱跳。
  • 运行时改键直接改 UInputMappingContext::MapKey,没有走 User Settings,玩家下次进游戏丢配置。
  • 改键 UI 没做 QueryMapKeyInActiveContextSet,玩家能把射击和跳跃绑到同一个键。
  • 多人游戏把输入结果当服务器可信数据,应该让服务器验证 gameplay 行为,而不是相信客户端“我按了什么”。

源码依据

EnhancedInput.uplugin 在 UE5.8 中是 Input 分类、默认启用、非 Beta,运行时模块名为 EnhancedInputUInputAction 持有值类型、触发器、修饰器和 Player Mappable 设置;UInputMappingContext 持有 DefaultKeyMappings,旧 Mappings 在 5.7 起弃用;UEnhancedInputLocalPlayerSubsystem 提供 Add/Remove Mapping Context、输入模式、User Settings 和 Mapping Query;UEnhancedInputUserSettings 提供 MapPlayerKeyUnMapPlayerKeySaveSettingsAsyncSaveSettings、Profile 和注册 IMC。

源码路径索引

  • Engine/Plugins/EnhancedInput/EnhancedInput.uplugin
  • EnhancedInput/Public/InputAction.h
  • EnhancedInput/Public/InputMappingContext.h
  • EnhancedInput/Public/EnhancedInputComponent.h
  • EnhancedInput/Public/EnhancedInputSubsystems.h
  • EnhancedInput/Public/UserSettings/EnhancedInputUserSettings.h
  • EnhancedInput/Public/InputModifiers.h
  • EnhancedInput/Public/InputTriggers.h
  • EnhancedInput/Public/InputMappingQuery.h