Quick answer: Add the Input Mapping Context to the player’s UEnhancedInputLocalPlayerSubsystem via AddMappingContext. Action assets alone don’t fire — they need a context.

You authored an IA_Jump Input Action, added it to your IMC with the space bar, and called BindAction(IA_Jump, ETriggerEvent::Triggered, this, &APlayer::Jump) in SetupPlayerInputComponent. Press space — nothing. The action is there, the binding is there, but the callback never executes.

Why Bindings Alone Don’t Suffice

Enhanced Input has three concepts:

  1. Input Action (IA) — an abstract gameplay action (Jump, Fire, Move).
  2. Input Mapping Context (IMC) — binds keys/axes to actions.
  3. Binding — connects an action to a C++ or Blueprint callback.

Without an active IMC, the subsystem doesn’t know to evaluate the action. BindAction just connects callback to action; it doesn’t guarantee the action is active.

The Fix: AddMappingContext

// MyPlayerController.cpp
void AMyPlayerController::BeginPlay()
{
    Super::BeginPlay();
    if (UEnhancedInputLocalPlayerSubsystem* Subsystem =
        ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(GetLocalPlayer()))
    {
        Subsystem->AddMappingContext(DefaultMappingContext, 0);
    }
}

DefaultMappingContext is a UPROPERTY(EditDefaultsOnly) on the player controller; assign your IMC in Blueprint or in the C++ defaults. Priority 0 is fine for the main context; menus typically use higher priorities to override gameplay temporarily.

Binding the Action

void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PIC)
{
    Super::SetupPlayerInputComponent(PIC);
    if (UEnhancedInputComponent* EIC = Cast<UEnhancedInputComponent>(PIC))
    {
        EIC->BindAction(JumpAction, ETriggerEvent::Triggered, this, &AMyCharacter::HandleJump);
        EIC->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AMyCharacter::HandleMove);
    }
}

void AMyCharacter::HandleJump(const FInputActionValue& Value)
{
    Jump();
}

The callback signature takes const FInputActionValue&. The value contains an axis (for analog inputs) or boolean (for digital). For Move, extract a 2D vector:

void AMyCharacter::HandleMove(const FInputActionValue& Value)
{
    FVector2D V = Value.Get<FVector2D>();
    AddMovementInput(GetActorForwardVector(), V.Y);
    AddMovementInput(GetActorRightVector(), V.X);
}

ETriggerEvent Phases

For “press to jump”, bind Started — you only want the single rising edge. Triggered fires every frame held, which would queue multiple jumps.

Step-by-Step Diagnosis

  1. Open console (~) and type showdebug enhancedinput. The HUD shows active IMCs and current action values. If no IMC is listed, your AddMappingContext call isn’t running.
  2. Check the binding count. If your action shows 0 bindings, SetupPlayerInputComponent isn’t firing — the pawn may not be possessed by the player controller.
  3. Click the action in the debug overlay to see its Trigger states. If Triggers stays at 0% even while you hold the key, the IMC isn’t routing the key correctly. Re-check the IMC’s key binding for the action.

Blueprint Variant

In a Blueprint Player Controller, drop a “Get Enhanced Input Local Player Subsystem” node in BeginPlay and call AddMappingContext. In a Blueprint Character, use the InputAction node directly — no need to call BindAction in code.

Verifying

Place UE_LOG(LogTemp, Log, TEXT(“Jump callback fired”)); at the top of HandleJump. Press space in PIE. A log line in Output Log confirms the chain works. No log — check the IMC, the AddMappingContext call, and the pawn possession order.

“Input Actions are inert until an IMC activates them. AddMappingContext is the magic. Without it, you’re binding to nothing.”

For multiplayer, ensure AddMappingContext runs in PlayerController BeginPlay, not the Pawn — the subsystem lives on the LocalPlayer, not the Pawn.