Skip to main content
skill Claude Code CX Codex Cursor GitHub Copilot

unity-input-system — Claude Code skill: what it does, how to install

A Claude Code skill that wires player input in Unity 6.3 LTS with the Input System package: action maps, PlayerInput, values read in C#.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill unity-input-system -a claude-code
Open on GitHub

What unity-input-system does

The skill walks the agent through Unity's modern Input System: package com.unity.inputsystem 1.x, with 1.20 shipping in 6.3 LTS. It builds .inputactions assets, splits actions into maps, binds keyboard, gamepad and touch, and shows both ways of reading values, through callbacks or by polling in Update.

Work starts at Project Settings → Player. Unless Active Input Handling is set to Input System Package (New) or Both, the package gets nothing, because the legacy Input Manager holds the input. Then it picks a reading style: a PlayerInput component, project-wide actions via InputSystem.actions.FindAction("Move"), or an InputActionReference you call Enable() on. C# samples for each are included, along with the failure modes.

Scope is Unity's own API. It won't design a rebinding layer that works across engines, and moving the character once you have the vector belongs to unity-physics and unity-csharp-scripting. Unsubscribing in OnDisable is on you as well; skip the -= and the subscriptions leak.

What it helps with

  • bind Move to WASD and a gamepad stick with one action
  • split input into action maps and swap them between gameplay and menus
  • fix dead input left behind by the legacy Input Manager
  • read a Vector2 stick value without checking keys by hand
  • catch a button press through performed instead of per-frame ReadValue

Example prompts for the agent

  • Add a `Gameplay` action map to `InputSystem_Actions.inputactions`: `Move` as Value/Vector2 on WASD and the left stick, `Jump` and `Fire` as Button.
  • Put `PlayerInput` on the player with Send Messages behavior and write the `OnMove` and `OnJump` handlers.
  • The player still fires with the menu open. Disable the `Gameplay` map on pause and enable `UI`.

How to install unity-input-system

1Skills CLI (Vercel)

npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill unity-input-system -a claude-code

2Manually: put the files in place

~/.claude/skills/unity-input-system/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/unity-input-system/

From the same set40

The whole set →
game-feel gamedev-skills Teaches the agent to add feedback to game actions: camera shake, hit-stop, eased tweens, squash and stretch, knockback. For mechanics that work but feel weightless. Claude Code CX Codex Cursor +1 9,400installs game-ui-ux gamedev-skills Engine-neutral game UI architecture skill for responsive layouts, screen stacks, gamepad focus, and event-driven HUD updates. Claude Code CX Codex Cursor +1 9,200installs level-design gamedev-skills Plans playable game levels from blockout through playtesting, covering routes, pacing, gates and encounters. Use it when working on whiteboxes, critical paths or room flow. Claude Code CX Codex Cursor +1 7,500installs camera-systems gamedev-skills Engine-neutral patterns for 2D and 3D game cameras: smooth follow, deadzones, look-ahead, bounds clamping, and third-person collision. Claude Code CX Codex Cursor +1 7,100installs audio-design gamedev-skills A skill that treats game audio as a mixer graph: buses, gain in decibels, sidechain ducking, adaptive music and beat-synced events. Samples use Godot 4.7, Unity gets notes. Claude Code CX Codex Cursor +1 7,100installs performance-optimization gamedev-skills A skill that turns “the game runs slow” into a measured bottleneck and a specific fix: profile first, then pool objects, batch draw calls, cut allocations. Claude Code CX Codex Cursor +1 7,100installs game-ai gamedev-skills Designs NPC decision-making, behavior trees, steering forces, and A* pathfinding. Useful when building game enemy logic across engines. Claude Code CX Codex Cursor +1 7,100installs input-systems gamedev-skills Engine-neutral input system: map keys to named actions, rebinding with conflict detection, keyboard, gamepad and touch support, analog deadzones, input buffering and coyote time. Claude Code CX Codex Cursor +1 6,800installs

Similar

threejs-game-ui-designer majidmanzarpour Skill for designing game UIs in Three.js: HUDs, menus, pause and win screens, responsive layout for mobile and desktop. Prevents overlaps, ensures readability, and keeps UI cohesive with game style. Claude Code CX Codex Cursor +1 3,300installs threejs-gameplay-systems majidmanzarpour Scaffolds and tunes playable Three.js browser games with Vite and TypeScript. Helps design core loops, handle input, camera motion, and Rapier physics. Claude Code CX Codex Cursor +1 3,300installs orbit-card heygen-com Adds a 10-second 1920×1080 HyperFrames motion block where a single feature card orbits a dot sphere using exported Blender camera paths. Claude Code CX Codex Cursor +1 9,800installs sdf earthtojake This skill authors and validates SDFormat files for models and worlds, then helps prepare them for simulator handoff. Claude Code CX Codex Cursor +1 10,500installs urdf earthtojake This skill helps create, validate, and debug URDF robot descriptions. Use it when working with links, joints, geometry, meshes, or inertial data. Claude Code CX Codex Cursor +1 10,400installs hatch-pet official openai Creates and packages animated pets and spritesheets for Codex. Use it to turn a character concept, reference image, or brand cues into a pet. Claude Code CX Codex Cursor +1 3,300installs gcode earthtojake Slices STL, 3MF, and OBJ models into printer-ready G-code through OrcaSlicer. Use it when you need a print file without connecting to the printer. Claude Code CX Codex Cursor +1 9,500installs dxf earthtojake Generates and validates 2D DXF drawings from Python build123d scripts: outlines, gaskets, panels, flat patterns for cutting. Claude Code CX Codex Cursor +1 9,100installs

Questions about unity-input-system

How to install unity-input-system in Claude Code?

Run npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill unity-input-system -a claude-code. The skill lands at ~/.claude/skills/unity-input-system/SKILL.md.

What does unity-input-system do?

It tells the agent how to use the com.unity.inputsystem package in Unity 6.3 LTS: action maps, the PlayerInput component, project-wide actions, and reading values by callback or polling.

Why does a button read as zero after setup?

Button presses are edge events, so ReadValue in Update returns 0. Use the performed callback or WasPressedThisFrame(), and call Enable() on actions that come from another asset.

Source text

SKILL.md · Apache-2.0
---
name: unity-input-system
description: >
  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, action maps, PlayerInput, control schemes, or rebinding.
---

# 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)

```csharp
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)

```csharp
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. Project-wide actions (no asset reference)

```csharp
using UnityEngine;
using UnityEngine.InputSystem;

public class ProjectWideMover : MonoBehaviour
{
    private InputAction _move, _jump;

    private void Awake()
    {
        // Looked up once; project-wide actions are preloaded and enabled by default.
        _move = InputSystem.actions.FindAction("Move");
        _jump = InputSystem.actions.FindAction("Jump");
    }

    private void Update()
    {
        Vector2 move = _move.ReadValue<Vector2>();
        if (_jump.WasPressedThisFrame()) { /* jump */ }
    }
}
```

### 4. Event callbacks + switching action maps (gameplay ↔ UI)

```csharp
[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 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/[email protected]/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.

© gamedev-skills · Apache-2.0 · gamedev-skills/awesome-gamedev-agent-skills

See also

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor