Quick answer: The most common cause is a missing Input Action Asset on the PlayerInput component, or the Default Map not being set. Assign your .inputactions asset, set the Default Map to your gameplay action map, and verify the Behavior mode matches how your scripts listen for input.

Here is how to fix the PlayerInput component not receiving input in Unity. You added PlayerInput to your character, pressed play, and nothing happens. No movement, no jump, no callbacks. The component sits there with a green checkmark as if everything is fine, but your OnMove and OnJump methods never fire. This is one of the most common stumbling blocks when migrating to the New Input System.

The Symptom

You have a PlayerInput component attached to your player GameObject. You have an Input Action Asset with actions like Move and Jump defined. You have handler methods in your MonoBehaviour. You press keys or move the gamepad stick. Nothing happens. No errors in the console, no warnings — the input is simply ignored.

In some cases, input works for one control scheme (keyboard) but not another (gamepad). In other cases, it works in one scene but breaks when you load a different scene. Occasionally, input works for a frame and then stops responding entirely after an action map switch.

What Causes This

1. No Input Action Asset assigned. The PlayerInput component requires an Input Action Asset in its Actions field. If this is null, the component has no idea what actions exist. Unity does not warn you about this — it just does nothing.

2. Default Map is not set. Even with an asset assigned, if the Default Map dropdown is set to nothing, no action map is active when the component starts. Actions only fire when their containing map is enabled.

3. Wrong Behavior mode. PlayerInput offers four Behavior modes: Send Messages, Broadcast Messages, Invoke Unity Events, and Invoke C Sharp Events. If you picked Send Messages but your handler is on a child object, it will never receive the message. If you picked Invoke Unity Events but did not wire up the event fields in the Inspector, nothing fires.

4. Auto-Switch disabled or conflicting. When Auto-Switch is enabled, PlayerInput automatically changes the active control scheme when it detects input from a different device. If disabled and you start with keyboard but grab the gamepad, PlayerInput ignores the gamepad entirely. Conversely, auto-switch bugs can cause the scheme to flip-flop rapidly if multiple devices send input simultaneously.

5. Active Input Handling set to Old. In Player Settings, Active Input Handling must be set to “Input System Package (New)” or “Both.” If it is set to “Old,” the new Input System package does not receive any events from the runtime.

The Fix

Step 1: Assign the Input Action Asset and set the Default Map.

// Verify at runtime that the asset is assigned
void Awake()
{
    var playerInput = GetComponent<PlayerInput>();

    if (playerInput.actions == null)
    {
        Debug.LogError("PlayerInput has no Input Action Asset assigned!");
        return;
    }

    Debug.Log($"Active map: {playerInput.currentActionMap?.name ?? \"NONE\"}");

    // Force-activate the gameplay map if it is not active
    if (playerInput.currentActionMap == null)
    {
        playerInput.SwitchCurrentActionMap("Gameplay");
    }
}

Step 2: Match the Behavior mode to your code pattern. If you use OnMove(InputValue value) methods on the same GameObject, select Send Messages. If you subscribe via C# events, select Invoke C Sharp Events and subscribe in code:

void OnEnable()
{
    var playerInput = GetComponent<PlayerInput>();
    playerInput.onActionTriggered += HandleAction;
}

void OnDisable()
{
    var playerInput = GetComponent<PlayerInput>();
    playerInput.onActionTriggered -= HandleAction;
}

void HandleAction(InputAction.CallbackContext ctx)
{
    if (ctx.action.name == "Move" && ctx.performed)
    {
        Vector2 move = ctx.ReadValue<Vector2>();
        Debug.Log($"Move: {move}");
    }
}

Step 3: Verify Active Input Handling. Go to Edit > Project Settings > Player > Other Settings > Active Input Handling. Set it to “Both” if you need legacy Input.GetKey calls alongside the new system, or “Input System Package (New)” if you are fully migrated. Unity will restart the editor after changing this.

Step 4: Configure Auto-Switch. On the PlayerInput component, ensure Auto-Switch is checked if your game supports multiple input devices. If you only support one device type, uncheck it and manually set the Default Scheme to avoid conflicts.

“The PlayerInput component is a convenience wrapper. If you find yourself fighting it, consider using the InputAction asset directly — it gives you full control over when actions are enabled and which devices are bound.”

Why This Works

PlayerInput is a state machine that manages action maps, control schemes, and device pairing on your behalf. But it needs three things configured correctly to function: an action asset to know what actions exist, an active action map to know which subset of actions to listen for, and a behavior mode to know how to deliver callbacks. Missing any one of these causes silent failure because PlayerInput treats an unconfigured state as “nothing to do” rather than an error.

The Active Input Handling setting is a project-wide switch that controls whether Unity even initializes the new Input System runtime. Without it, the entire package is dormant — all PlayerInput components exist in the scene but receive no hardware events.

Related Issues

If input works but your character does not move, the problem may be in your movement code rather than input. See Fix: Unity AddForce Not Working on Rigidbody for physics-based movement issues.

If you are seeing duplicate input events in a multiplayer setup, check that you do not have multiple EventSystem objects. See Fix: Unity EventSystem Multiple Instances Warning for the singleton pattern.

No asset assigned, no default map, no callbacks. Check all three before you start debugging your code.