t1k:unity:base:input-system
| Field | Value |
|---|---|
| Module | base |
| Version | 2.2.2 |
| Effort | high |
| Tools | — |
Keywords: controls, input, input system, unity
How to invoke
Section titled “How to invoke”/t1k:unity:base:input-systemUnity Input System
Section titled “Unity Input System”New Input System for Unity 6 (com.unity.inputsystem 1.15+). Replaces legacy Input.GetKey/GetAxis.
- Install
com.unity.inputsystemvia Package Manager - Project Settings → Player → Active Input Handling → “Input System Package” (or “Both”)
- Assets → Create → Input Actions — creates
.inputactionsasset - On asset Inspector: enable Generate C# Class → get a typed wrapper
Core API
Section titled “Core API”private GameInputActions _input;
void Awake() => _input = new GameInputActions();void OnEnable() { _input.Player.Enable(); _input.Player.Fire.performed += OnFire; }void OnDisable() { _input.Player.Fire.performed -= OnFire; _input.Player.Disable(); }
void Update() { Vector2 move = _input.Player.Move.ReadValue<Vector2>(); // continuous}void OnFire(InputAction.CallbackContext ctx) => Shoot(); // event-drivenAction Types
Section titled “Action Types”| Type | Use | ReadValue |
|---|---|---|
| Button | Press/release | float (0 or 1) |
| Value | Continuous | float, Vector2, Vector3 |
| PassThrough | Raw, no conflict resolution | Same as Value |
Callback Phases
Section titled “Callback Phases”started → input begins (key down, stick leaves center)performed → input completes (button press, hold threshold met)canceled → input ends (key up, stick returns to center)Use performed for buttons; read Value actions in Update().
PlayerInput Component
Section titled “PlayerInput Component”Attach to GameObject → assign .inputactions asset → pick Behavior:
| Behavior | How |
|---|---|
| Send Messages | OnMove(InputValue) called on same GameObject |
| Invoke Unity Events | Wire in Inspector |
| Invoke C# Events | playerInput.onActionTriggered |
Local multiplayer: PlayerInputManager (auto-spawns per player, split-screen).
DOTS / ISystem Integration
Section titled “DOTS / ISystem Integration”Input is managed — cannot read inside Burst. Pattern: SystemBase reads → singleton → Burst ISystem consumes.
// 1. Singleton component (unmanaged)public struct PlayerInputData : IComponentData { public float2 Move; public bool FireThisFrame;}
// 2. Managed reader (NOT Burst) — InitializationSystemGroup[UpdateInGroup(typeof(InitializationSystemGroup))]public partial class InputReaderSystem : SystemBase { private GameInputActions _input; protected override void OnCreate() { _input = new GameInputActions(); _input.Player.Enable(); EntityManager.CreateSingleton<PlayerInputData>(); } protected override void OnUpdate() { SystemAPI.SetSingleton(new PlayerInputData { Move = (float2)_input.Player.Move.ReadValue<Vector2>(), FireThisFrame = _input.Player.Fire.WasPressedThisFrame(), }); } protected override void OnDestroy() => _input.Dispose();}
// 3. Burst ISystem reads singleton[BurstCompile]public partial struct MoveSystem : ISystem { public void OnUpdate(ref SystemState state) { var input = SystemAPI.GetSingleton<PlayerInputData>(); // use input.Move, input.FireThisFrame }}→ See references/dots-input-basics.md for singleton bridge, fixed timestep buffering, FixedInputEvent, lifecycle patterns.
→ See references/dots-input-advanced.md for action map switching, Netcode IInputComponentData, MonoBehaviour bridge, anti-patterns.
Common Gotchas
Section titled “Common Gotchas”- Enable action maps — actions don’t fire until
Enable()is called - Button phase — use
performed, notstarted, for single press - InputValue lifetime — only valid inside callback; don’t cache
- ISystem + Burst — never call Input System inside
[BurstCompile]; use singleton bridge - “Both” input mode — can cause duplicate events if old
Inputcode remains - UI stops working — replace
StandaloneInputModulewithInputSystemUIInputModule - Rebinding UI — use
WithSuppressedActionPropagation()(1.15+) to prevent actions firing during rebind - OnScreenStick deadzone — virtual sticks have no built-in deadzone; add
stickDeadzoneprocessor - WasPressedThisFrame lost in FixedStep — true for only ONE variable frame; use
FixedInputEventfor fixed-rate systems - InputActions.Dispose() mandatory — generated class is
IDisposable; missing it leaks native memory - Netcode: no polling in PredictedSimulationSystemGroup — re-runs on rollback; use
IInputComponentDataonly
Reference Files
Section titled “Reference Files”| File | Content |
|---|---|
references/bindings-processors-interactions.md | Processors, interactions, composites, rebinding, gamepad rumble |
references/ui-debugging-onscreen.md | InputSystemUIInputModule, Input Debugger, OnScreenButton/Stick |
references/dots-input-basics.md | Singleton bridge, fixed timestep buffering, FixedInputEvent, lifecycle |
references/dots-input-advanced.md | Action map switching, Netcode IInputComponentData, anti-patterns |
references/device-management-testing.md | Device lifecycle, InputTestFixture, custom devices |