输入与焦点

自动关联目录:输入与焦点

1. 定位

UI 打开时,输入该给游戏还是给界面——这个问题没处理好,表现为"点 UI 时角色也动了"或"UI 打开后游戏没反应"。

一句话定位:用 SetInputMode 明确声明输入归属,不要靠 UI 是否可见来隐式决定。

2. 输入模式

模式含义
GameOnly只给游戏
UIOnly只给 UI(鼠标可见、可点)
GameAndUI两者都收(最常用也最容易出问题)
FInputModeGameAndUI Mode;
Mode.SetWidgetToFocus(MyWidget->TakeWidget());
Mode.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock);
PC->SetInputMode(Mode);
PC->bShowMouseCursor = true;
配套说明
bShowMouseCursor是否显示鼠标
SetWidgetToFocus指定焦点控件
SetLockMouseToViewportBehavior鼠标是否锁在视口

打开菜单 → UIOnly;关闭 → GameOnly,这是最不容易出错的写法。GameAndUI 要给游戏输入做额外过滤。

3. CommonUI

CommonUI 是 UE 的多平台 UI 插件,解决手柄/键鼠/触屏下的导航与输入统一:

能力说明
统一的输入路由不同输入设备走同一套动作
导航手柄的焦点导航
输入激活层UI 与游戏输入的分层管理
平台适配不同平台的按键图标与行为

做主机或多平台项目应该用 CommonUI,自己手写导航很快会失控。

4. 焦点

要点说明
焦点决定键盘/手柄输入给谁SetFocus / TakeWidget
打开 UI 时要显式设置焦点否则键盘输入仍进游戏
焦点链导航顺序
失去焦点的时机关闭 UI 要把焦点还给游戏

5. 代价与权衡

设计收益代价什么时候不该用
UIOnly语义最清晰游戏完全收不到输入需要边看 UI 边操作时不行
GameAndUI灵活容易误触发需要额外过滤
CommonUI多平台统一学习成本与插件依赖单平台(仅键鼠)项目可不用
显式设置焦点避免输入丢失要写几行从不做——这是必须的

6. 踩坑与排查

坑现象怎么验证
打开 UI 但输入仍进游戏穿透检查 SetInputMode
UI 打开后游戏完全不动模式选错需要 GameAndUI 或关闭时切回
键盘输入没进 UI没设焦点SetWidgetToFocus
鼠标不显示bShowMouseCursor显式设置
关闭 UI 后输入失效没切回 GameOnly关闭流程要恢复
手柄无法导航没用 CommonUI 或没配导航见上文
鼠标锁死在视口Lock 行为设置调整 SetLockMouseToViewportBehavior

7. 排查顺序

1. 输入穿透?→ SetInputMode 是否设置
2. 键盘没反应?→ 是否 SetWidgetToFocus
3. 关闭后失效?→ 是否恢复到 GameOnly
4. 手柄导航?→ CommonUI
5. 鼠标行为?→ bShowMouseCursor 与 Lock 设置

参考