总览
Enhanced Input 允许一个 IA_Fire 同时绑定 Left Mouse、Gamepad Right Trigger 和触摸按钮。好处是 gameplay 只看 FireAction;坏处是你必须认真处理不同设备的输入值、死区、灵敏度、图标和平台差异。
键鼠和手柄的值不同
键盘按键通常是 Boolean 或 1D 数字键值:没按是 0,按下是 1。鼠标移动是 delta。手柄摇杆是连续 Axis2D,扳机常是 Axis1D。不要把这些差异藏进 gameplay 里,尽量在 Modifier 和设备设置里消化。
手柄死区
摇杆漂移几乎一定会遇到。给 Look/Move 的手柄映射加 Dead Zone Modifier。源码里 Dead Zone 有三种类型:Axial、Radial、UnscaledRadial。一般移动摇杆推荐 Radial,因为它按整体向量长度处理,比每轴独立更平滑。
灵敏度和反转
鼠标和手柄的 LookAction 不应该共用同一组 Scalar。鼠标 delta 通常要按 DPI 和游戏设置缩放;手柄摇杆通常要 Response Curve、DeadZone 和单独的水平/垂直速度。
项目建议:
IA_Look语义统一。- 鼠标映射上放鼠标专用 Scalar。
- 手柄映射上放 DeadZone、ResponseCurve、手柄 Scalar。
- 玩家设置里的 InvertY 通过自定义 Modifier 或运行时设置进入 Modifier。
HardwareDeviceId
FMapPlayerKeyArgs 和 FPlayerKeyMapping 都有 Hardware Device 相关字段。默认项目可以先不区分,但如果你要同时保存“键鼠方案”和“手柄方案”,就应该在 DetermineHardwareDeviceForActionMapping 子类里按 FKey 或 Metadata 决定硬件设备。
FMapPlayerKeyArgs Args;
Args.MappingName = TEXT("Input.Fire");
Args.Slot = EPlayerMappableKeySlot::First;
Args.NewKey = EKeys::Gamepad_RightTrigger;
Args.HardwareDeviceId = TEXT("Gamepad");
平台 Mapping Context Redirect
UEnhancedInputPlatformSettings 可以做平台特定设置,包括 Mapping Context Redirect。比如 PC 使用 IMC_Default_PC,主机使用 IMC_Default_Gamepad,移动平台使用 IMC_Default_Touch。Subsystem 重建映射时会记录 AppliedContextRedirects。
这比在 BeginPlay 里写一大堆 #if PLATFORM_ 更可维护。
键位图标
Enhanced Input 只告诉你当前 FKey,不负责游戏 UI 图标。推荐做一个 Key Glyph 数据表:
| Key | Device | Icon | Text |
|---|---|---|---|
EKeys::SpaceBar |
Keyboard | Space.svg | Space |
EKeys::Gamepad_FaceButton_Bottom |
Xbox | A.svg | A |
EKeys::Gamepad_FaceButton_Bottom |
PlayStation | Cross.svg | × |
UI 从 FPlayerKeyMapping::GetCurrentKey() 拿 FKey,再按当前输入设备选图标。
使用案例:同一个 Interact
IA_Interact 绑定 E、Gamepad FaceButton Bottom、触摸按钮。Gameplay 只绑定 InteractAction。设置页分两列显示键鼠和手柄,改键时按 HardwareDevice 过滤,不要让玩家把手柄槽位改成鼠标键。
常见坑
- 手柄 Move 没死区,角色慢慢飘。
- 鼠标和手柄 Look 共用 Scalar,导致一个太快一个太慢。
- 设置页只显示 FKey 名称,不显示平台图标。
- 本地多人时没区分 Local Player,每个玩家都读同一套 User Settings。
- 平台差异全写在 Character BeginPlay,后续新平台很难维护。
源码依据
InputModifiers.h 定义 DeadZone、Scalar、Response Curve、FOV Scaling 等设备适配常用 Modifier。UEnhancedInputUserSettings 支持 HardwareDeviceId 和查询选项里的 RequiredDeviceType、RequiredDeviceFlags。UEnhancedInputDeveloperSettings 持有 PlatformSettings,IEnhancedInputSubsystemInterface 在重建映射时有 AppliedContextRedirects。
源码路径索引
EnhancedInput/Public/InputModifiers.hEnhancedInput/Public/EnhancedInputPlatformSettings.hEnhancedInput/Public/UserSettings/EnhancedInputUserSettings.hEnhancedInput/Public/EnhancedInputDeveloperSettings.h