多上下文叠加与优先级

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,别全堆一个。