UE5.8 Common UI 喂饭级专题

UE5.8 Common UI 专题(七):和 Enhanced Input 怎么接

讲清 bEnableEnhancedInputSupport、EnhancedInputClick/BackAction、CommonInputMetadata、UCommonMappingContextMetadata、Activatable InputMapping、UI Action 与 Gameplay Action 如何共存。

总览

UE5.8 的 Common UI 仍支持传统 DataTable Action,但它也明确接入 Enhanced Input。项目如果已经用 Enhanced Input 做移动、战斗、改键,UI 最好也逐步用 UInputAction 表示确认、返回、翻页、菜单导航。

UE5.8 Common UI 专题(七):和 Enhanced Input 怎么接 配图
Common UI 和 Enhanced Input 的边界:Enhanced Input 负责映射,Common UI 负责当前激活 UI 怎么消费和展示这些动作。

开关在哪里

Project Settings > Common Input:

[/Script/CommonInput.CommonInputSettings]
bEnableEnhancedInputSupport=True

开启后,CommonUIInputData 会显示:

  • EnhancedInputClickAction
  • EnhancedInputBackAction

UCommonActivatableWidget 注册 Back Action 时,源码会优先使用 Enhanced Input Back Action;没有再回退到 DataTable DefaultBackAction。

UI Action 命名建议

Action值类型用途
IA_UI_ClickBoolean确认/点击
IA_UI_BackBoolean返回/取消
IA_UI_NextTabBoolean下一个 Tab
IA_UI_PreviousTabBoolean上一个 Tab
IA_UI_NavigateAxis2D菜单导航
IA_UI_HoldConfirmBoolean + Hold长按确认

UI Action 不要直接复用 IA_FireIA_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 里。关键字段:

  • NavBarPriority
  • bIsGenericInputAction

源码注释说 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 不更新,排查顺序:

  1. Common Input 是否启用了 Enhanced Input Support。
  2. InputAction 是否在当前 LocalPlayer 的激活 IMC 中有映射。
  3. IMC 是否被页面或 Subsystem 添加。
  4. 当前 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。

源码依据

UCommonInputSettingsbEnableEnhancedInputSupport,并提供 GetEnhancedInputClickActionGetEnhancedInputBackActionUCommonActivatableWidget::NativeConstruct 在 Back Handler 场景优先注册 Enhanced Input Back Action。CommonUITypes.h 定义 UCommonInputMetadataUCommonMappingContextMetadata,并说明 Generic Input Action 与 Enhanced Input 事件的关系。UIActionRouterTypes.cpp 会在 Enhanced Input 模式下解析 InputAction 的显示名、映射键和 Hold 键。

源码路径索引

  • CommonInput/Public/CommonInputSettings.h
  • CommonInput/Public/CommonInputBaseTypes.h
  • CommonUI/Public/CommonUITypes.h
  • CommonUI/Public/CommonActivatableWidget.h
  • CommonUI/Private/Input/UIActionRouterTypes.cpp