PluginBench
Skill
Pass
Audit score 90

unreal-enhanced-input

gamedev-skills/awesome-gamedev-agent-skills

Set up player input in Unreal Engine 5 with Enhanced Input system: Input Actions, Mapping Contexts, modifiers, and triggers.

What is unreal-enhanced-input?

The Enhanced Input system is UE5's modern, data-driven approach to player input using Input Actions (IA_) and Input Mapping Contexts (IMC_) instead of legacy Project Settings mappings. Use this skill when wiring movement, look, jump, or fire input, creating input assets, applying modifiers and triggers, or binding actions in C++ or Blueprints.

  • Create and configure Input Actions with value types (Digital, Axis1D, Axis2D)
  • Design Input Mapping Contexts that map keys/buttons to actions with modifiers and triggers
  • Add mapping contexts to players via EnhancedInputLocalPlayerSubsystem with priority management
  • Bind actions to handlers by ETriggerEvent (Triggered, Started, Completed) in C++ or Blueprints
  • Read FInputActionValue in handlers and route input to movement, look, and action systems
  • Debug input state with Enhanced Input console commands (showdebug enhancedinput)

How to install unreal-enhanced-input

npx skills add https://github.com/gamedev-skills/awesome-gamedev-agent-skills --skill unreal-enhanced-input
Prerequisites
  • Unreal Engine 5.8 or later (Enhanced Input is default; legacy input deprecated)
  • EnhancedInput module added to PublicDependencyModuleNames in *.Build.cs for C++ binding
  • A Character or Pawn class with SetupPlayerInputComponent override
Claude Code
Cursor
Windsurf
Cline

How to use unreal-enhanced-input

  1. 1.Create Input Action assets (IA_Move, IA_Look, IA_Jump) with appropriate Value Types (Axis2D for movement, Axis1D for triggers, Digital for buttons)
  2. 2.Create an Input Mapping Context asset (IMC_Default) and map keys/buttons to those actions
  3. 3.Apply Modifiers (Negate, Swizzle Input Axis Values, Dead Zone) to shape raw input correctly, especially for multi-key axes like WASD
  4. 4.Configure Triggers (Pressed, Hold, Tap) on each mapping to define when the action fires
  5. 5.In your Character's BeginPlay, get the EnhancedInputLocalPlayerSubsystem and call AddMappingContext(IMC_Default, Priority 0)
  6. 6.In SetupPlayerInputComponent, cast InputComponent to UEnhancedInputComponent and bind actions with BindAction(Action, ETriggerEvent, Handler)
  7. 7.In your handler functions, read the FInputActionValue and extract the appropriate type (Get<FVector2D>(), Get<float>(), Get<bool>())
  8. 8.Test in PIE and use showdebug enhancedinput console command to verify actions trigger and values are correct

Use cases

Good for
  • Wiring WASD movement and mouse look for a first-person or third-person character
  • Binding jump input with Started/Completed events to trigger and stop jump animations
  • Creating a rebindable control scheme by swapping or layering mapping contexts
  • Applying modifiers (Negate, Swizzle, Dead Zone) to raw input for correct axis mapping
  • Setting up context-sensitive input (e.g., different actions in menu vs. gameplay)
Who it's for
  • Unreal Engine 5 gameplay programmers building character controllers
  • Game designers setting up player input and control schemes
  • Developers migrating from legacy input to Enhanced Input
  • Teams implementing rebindable or context-aware input systems

unreal-enhanced-input FAQ

What is the difference between Input Actions and Input Mapping Contexts?

Input Actions (IA_) define *what* input can happen (e.g., Move, Look, Jump) and their value type (Digital, Axis1D, Axis2D). Input Mapping Contexts (IMC_) define *how* physical keys/buttons map to those actions, including modifiers and triggers. One action can be mapped in multiple contexts.

Why is my WASD movement only working on two keys or moving in the wrong direction?

Axis2D input requires Modifiers to work correctly. Add a Negate modifier to the negative keys (A, S) and a Swizzle Input Axis Values modifier to the vertical keys (W/S) so both axes map to the correct forward/right vectors.

How do I bind jump so it triggers once on press and once on release?

Bind the same action twice with different ETriggerEvents: BindAction(JumpAction, ETriggerEvent::Started, this, &ACharacter::Jump) for press, and BindAction(JumpAction, ETriggerEvent::Completed, this, &ACharacter::StopJumping) for release.

What does 'No input at all' mean and how do I fix it?

This usually means the mapping context was never added to the player. Ensure you call AddMappingContext in BeginPlay or after possession, and verify the player has a valid Local Player via the PlayerController.

Can I have multiple mapping contexts active at once?

Yes. Mapping contexts stack by Priority; higher-priority contexts are checked first. Use AddMappingContext and RemoveMappingContext to layer contexts (e.g., UI overlay on top of gameplay) and manage conflicts.

Full instructions (SKILL.md)

Source of truth, from gamedev-skills/awesome-gamedev-agent-skills.


name: unreal-enhanced-input description: > Set up player input in Unreal Engine 5 with Enhanced Input: Input Actions, Input Mapping Contexts, modifiers and triggers, adding the mapping context, and binding actions by ETriggerEvent. Use when wiring movement/look/jump input, creating IA_/IMC_ assets, binding in C++ or Blueprints, or when the user mentions Enhanced Input, Input Mapping Context, Input Action, IA_/IMC_, or ETriggerEvent.

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

  1. Enable the module/plugin. Enhanced Input is on by default in UE5; for C++ binding add "EnhancedInput" to PublicDependencyModuleNames in *.Build.cs.
  2. Create Input Actions (IA_). Each has a Value Type: Digital (bool) for buttons, Axis1D (float) for triggers, Axis2D (Vector2D) for movement/look.
  3. 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.
  4. Add the mapping context to the player via the EnhancedInputLocalPlayerSubsystem (AddMappingContext(IMC, Priority)), usually in BeginPlay/possession.
  5. Bind actions to handlers by ETriggerEvent (Triggered, Started, Completed, …) on the EnhancedInputComponent, and read the FInputActionValue in the handler.
  6. 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.