Quick answer: Enable the Action Map in OnEnable. Set Action Type = Value, Control Type = Vector2. Read with action.ReadValue<Vector2>() in Update or subscribe performed.

Generated C# class. WASD bound. Update reads Vector2.zero. Action Map never enabled.

The Symptom

InputAction.ReadValue returns zero. Performed callback never fires. Editor Input Debugger shows the keys press but the action stays disabled.

The Fix

public class PlayerInput : MonoBehaviour {
    PlayerActions _actions;
    Vector2 _move;

    void Awake() {
        _actions = new PlayerActions();
        _actions.Player.Move.performed += ctx => _move = ctx.ReadValue<Vector2>();
        _actions.Player.Move.canceled  += _ => _move = Vector2.zero;
    }

    void OnEnable()  => _actions.Player.Enable();
    void OnDisable() => _actions.Player.Disable();
}

Without Enable(), the action is dormant and ignores all input. Subscribing before enabling is fine; unsubscribing is unnecessary because we dispose with the action.

Composite Setup

In the Input Actions asset: Action Type = Value, Control Type = Vector2. Add binding → Add 2D Vector Composite → bind Up/Down/Left/Right to W/S/A/D. Apply.

Verifying

Open Window → Analysis → Input Debugger. Action shows state changes per key press. ReadValue returns the composite Vector2.

“Enable the map. Subscribe events. Composite drives motion.”

Related Issues

For input during scene load, see action during load. For Cinemachine impulse, see Cinemachine impulse.

Enable the map. Composite fires.