总览
UE5.8 的 Common UI 仍支持传统 DataTable Action,但它也明确接入 Enhanced Input。项目如果已经用 Enhanced Input 做移动、战斗、改键,UI 最好也逐步用 UInputAction 表示确认、返回、翻页、菜单导航。
开关在哪里
Project Settings > Common Input:
[/Script/CommonInput.CommonInputSettings]
bEnableEnhancedInputSupport=True
开启后,CommonUIInputData 会显示:
EnhancedInputClickActionEnhancedInputBackAction
UCommonActivatableWidget 注册 Back Action 时,源码会优先使用 Enhanced Input Back Action;没有再回退到 DataTable DefaultBackAction。
UI Action 命名建议
| Action | 值类型 | 用途 |
|---|---|---|
IA_UI_Click | Boolean | 确认/点击 |
IA_UI_Back | Boolean | 返回/取消 |
IA_UI_NextTab | Boolean | 下一个 Tab |
IA_UI_PreviousTab | Boolean | 上一个 Tab |
IA_UI_Navigate | Axis2D | 菜单导航 |
IA_UI_HoldConfirm | Boolean + Hold | 长按确认 |
UI Action 不要直接复用 IA_Fire 或 IA_Jump。可以绑定同一个物理键,但语义应分开,这样 ActionBar 和改键 UI 才能说清楚。
页面专属 InputMapping
Activatable Widget 的 InputMapping 属性适合给页面加专属 IMC。比如地图页有缩放、拖拽、筛选;相册页有上一张下一张;设置页有恢复默认。
// 页面激活时 Common UI 自动 AddMappingContext
// 页面停用时自动 RemoveMappingContext
UPROPERTY(EditDefaultsOnly, Category="Input")
TObjectPtr<UInputMappingContext> InputMapping;
优先级由 InputMappingPriority 控制。UI 页面专属 IMC 通常比 gameplay 默认 IMC 高。
CommonInputMetadata 是什么
UCommonInputMetadata 可以挂到 Enhanced Input Mapping Context Metadata 里。关键字段:
NavBarPrioritybIsGenericInputAction
源码注释说 Generic Actions 例如 accept 或 face button top 可能被多个 UI 元素订阅,它们不会广播 Enhanced Input 的 Triggered/Ongoing/Canceled/Completed 委托,避免多个 UI 绑定重复触发。非 Generic Action 会走 Enhanced Input 事件,但不会触发 Common UI action binding。
简单说:UI 的确认/返回这种公共动作设 Generic;页面内独占动作如果要走 Enhanced Input 回调,可以设非 Generic。
ActionBar 图标怎么来
当 binding 使用 UInputAction 时,Common UI 会通过 Enhanced Input 当前映射解析 FKey,再通过 CommonInput ControllerData 找图标。这样玩家改键后,ActionBar 能显示新的键。
如果 ActionBar 不更新,排查顺序:
- Common Input 是否启用了 Enhanced Input Support。
- InputAction 是否在当前 LocalPlayer 的激活 IMC 中有映射。
- IMC 是否被页面或 Subsystem 添加。
- 当前 ControllerData 是否有该 FKey 的 Brush。
UI 和 Gameplay 怎么分边界
打开菜单时,UI 可以设置 ECommonInputMode::Menu,阻止普通 gameplay 输入。游戏内轮盘或地图预览可能用 All,允许右摇杆旋转镜头或角色预览。不要只靠“按钮点击时消费输入”解决全局模式问题,输入模式应该由当前 leaf-most 页面声明。
常见坑
bEnableEnhancedInputSupport改完没重启,源码设置标注需要 restart。- UI Action 复用 Gameplay Action,菜单确认同时触发跳跃/开火。
- 页面专属 IMC 在页面停用前又被别处 Remove,导致 ActionBar 键位丢失。
- CommonInputMetadata 的
bIsGenericInputAction没理解,导致 Enhanced Input 委托和 Common UI binding 重复/缺失。 - 改键系统只改 gameplay IMC,忘记注册 UI IMC。
源码依据
UCommonInputSettings 有 bEnableEnhancedInputSupport,并提供 GetEnhancedInputClickAction 和 GetEnhancedInputBackAction。UCommonActivatableWidget::NativeConstruct 在 Back Handler 场景优先注册 Enhanced Input Back Action。CommonUITypes.h 定义 UCommonInputMetadata 和 UCommonMappingContextMetadata,并说明 Generic Input Action 与 Enhanced Input 事件的关系。UIActionRouterTypes.cpp 会在 Enhanced Input 模式下解析 InputAction 的显示名、映射键和 Hold 键。
源码路径索引
CommonInput/Public/CommonInputSettings.hCommonInput/Public/CommonInputBaseTypes.hCommonUI/Public/CommonUITypes.hCommonUI/Public/CommonActivatableWidget.hCommonUI/Private/Input/UIActionRouterTypes.cpp