多上下文叠加与优先级
IMC 的"上下文"机制是 Enhanced Input 最有价值的设计之一。
叠加与优先级
同一玩家身上可同时启用多个 IMC:
// 启用:指定优先级(数字越大越优先)
Subsystem->AddMappingContext(IMC_Player, 0);
Subsystem->AddMappingContext(IMC_Vehicle, 1); // 开车时
Subsystem->AddMappingContext(IMC_UI, 10); // UI 打开时
优先级规则:高优先级 IMC 的按键映射会"抢占"低优先级的同键映射。例如 UI 打开时 Esc 给 UI(优先级 10),不给游戏(优先级 0)。
典型上下文设计
| 上下文 | 内容 | 何时启用 |
|---|---|---|
| IMC_Default | 移动、跳跃、看视角 | 始终 |
| IMC_Combat | 开火、瞄准、换弹 | 战斗中(或始终) |
| IMC_Vehicle | 油门、刹车、喇叭 | 上车 |
| IMC_UI | 确认、取消、导航 | 打开菜单 |
| IMC_Dialogue | 选项选择 | 对话中 |
| IMC_PhotoMode | 相机操作 | 拍照模式 |
对比旧系统:每种状态过去要手动开关五六个动作映射,现在一行 Add/Remove,而且"漏关"的 bug 从机制上消失(Remove 整个 IMC 就全关了)。
蓝图/C++ 替代品
蓝图:
Get Enhanced Input Local Player Subsystem → Add Mapping Context(IMC, 优先级)
Get Enhanced Input Local Player Subsystem → Remove Mapping Context(IMC)
C++:
if (ULocalPlayer* LP = PC->GetLocalPlayer())
{
if (UEnhancedInputLocalPlayerSubsystem* Sub = LP->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>())
{
Sub->AddMappingContext(IMC_Vehicle, 1);
}
}
一个常见错误:上下文全堆在一个 IMC 里
把所有按键放一个 IMC,再"用优先级互相覆盖"——失去了"整体开关"的便利。原则:按"同开同关"分组,能整体 Add/Remove 的就分一个 IMC。
本章小结
- IMC 支持叠加 + 优先级抢占:高优先级覆盖同键低优先级。
- 典型设计:Default 始终、Combat/Vehicle/UI 按状态切换。
- 按同开同关分组建 IMC,别全堆一个。
