UI 与游戏的输入焦点

"打开菜单后按 WASD 不该动角色"——这涉及 InputMode 与 IMC 的配合。

三种 InputMode

模式 行为
Game Only 输入全给游戏(默认)
UI Only 输入全给 UI
UI and Game 鼠标给 UI 点选,键盘/手柄给游戏(常见于"光标可用但角色能动")
FInputModeGameAndUI Mode;
Mode.SetWidgetToFocus(MenuWidget->TakeWidget());
Mode.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock);
PC->SetInputMode(Mode);
PC->bShowMouseCursor = true;

IMC 优先级配合

打开暂停菜单时:AddMappingContext(IMC_UI, 100),把 Esc/UI 的按键让给 UI IMC;菜单关掉时 Remove。配合 InputMode,"游戏/菜单"两套输入干净切换。

三条经验

  1. UI 打开必做三件事:SetInputMode + 显示鼠标 + 加 IMC_UI;关闭反之。写成一个函数对(OpenMenu/CloseMenu)以免漏一步;
  2. UI 的按钮按键盘键也能触发:UMG 的 Button 默认响应键盘"确认"(焦点在按钮上时);
  3. 手柄焦点导航:UI 里用手柄方向键导航需要 Widget 有"Is Focusable",用 Common UI 更省事。

常见症状

症状 修复
菜单打开角色还在动 InputMode 没设 / WASD 映射没被 UI 上下文抢占
鼠标点不到按钮 InputMode 还是 Game Only,或鼠标光标未显示
手柄在 UI 里无法选 Widget 未启用 Focusable,缺少 ControllerNavigation

本章小结

  • UI 焦点 = InputMode + IMC 优先级 + 鼠标光标三件套,开关成对出现。
  • 手柄 UI 导航需 Widget 可聚焦;Common UI 是省事方案。