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,"游戏/菜单"两套输入干净切换。
三条经验
- UI 打开必做三件事:SetInputMode + 显示鼠标 + 加 IMC_UI;关闭反之。写成一个函数对(OpenMenu/CloseMenu)以免漏一步;
- UI 的按钮按键盘键也能触发:UMG 的 Button 默认响应键盘"确认"(焦点在按钮上时);
- 手柄焦点导航:UI 里用手柄方向键导航需要 Widget 有"Is Focusable",用 Common UI 更省事。
常见症状
| 症状 | 修复 |
|---|---|
| 菜单打开角色还在动 | InputMode 没设 / WASD 映射没被 UI 上下文抢占 |
| 鼠标点不到按钮 | InputMode 还是 Game Only,或鼠标光标未显示 |
| 手柄在 UI 里无法选 | Widget 未启用 Focusable,缺少 ControllerNavigation |
本章小结
- UI 焦点 = InputMode + IMC 优先级 + 鼠标光标三件套,开关成对出现。
- 手柄 UI 导航需 Widget 可聚焦;Common UI 是省事方案。
