运行时动态管理 IMC

所有 API 都在 LocalPlayer 的子系统

UEnhancedInputLocalPlayerSubsystem* Sub = LP->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>();
Sub->AddMappingContext(Context, Priority);
Sub->RemoveMappingContext(Context);
Sub->RemoveAllMappings();                       // 清空全部
TArray<FMappingContextStackEntry> Stack = Sub->GetAllActionMappings();  // 查询

只在客户端(LocalPlayer)做——输入本来就是本地概念,服务器不参与 IMC(服务器的输入由客户端的 RPC 带过去)。

动态重映射:让玩家自定义按键

因为 IMC 是资产,可以运行时修改其映射:

// 把 IA_Fire 从左键改成右键
UInputMappingContext* Ctx = LoadObject...;
for (FEnhancedActionKeyMapping& M : Ctx->Map)
{
    if (M.Action == IA_Fire) M.Key = FKey("RightMouseButton");
}
// 重建
Sub->AddMappingContext(Ctx, ...);   // 重新添加生效

存档:把"动作 → 按键"表序列化。这套自定义按键系统在旧输入里要自己从零造,Enhanced Input 里是读改资产 + 重新添加。

实践中更稳妥的做法是复制一份 IMC 资产运行时改,不动原始资产(避免误保存回磁盘)。

按键提示 UI 自动化

UI 显示"按 [E] 交互"时,E 的来源可以自动:

// 查 IA_Interact 在当前 IMC 里的按键
Subsystem->QueryKeysMappedToAction(IA_Interact, OutKeys);   // 蓝图也有 Query 节点

玩家改了键,提示自动对——旧系统里这个 E 是写死的字符串。

一个调试视图

控制台命令 showdebug enhancedinput:显示当前所有 IMC 的启用状态、映射、优先级。排查"按键没反应"第一工具。

本章小结

  • 动态管理三 API:Add / Remove / RemoveAll,都在 LocalPlayer 的子系统。
  • 玩家自定义按键 = 运行时改 IMC 的 Map 并重新添加(建议改副本)。
  • showdebug enhancedinput 是输入排查的"第一工具"。