Unreal Enhanced Input
Wire player input the modern UE5 way with the Enhanced Input system: data-driven Input
Actions and Mapping Contexts instead of the legacy Project Settings axis/action mappings.
Targets UE 5.8 (Enhanced Input is the default; legacy input is deprecated).
When to use
- Use when adding movement/look/jump/fire input, creating Input Action (
IA_) and Input
Mapping Context (IMC_) assets, applying modifiers/triggers, adding a mapping context to a
player, or binding actions in C++ or Blueprints.
- Use when the project has
IA_*/IMC_* assets or references EnhancedInput.
When not to use: engine-agnostic input architecture (rebinding strategy, buffering,
multi-device design) → input-systems. The Pawn/Character C++ those bindings live in →
unreal-cpp-gameplay.
Core workflow
- Enable the module/plugin. Enhanced Input is on by default in UE5; for C++ binding add
"EnhancedInput" to PublicDependencyModuleNames in *.Build.cs.
- Create Input Actions (
IA_). Each has a Value Type: Digital (bool) for buttons,
Axis1D (float) for triggers, Axis2D (Vector2D) for movement/look.
- Create an Input Mapping Context (
IMC_) that maps keys/buttons to those actions. Use
Modifiers to shape raw input (Negate, Swizzle Input Axis Values, Dead Zone) — e.g. WASD
into one Axis2D needs Negate on A/S and a Swizzle on W/S. Use Triggers (Pressed, Hold,
Tap) to decide when an action fires.
- Add the mapping context to the player via the
EnhancedInputLocalPlayerSubsystem
(AddMappingContext(IMC, Priority)), usually in BeginPlay/possession.
- Bind actions to handlers by
ETriggerEvent (Triggered, Started, Completed, …) on
the EnhancedInputComponent, and read the FInputActionValue in the handler.
- Verify in PIE; the Enhanced Input debugging console commands
(
showdebug enhancedinput) show which actions trigger and their values.
Patterns
1. Add the mapping context (C++ Character)
void AMyCharacter::BeginPlay()
{
Super::BeginPlay();
if (APlayerController* PC = Cast<APlayerController>(GetController()))
if (ULocalPlayer* LP = PC->GetLocalPlayer())
if (auto* Subsystem = LP->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>())
Subsystem->AddMappingContext(DefaultMappingContext, /*Priority*/ 0);
}
// DefaultMappingContext is a UPROPERTY(EditAnywhere) TObjectPtr<UInputMappingContext>.
2. Bind actions and read values
void AMyCharacter::SetupPlayerInputComponent(UInputComponent* InputComponent)
{
Super::SetupPlayerInputComponent(InputComponent);
// The component is an Enhanced Input component when the plugin is active.
if (UEnhancedInputComponent* EIC = Cast<UEnhancedInputComponent>(InputComponent))
{
EIC->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AMyCharacter::Move);
EIC->BindAction(LookAction, ETriggerEvent::Triggered, this, &AMyCharacter::Look);
EIC->BindAction(JumpAction, ETriggerEvent::Started, this, &ACharacter::Jump);
EIC->BindAction(JumpAction, ETriggerEvent::Completed, this, &ACharacter::StopJumping);
}
}
void AMyCharacter::Move(const FInputActionValue& Value)
{
const FVector2D Axis = Value.Get<FVector2D>(); // Axis2D action
AddMovementInput(GetActorForwardVector(), Axis.Y);
AddMovementInput(GetActorRightVector(), Axis.X);
}
3. Blueprint equivalent (node flow)
Event BeginPlay
-> Get Controller -> Cast To PlayerController -> Get Local Player
-> Get EnhancedInputLocalPlayerSubsystem -> Add Mapping Context (IMC_Default, Priority 0)
// IA_Move is exposed as its own event node in the Character's Event Graph:
EnhancedInputAction IA_Move (Triggered)
-> Action Value (Vector2D) -> Add Movement Input (Forward * Y, Right * X)
Pitfalls
- No input at all — the mapping context was never added (
AddMappingContext), or the
player has no Local Player yet. Add it after possession/BeginPlay.
- Link/compile error binding in C++ —
"EnhancedInput" isn't in Build.cs
PublicDependencyModuleNames.
- WASD only moves on two keys / wrong axis — Axis2D needs Modifiers: Negate on the
negative keys (A, S) and a Swizzle Input Axis Values on the vertical (W/S) so both axes map
correctly. Raw bindings without modifiers misbehave.
Get<FVector2D>() returns zero — value-type mismatch: the Input Action is Digital/Axis1D,
not Axis2D. Match the Get<T>() to the action's Value Type.
- Action fires every frame unexpectedly —
Triggered repeats while held for a Down trigger;
use Started/Completed for one-shots (jump press/release), or a Pressed/Tap trigger.
- Two contexts fight — multiple mapping contexts stack by Priority; a higher-priority
context can consume a key. Manage with priorities and
RemoveMappingContext.
References
- For a complete first-/third-person C++ Character with Enhanced Input (header + source,
including look/jump and a control-rebind note), read
references/cpp-setup.md.
- Primary docs: "Enhanced Input in Unreal Engine"
(
https://dev.epicgames.com/documentation/en-us/unreal-engine/enhanced-input-in-unreal-engine).
Related skills
input-systems — engine-agnostic input architecture and rebinding strategy.
unreal-cpp-gameplay — the Character/Pawn class and module setup.
fps-shooter — composes input with a 3D controller and shooting.
1---
2name: unreal-enhanced-input
3description: >
4 Set up player input in Unreal Engine 5 with Enhanced Input: Input Actions, Input Mapping
5 Contexts, modifiers and triggers, adding the mapping context, and binding actions by
6 ETriggerEvent. Use when wiring movement/look/jump input, creating IA_/IMC_ assets, binding
7 in C++ or Blueprints, or when the user mentions Enhanced Input, Input Mapping Context,
8 Input Action, IA_/IMC_, or ETriggerEvent.
9---
10
11# Unreal Enhanced Input
12
13Wire player input the modern UE5 way with the **Enhanced Input** system: data-driven Input
14Actions and Mapping Contexts instead of the legacy Project Settings axis/action mappings.
15Targets **UE 5.8** (Enhanced Input is the default; legacy input is deprecated).
16
17## When to use
18
19- Use when adding movement/look/jump/fire input, creating Input Action (`IA_`) and Input
20 Mapping Context (`IMC_`) assets, applying modifiers/triggers, adding a mapping context to a
21 player, or binding actions in C++ or Blueprints.
22- Use when the project has `IA_*`/`IMC_*` assets or references `EnhancedInput`.
23
24**When *not* to use:** engine-agnostic input *architecture* (rebinding strategy, buffering,
25multi-device design) → `input-systems`. The Pawn/Character C++ those bindings live in →
26`unreal-cpp-gameplay`.
27
28## Core workflow
29
301. **Enable the module/plugin.** Enhanced Input is on by default in UE5; for C++ binding add
31 `"EnhancedInput"` to `PublicDependencyModuleNames` in `*.Build.cs`.
322. **Create Input Actions (`IA_`).** Each has a **Value Type**: `Digital (bool)` for buttons,
33 `Axis1D (float)` for triggers, `Axis2D (Vector2D)` for movement/look.
343. **Create an Input Mapping Context (`IMC_`)** that maps keys/buttons to those actions. Use
35 **Modifiers** to shape raw input (Negate, Swizzle Input Axis Values, Dead Zone) — e.g. WASD
36 into one Axis2D needs Negate on A/S and a Swizzle on W/S. Use **Triggers** (Pressed, Hold,
37 Tap) to decide *when* an action fires.
384. **Add the mapping context to the player** via the `EnhancedInputLocalPlayerSubsystem`
39 (`AddMappingContext(IMC, Priority)`), usually in `BeginPlay`/possession.
405. **Bind actions** to handlers by `ETriggerEvent` (`Triggered`, `Started`, `Completed`, …) on
41 the `EnhancedInputComponent`, and read the `FInputActionValue` in the handler.
426. **Verify** in PIE; the Enhanced Input debugging console commands
43 (`showdebug enhancedinput`) show which actions trigger and their values.
44
45## Patterns
46
47### 1. Add the mapping context (C++ Character)
48
49```cpp
50void AMyCharacter::BeginPlay()
51{
52 Super::BeginPlay();
53 if (APlayerController* PC = Cast<APlayerController>(GetController()))
54 if (ULocalPlayer* LP = PC->GetLocalPlayer())
55 if (auto* Subsystem = LP->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>())
56 Subsystem->AddMappingContext(DefaultMappingContext, /*Priority*/ 0);
57}
58// DefaultMappingContext is a UPROPERTY(EditAnywhere) TObjectPtr<UInputMappingContext>.
59```
60
61### 2. Bind actions and read values
62
63```cpp
64void AMyCharacter::SetupPlayerInputComponent(UInputComponent* InputComponent)
65{
66 Super::SetupPlayerInputComponent(InputComponent);
67
68 // The component is an Enhanced Input component when the plugin is active.
69 if (UEnhancedInputComponent* EIC = Cast<UEnhancedInputComponent>(InputComponent))
70 {
71 EIC->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AMyCharacter::Move);
72 EIC->BindAction(LookAction, ETriggerEvent::Triggered, this, &AMyCharacter::Look);
73 EIC->BindAction(JumpAction, ETriggerEvent::Started, this, &ACharacter::Jump);
74 EIC->BindAction(JumpAction, ETriggerEvent::Completed, this, &ACharacter::StopJumping);
75 }
76}
77
78void AMyCharacter::Move(const FInputActionValue& Value)
79{
80 const FVector2D Axis = Value.Get<FVector2D>(); // Axis2D action
81 AddMovementInput(GetActorForwardVector(), Axis.Y);
82 AddMovementInput(GetActorRightVector(), Axis.X);
83}
84```
85
86### 3. Blueprint equivalent (node flow)
87
88```text
89Event BeginPlay
90 -> Get Controller -> Cast To PlayerController -> Get Local Player
91 -> Get EnhancedInputLocalPlayerSubsystem -> Add Mapping Context (IMC_Default, Priority 0)
92
93// IA_Move is exposed as its own event node in the Character's Event Graph:
94EnhancedInputAction IA_Move (Triggered)
95 -> Action Value (Vector2D) -> Add Movement Input (Forward * Y, Right * X)
96```
97
98## Pitfalls
99
100- **No input at all** — the mapping context was never added (`AddMappingContext`), or the
101 player has no Local Player yet. Add it after possession/`BeginPlay`.
102- **Link/compile error binding in C++** — `"EnhancedInput"` isn't in `Build.cs`
103 `PublicDependencyModuleNames`.
104- **WASD only moves on two keys / wrong axis** — Axis2D needs **Modifiers**: Negate on the
105 negative keys (A, S) and a Swizzle Input Axis Values on the vertical (W/S) so both axes map
106 correctly. Raw bindings without modifiers misbehave.
107- **`Get<FVector2D>()` returns zero** — value-type mismatch: the Input Action is Digital/Axis1D,
108 not Axis2D. Match the `Get<T>()` to the action's Value Type.
109- **Action fires every frame unexpectedly** — `Triggered` repeats while held for a Down trigger;
110 use `Started`/`Completed` for one-shots (jump press/release), or a Pressed/Tap trigger.
111- **Two contexts fight** — multiple mapping contexts stack by Priority; a higher-priority
112 context can consume a key. Manage with priorities and `RemoveMappingContext`.
113
114## References
115
116- For a complete first-/third-person C++ Character with Enhanced Input (header + source,
117 including look/jump and a control-rebind note), read `references/cpp-setup.md`.
118- Primary docs: "Enhanced Input in Unreal Engine"
119 (`https://dev.epicgames.com/documentation/en-us/unreal-engine/enhanced-input-in-unreal-engine`).
120
121## Related skills
122
123- `input-systems` — engine-agnostic input architecture and rebinding strategy.
124- `unreal-cpp-gameplay` — the Character/Pawn class and module setup.
125- `fps-shooter` — composes input with a 3D controller and shooting.