Quick answer: You did not add the Input Mapping Context to the EnhancedInputLocalPlayerSubsystem. Do it in your pawn’s BeginPlay or player controller’s OnPossess — before that, the IMC does not feed events to your action bindings.

Here is how to fix Unreal Enhanced Input actions not firing. You migrated from the legacy input system, created an Input Action (IA_Jump), put it in an Input Mapping Context (IMC_Default) bound to Space, added a trigger in your pawn’s Blueprint or C++, and pressed Space. Nothing. The IMC has the right key, the action has the right value type, the binding looks correct in the Blueprint node. Enhanced Input’s setup story is not complex but it is unforgiving: one missing step and no actions fire.

The Symptom

Pressing keys or gamepad buttons bound to Enhanced Input Actions produces no callback. The pawn’s Triggered, Started, or Completed events never fire. The legacy InputAxis and InputAction events (if still present) may work if default project settings have bindings, but Enhanced Input itself is silent.

In Project Settings > Input > Default Input Component Class, Enhanced Input is set to EnhancedPlayerInput and EnhancedInputComponent. Everything looks right, yet nothing happens.

What Causes This

IMC not added to the subsystem. Enhanced Input requires you to tell the UEnhancedInputLocalPlayerSubsystem which contexts are active. Without this, the subsystem does not know to consume any key events, and nothing reaches your bindings. Adding a context is a one-line call but it is not done automatically.

Added too early. If you call AddMappingContext in the pawn’s constructor or in PostInitializeComponents, the local player may not exist yet. The call silently does nothing because there is no subsystem instance to add to.

Wrong player controller or pawn. In split-screen or multiplayer, there are multiple local players. Calling GetLocalPlayer() on the wrong controller returns the wrong subsystem. Always get the subsystem from the player controller that owns the current pawn.

Input Mode wrong. If your game sets SetInputMode(FInputModeUIOnly) (common for menus), gameplay inputs do not reach the pawn. The pawn receives nothing until you set back to FInputModeGameOnly or FInputModeGameAndUI.

Module dependency. Enhanced Input is a separate module. If you forget to add "EnhancedInput" to your Build.cs PublicDependencyModuleNames, C++ code compiles but the subsystem is not registered and action assets fail to load in packaged builds.

IMC priority conflict. If another context has consumed the key at a higher priority, your IMC never sees the input. ConsumeInput on modifiers can swallow keys too. Lower priority IMCs do not receive inputs that higher priority ones handle.

The Fix

Step 1: Add the Input Mapping Context in BeginPlay. For C++:

// MyPawn.cpp
void AMyPawn::BeginPlay()
{
    Super::BeginPlay();

    if (APlayerController* PC = Cast<APlayerController>(Controller))
    {
        if (UEnhancedInputLocalPlayerSubsystem* Subsystem =
            ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(
                PC->GetLocalPlayer()))
        {
            Subsystem->AddMappingContext(DefaultMappingContext, 0);
        }
    }
}

DefaultMappingContext is a UInputMappingContext* exposed as UPROPERTY(EditAnywhere) so you can assign IMC_Default to it in the Blueprint details panel. The second parameter is priority; 0 is fine for a single context.

For Blueprint: in the pawn’s Begin Play, drag off Get Player Controller, Get Local Player, Get Enhanced Input Local Player Subsystem, Add Mapping Context — pass your IMC asset.

Step 2: Bind actions in SetupPlayerInputComponent. C++ example:

void AMyPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
    Super::SetupPlayerInputComponent(PlayerInputComponent);

    if (UEnhancedInputComponent* EIC =
        Cast<UEnhancedInputComponent>(PlayerInputComponent))
    {
        EIC->BindAction(JumpAction, ETriggerEvent::Started,
            this, &AMyPawn::Jump);

        EIC->BindAction(MoveAction, ETriggerEvent::Triggered,
            this, &AMyPawn::Move);
    }
}

void AMyPawn::Move(const FInputActionValue& Value)
{
    FVector2D MoveVec = Value.Get<FVector2D>();
    // apply movement
}

Note the Cast<UEnhancedInputComponent> — if your project is configured correctly, this cast succeeds. If it returns null, the Default Input Component Class is not set to the Enhanced version.

Step 3: Verify project settings. Open Project Settings > Input. Confirm:

These are set correctly by default in UE 5.1+ project templates but can be wrong if you migrated from older projects. If you change them, restart the editor.

Step 4: Add module dependency. In your YourProject.Build.cs:

PublicDependencyModuleNames.AddRange(new string[] {
    "Core", "CoreUObject", "Engine", "InputCore",
    "EnhancedInput"
});

Rebuild. Without this, C++ code can compile with forward declarations but the module does not initialize, and IMC_Default fails to add.

Debugging Techniques

If actions still do not fire, enable the debug visualizer. Open the console in a running game and type showdebug enhancedinput. A HUD overlay appears showing:

If your IMC does not appear in the list, it was never added. If keys register as events but no action triggers, the binding is wrong or a higher-priority IMC consumed the key.

Another quick test: add a UE_LOG(LogTemp, Warning, TEXT("Space pressed")) in a simple test binding for a rarely-used key. If the log fires, input is reaching your component. If not, the problem is above — in IMC registration or subsystem access.

Input Mode Gotchas

Menus often call SetInputModeUIOnly to give focus to UMG widgets. This blocks all gameplay input. When closing the menu, explicitly set SetInputModeGameOnly or SetInputModeGameAndUI. A subtle bug: adding a widget to viewport with input focus implicitly sets UI-only on some engine versions — pass bShowMouseCursor=false, bTakeFocus=false deliberately if you do not want that.

“Enhanced Input is more powerful than the legacy system but it is not automatic. Every binding path has an explicit step you have to write.”

Related Issues

For ability system integration, see Unreal GameplayAbility Not Activating. For world streaming issues, Unreal World Partition Actor Not Loading covers related pawn setup problems.

AddMappingContext is the step everyone forgets. Put it in BeginPlay and never forget again.