Unity input system
Skill gamedev-skills/awesome-gamedev-agent-skills/skills/unity/unity-input-system
Wire player input in Unity 6 with the Input System package: Input Actions, action maps, the PlayerInput component, and reading values via callbacks or polling. Use when the project has a .inputactions asset or com.unity.inputsystem, or when the user mentions the Unity Input System, InputAction, action maps, PlayerInput, control schemes, or rebinding.From its SKILL.md
npx -y skills add gamedev-skills/awesome-gamedev-agent-skills --skill unity-input-systemAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
What its file declares
Copied from the file, not written here
The file declares its own license as Apache-2.0. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
6.2 KB, ~1.4k tokens by cl100k_base, as published. Nobody here has run it
Unity Input System (new)
Read input through Unity's Input System package (com.unity.inputsystem, 1.x) —
action-based, device-agnostic, rebindable. Targets Unity 6. This is the modern
replacement for the legacy Input.GetAxis/Input.GetKey Input Manager.
When to use
- Use when setting up movement/jump/fire input, defining an
.inputactionsasset with action maps and control schemes, wiring aPlayerInputcomponent, reading aVector2stick/WASD value, or handling gamepad + keyboard + touch from one set of actions. - Use when
Packages/manifest.jsoncontainscom.unity.inputsystemor the project has an*.inputactionsasset.
When not to use: rebindable-control architecture across engines → input-systems
(this skill is the Unity-specific API). Moving the character once you have the input vector
→ unity-physics / unity-csharp-scripting.
Core workflow
- Check Active Input Handling (Project Settings → Player). The package only receives
input when this is
Input System Package (New)orBoth.Bothis required if any oldInput.GetAxiscode remains. - Create an
.inputactionsasset. Add an action map (e.g.Gameplay), add actions (Move= Value/Vector2,Jump= Button,Fire= Button), and bind them to controls and composite bindings (WASD = 2D Vector composite). - Choose how to read it:
PlayerInputcomponent (designer-friendly) — drop it on the player, point it at the asset, pick a Behavior (Send Messages / Broadcast / Invoke Unity Events / Invoke C# Events). Best for single/local-coop players.- Direct in code (
InputActionReference/InputActionAsset) — most control; youEnable()actions and read them. Best for systems and tools.
- Enable the actions/maps you read.
PlayerInputenables its default map automatically; actions you reference yourself must be.Enable()d (and disabled on teardown). - Switch action maps for context (gameplay ↔ UI/menu) instead of guarding every handler.
- Verify with the Input Debugger (Window → Analysis → Input Debugger) to confirm devices and that actions fire.
Patterns
1. PlayerInput with "Send Messages" (handlers on the same GameObject)
using UnityEngine;
using UnityEngine.InputSystem;
// PlayerInput (Behavior = Send Messages) calls On<ActionName>(InputValue) by name.
public class PlayerInputReceiver : MonoBehaviour
{
private Vector2 _move;
private void OnMove(InputValue value) => _move = value.Get<Vector2>(); // Move action
private void OnJump(InputValue value) { if (value.isPressed) Jump(); } // Button action
private void Update() { /* drive movement from _move */ }
private void Jump() { }
}
2. Reading an action directly in code (polling a value)
using UnityEngine;
using UnityEngine.InputSystem;
public class DirectMover : MonoBehaviour
{
[SerializeField] private InputActionReference moveAction; // assign the Move action
private void OnEnable() => moveAction.action.Enable(); // REQUIRED or it reads zero
private void OnDisable() => moveAction.action.Disable();
private void Update()
{
Vector2 move = moveAction.action.ReadValue<Vector2>(); // continuous value
transform.Translate(new Vector3(move.x, 0, move.y) * (5f * Time.deltaTime));
}
}
3. Event callbacks + switching action maps (gameplay ↔ UI)
[SerializeField] private InputActionAsset actions;
private void OnEnable()
{
actions.FindAction("Gameplay/Fire").performed += OnFire; // edge event: fires once
actions.FindActionMap("Gameplay").Enable();
}
private void OnDisable() => actions.FindAction("Gameplay/Fire").performed -= OnFire;
private void OnFire(InputAction.CallbackContext ctx) => Shoot(); // ctx.ReadValue<T>() if needed
private void OpenPauseMenu() // change context, don't sprinkle if-checks
{
actions.FindActionMap("Gameplay").Disable();
actions.FindActionMap("UI").Enable();
}
private void Shoot() { }
Pitfalls
- No input at all → either Active Input Handling is still
Input Manager (Old), or you forgot toEnable()the action/map.PlayerInputauto-enables; rawInputActions do not. InvalidOperationExceptionabout the old input backend → some script still callsInput.GetAxis/Input.GetKeywhile Active Input Handling isNew. Port it or setBoth.- Buttons read as 0 with
ReadValue→ button presses are edge events; use theperformedcallback (orWasPressedThisFrame()), not per-frameReadValuefor triggers. Send Messageshandlers never fire → the receiving script must be on the same GameObject as thePlayerInput;Broadcast Messagesreaches children too.- Leaking subscriptions → unsubscribe (
-=) inOnDisable; re-subscribing inOnEnablewithout unsubscribing doubles up handlers. - Touch/gamepad not detected → enable the matching control scheme and confirm the device in the Input Debugger; the Vector2 composite needs all four bindings set.
References
- For interactive control rebinding (
PerformInteractiveRebinding), saving/loading bindings as JSON, and local multiplayer withPlayerInputManager, readreferences/rebinding.md. - Primary docs: Unity Manual "Input System"
(
https://docs.unity3d.com/Manual/com.unity.inputsystem.html).
Related skills
input-systems— engine-agnostic input architecture (rebinding, buffering, multi-device).unity-csharp-scripting— the MonoBehaviour these handlers live in.unity-physics— applying the input vector to a Rigidbody.
What ships with it: 1 file
3.3 KB alongside SKILL.md
references/
- rebinding.md3.3 KB