用途
该技能面向在 Unreal Engine 中为 Pawn、Character 或 PlayerController 搭建玩家控制的场景,指导开发者用 Enhanced Input 这一现代输入系统,在 C++ 中绑定移动、视角、跳跃、交互等玩家动作,并在运行时添加、移除或调整映射上下文的优先级(例如步行、载具、UI 等状态切换)。它也可用于读取动作回调中的模拟量,以及替换传统的 BindAxis/BindAction 输入绑定。
主要能力
资料说明了 Enhanced Input 的核心类型与职责:
- UInputAction:抽象动作数据资产,携带 ValueType(EInputActionValueType,取值为 Boolean、Axis1D、Axis2D、Axis3D)。
- UInputMappingContext:把 FKey 映射到 UInputAction 的数据资产,每个映射可带 UInputModifier[] 与 UInputTrigger[]。
- UEnhancedInputComponent:输入组件子类,BindAction 用于注册 C++ 委托。
- UEnhancedInputLocalPlayerSubsystem:每个本地玩家对应一个子系统,提供 AddMappingContext / RemoveMappingContext。
- FInputActionValue:传给处理函数的值,通过 Get<T>() 提取 bool、float、FVector2D 或 FVector。
- ETriggerEvent:处理函数的触发时机,包括 Started、Triggered、Ongoing、Completed、Canceled。
资料给出的心智模型是:物理按键 → IMC 映射(先应用修饰器,再评估触发器)→ 在匹配的 ETriggerEvent 上把 FInputActionValue 交给处理函数。整个系统由数据资产驱动,UInputAction 与 UInputMappingContext 都是 UDataAsset 子类,在内容浏览器中创建,C++ 代码持有它们的 UPROPERTY 指针并完成接线。
使用方式
资料列出的设置清单包括:确认 Enhanced Input 插件已启用(5.x 新项目默认开启);在 Build.cs 的 PrivateDependencyModuleNames 中加入 "EnhancedInput";在 Project Settings → Engine → Input 中把 Default Player Input Class 设为 EnhancedPlayerInput、Default Input Component Class 设为 EnhancedInputComponent;为每个动作创建 UInputAction 资产并设置取值类型;创建 UInputMappingContext 资产并添加按键到动作的映射及修饰器/触发器;在占有或生成时通过子系统推送上下文;在 SetupPlayerInputComponent 中把输入组件转换为 UEnhancedInputComponent 并调用 BindAction。
添加上下文应在本地玩家存在之后进行,通常在 APlayerController::BeginPlay 或 APawn::PawnClientRestart 中,通过 GetLocalPlayer() 取得 UEnhancedInputLocalPlayerSubsystem 后调用 AddMappingContext(DefaultMappingContext, 0)。优先级更高的上下文在同一个键映射到不同动作时优先。上下文可以反复添加和移除。
绑定动作时,处理函数签名必须精确匹配四种重载之一:无参数、const FInputActionValue&、const FInputActionInstance&,或动态四参数形式。BindAction 返回 FEnhancedInputActionEventBinding&,如需后续解绑可保存该句柄或使用 RemoveBindingByHandle。连续动作(移动、视角)使用 ETriggerEvent::Triggered,按键按下时触发一次的动作(跳跃开始、开火、交互)使用 Started,松键时(跳跃释放、UI 确认)使用 Completed,中止按住时使用 Canceled,按住期间尚未达到阈值前每帧使用 Ongoing。
读取 FInputActionValue 时,Get<T>() 的类型必须与动作资产声明的类型一致:Get<bool>()、Get<float>()(Axis1D)、Get<FVector2D>()(Axis2D)、Get<FVector>()(Axis3D)。类型不匹配会静默返回零值,例如对 Axis2D 动作调用 Get<bool>() 会返回 false。
资料还给出了 WASD 合成单个 Axis2D 动作的修饰器方案:W 使用 Swizzle Input Axis Values(YXZ),S 使用 Swizzle(YXZ)加 Negate,A 使用 Negate,D 不加修饰器。运行时每帧累积该动作的所有激活映射,默认采用 TakeHighestAbsoluteValue,也可在 UInputAction 资产上改为 Cumulative。
适用场景
适用于新项目或迁移项目中的玩家输入搭建,包括:在 C++ 中绑定移动、视角、跳跃、交互等动作;运行时切换映射上下文(步行、载具、UI);从 FInputActionValue 读取模拟输入;用 Enhanced Input 取代传统 BindAxis/BindAction 绑定。
限制与注意事项
资料列出的常见陷阱包括:Build.cs 缺少 "EnhancedInput" 会导致所有 Enhanced Input 类符号未解析;未设置默认输入类时 CastChecked<UEnhancedInputComponent> 会崩溃或 Cast 返回空导致无响应;未添加上下文则动作永远不触发;在本地玩家存在前添加上下文会得到空 GetLocalPlayer();取值类型不匹配会静默返回零值;在 UEnhancedInputComponent 上调用传统绑定会编译失败,除非在 Build.cs 中定义 ENHANCED_INPUT_ALLOW_LEGACY_BINDING=1;在按键被按住时添加上下文,默认 FModifyContextOptions 的 bIgnoreAllPressedKeysUntilRelease = true,需要松开再按,可设为 false 覆盖;优先级冲突时一般用 0,更高值留给必须压过游戏操作的覆盖层上下文(如 UI)。
关于版本:Enhanced Input 在 UE 4.27 作为插件发布,UE 5.1 起成为默认系统。UE 5.7 中 UInputMappingContext 的 Mappings 属性被标记为已弃用(UE_DEPRECATED(5.7)),改用新的 DefaultKeyMappings 结构,建议通过编辑器资产而非在 C++ 中编辑 Mappings 数组。FModifyContextOptions(AddMappingContext 的选项结构)与基于 FGameplayTagContainer 的输入模式过滤是 5.3+ 的新增内容。传统项目仍使用 DefaultInput.ini 的轴/动作映射与 UInputComponent 上的 BindAxis/BindAction(FName, ...),在 5.8 中仍可编译,但与 UEnhancedInputComponent 无法干净共存,需迁移为 UInputAction + UInputMappingContext 资产并改用 UEnhancedInputComponent::BindAction。