运行时动态管理 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是输入排查的"第一工具"。
