unity-input-system
Wire player input in Unity 6.3 LTS 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
By gamedev-skills · 2,203 installs
npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill unity-input-system
Source repository · Upstream listing
Unity Input System (new)
Read input through Unity's Input System package ( com.unity.inputsystem 1.x; Unity 6.3 LTS
ships 1.20) — action based, device agnostic, rebindable. Targets Unity 6.3 LTS . 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 .inputactions asset with
action maps and control schemes, wiring a PlayerInput component, reading a Vector2
stick/WASD value, or handling gamepad + keyboard + touch from one set of actions.
Use when Packages/manifest.json contains com.unity.inputsystem or the project has an
.inputactions asset.
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
1. Check Active Input Handling (Project Settings → Player). The package only receives
input when this is Input System Package (New) or Both . Both is required if any old
Input.GetAxis code remains.
2. Find or create the .inputactions asset. New Unity 6 projects usually already have one
assigned as the project wide actions (Project Settings → Input System Package; the
template file is InputSystem Actions.inputactions ) — reuse it rather than adding a
second asset. 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).
3. Choose how to read it:
PlayerInput component (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.
Project wide actions in code ( InputSystem.actions.FindAction("Move") ) — no asset
reference to wire up, and the actions are already enabled.
Direct in code ( InputActionReference / InputActionAsset ) — most control; you
Enable() actions and read them. Best for systems and tools.
4. Enable the actions/maps you read. PlayerInput enables its default map automatically
and project wide actions start enabled; actions from any other asset must be .Enable() d
(and disabled on teardown).
5. Switch action maps for context (gameplay ↔ UI/menu) instead of guarding every handler.
6. 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)
2. Reading an action directly in code (polling a value)
3. Project wide actions (no asset reference)
4. Event callbacks + switching action maps (gameplay ↔ UI)
Pitfalls
No input at all → either Active Input Handling is still Input Manager (Old) , or you
forgot to Enable() the action/map. PlayerInput and project wide actions start enabled;
actions from other assets do not.
Gameplay actions fire while a menu is open → project wide actions enable every action
map at startup, including when PlayerInput uses that asset. In Start , disable the maps
you do not want ( InputSystem.actions.FindActionMap("UI").Disable() ) and enable only the
current one.
FindAction returns null → the name (or Map/Action path) does not exist in that
asset. Check the spelling in the Actions Editor; with project wide actions, make sure the
asset you edited is the one assigned in Project Settings → Input System Package.
InvalidOperationException about the old input backend → some script still calls
Input.GetAxis / Input.GetKey while Active Input Handling is New . Port it or set Both .
Buttons read as 0 with ReadValue → button presses are edge events; use the
performed callback (or WasPressedThisFrame() ), not per frame ReadValue for triggers.
Send Messages handlers never fire → the receiving script must be on the same
GameObject as the PlayerInput ; Broadcast Messages reaches children too.
Leaking subscriptions → unsubscribe ( = ) in OnDisable ; re subscribing in OnEnable
without 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 with PlayerInputManager , read
references/rebinding.md .
Primary docs: Unity Manual "Input System"
( https://docs.unity3d.com/Manual/com.unity.inputsystem.html ) and the package manual
( https://docs.unity3d.com/Packages/com.unity.inputsystem@1.20/manual/index.html ),
including "About project wide actions".
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.