Quick answer: Modifiers attached to a binding apply only to that binding. Other bindings of the same action stay raw. Put global modifiers on the Input Action asset itself. Verify Negate has its axis flags checked, and that FInputActionValue type matches the IA value type (Bool, Axis1D, Axis2D, Axis3D).

Here is how to fix Unreal Enhanced Input modifiers (Negate, Swizzle, Scale, Dead Zone) that look correctly configured but do not seem to affect the value the action delivers. The trick is understanding the difference between per-binding and per-action modifiers, and ensuring axis flags on Negate are actually checked.

The Symptom

You add a Negate modifier to flip the Y axis of a stick. The action’s callback still receives positive Y when the player pushes up. Or a Scale modifier set to 0.5 has no effect — values come through at full magnitude.

What Causes This

Modifier on the wrong level. Modifiers can be placed on individual key bindings inside an Input Mapping Context, or on the Input Action asset. Per-binding modifiers only affect that one binding.

Negate axis flags. The Negate modifier has X/Y/Z flags. Without checking, it does not negate that axis.

Wrong IA value type. If your IA is Axis2D but you only have a single Axis1D modifier, the second axis passes unmodified.

Modifier order. Modifiers run top-down. Putting Dead Zone before Smooth Delta is different from putting Smooth Delta before Dead Zone — the order matters for the final output.

The Fix

Step 1: Decide where to put the modifier. If the modifier should apply regardless of which key triggered the action, put it on the IA asset under Modifiers. If it is binding-specific (e.g., negate Y for the W key only because W maps to forward), put it on the binding inside the IMC.

Step 2: Check Negate axis flags.

Negate Modifier:
  X: false
  Y: true      # negate Y axis only
  Z: false

Without the Y flag checked, Negate does not affect Y at all.

Step 3: Match IA type to your modifier set.

Input Action: IA_Look (Axis2D)
  Modifiers (action level):
    Dead Zone (Radial, Lower 0.15)
    Smooth Delta (factor 0.7)

Bindings in IMC:
  Mouse XY  -> IA_Look      (no per-binding modifiers needed)
  Gamepad RightStick -> IA_Look
    Modifiers (binding level):
      Scale (X=2, Y=2)        # Gamepad needs more sensitivity

Step 4: Read the value with the right type in C++.

void AMyCharacter::Look(const FInputActionValue& Value)
{
    FVector2D LookAxis = Value.Get<FVector2D>();
    AddControllerYawInput(LookAxis.X);
    AddControllerPitchInput(LookAxis.Y);
}

Make sure Get<FVector2D>() matches the IA value type (Axis2D). Asking for FVector on an Axis2D IA returns zeros for the third component.

Step 5: Debug by logging.

UE_LOG(LogTemp, Log, TEXT("Look raw=%s"),
       *Value.Get<FVector2D>().ToString());

If the log shows raw values matching the modifier’s output, the action is correct. If it shows un-modified values, the modifier is on the wrong level or has wrong flags.

Modifier Order Cheat Sheet

Typical for stick aim:
  1. Dead Zone (Radial)        -- remove drift first
  2. Scale (sensitivity)       -- amplify the cleaned value
  3. Smooth Delta              -- smooth across frames

Typical for keyboard movement:
  1. Negate (per-binding for "back" keys)
  2. Swizzle (W/S => Y axis)
  3. Dead Zone (rare for digital input)

“Modifiers belong on the IA for global behavior, on the binding for per-key tweaks. Negate’s axis flags are not optional.”

Related Issues

For deadzone tuning, see Deadzone Stuck Axis. For gamepad action firing, see Enhanced Input Gamepad.

IA modifiers for global. Binding modifiers for per-key. Negate flags, value type, order. The modifier finally bites.