2.2 Enhanced Input 接入:Tag 驱动的输入系统

核心结论

旧版 Input(Input Axis/Action 映射)的核心问题是"字符串耦合":所有系统都要认识 "Attack" 这个字符串。Enhanced Input 用 Input Action(IA)资产 + Input Mapping Context(IMC)资产 + 输入 Tag 彻底解耦——战斗系统只认 Tag,不认识 IMC。这是分层架构(0102)在输入层的落地。

三件资产

资产 作用 我的组织方式
IA_Attack(Input Action) 一个抽象动作("攻击",不管哪个键) 每个玩法动作一个
IMC_Default(Mapping Context) 按键 -> IA 的映射 按情境分(默认/战斗中/菜单中/驾驶中)
输入 Tag(Gameplay Tag) IA 对应的 Tag(Input.Attack) GA 的 Trigger 直接配 Tag

流程:IA 被触发 -> 角色 ASC 上的 AbilitySystemComponent 直接按 Tag 找到对应 GA 激活。没有一行"if 按键 == X"的代码。

按角色阶段切换 IMC

状态 激活的 IMC 说明
战斗中 IMC_Default 移动/攻击/技能
菜单中 IMC_Menu 上下左右/确认/取消
骑乘/载具 IMC_Vehicle 开车
死亡观战 IMC_Spectator 切镜头

切换时机用事件驱动:UI 打开/关闭、角色死亡复活。所有"我的输入没反应了"的 bug,90% 是 IMC 没切对。

落地步骤(蓝图)

  1. 角色蓝图里挂 InputComponent(默认有)+ Enhanced Input 的 MappingContext 接口。
  2. PC 的 BeginPlay 里 Add Mapping Context:IMC_Default,优先级 0。
  3. IA 资产配好 Trigger(Pressed/Held/Released)与 Value Type。
  4. 角色 EnhancedInputAction 蓝图事件(或 C++ 的 SetupInputComponent)监听 IA。
  5. 监听函数里:只做一件事——TryActivateAbilityByTag(InputTag)。

常见坑与解法

坑 1:按键反应"延迟半拍"

原因:IA 的 Trigger 设成 Held 或用了不合适的 Value Type。

解法:点按类动作用 Pressed;长按蓄力用 Held + Trigger Time;别用 Tick 轮询按键。

坑 2:菜单里还能控制角色

原因:菜单只切了 Widget 没切 IMC。

解法:开菜单同时 Add IMC_Menu(高优先级),关菜单 Remove。UI 与输入是两件事,但常常是同一个开关。

坑 3:手柄/键盘键位冲突

原因:IMC 里同一个键映到两个 IA。

解法:官方输入文档(https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/enhanced-input-in-unreal-engin-c7d0)的映射优先级说明;每个 IMC 内一键一动作,跨 IMC 复用靠切换。

坑 4:键位重绑定(玩家自定义键位)怎么做

解法:Enhanced Input 原生支持运行时改映射(AddPlayerMappedKey/Rebind)。把玩家的键位存设置文件(0102 存档分层里的"玩家偏好")。Lyra 的输入设置(https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/lyra-input-settings-in-unreal-2e04)有完整实现可参考。

相关节点速查

  • 官方 Enhanced Input 指南:https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/enhanced-input-in-unreal-engin-c7d0
  • Lyra 输入:https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/lyra-input-settings-in-unreal-2e04
  • Tag 驱动技能:GA 的 Trigger 配 Gameplay Tag

心得:换成 Tag 驱动输入后,加新技能时输入层完全不用改——新建 GA 配好 Tag 就能用。这种感觉就像系统之间突然会"自动对账"了。Enhanced Input 是 UE5 架构进步的缩影:从字符串走向资产与 Tag。