跳到主要内容
知仓学习社ZHICANG

unity-input-system

>

不碰外部(只输出文字)无严重或高危命中gamedev-skills/awesome-gamedev-agent-skills

它会碰到什么

扫了多少2 个文本文件,9 KB
它会碰到什么不碰外部(只输出文字)
命中总数0 处
命中统计严重 0 · 高 0 · 中 0 · 低 0

这一栏是扫描器报的事实,不是结论。命中多不等于有毒(安全工具、规则库、示例脚本本来就会包含危险写法),命中少也不等于干净。它和你手上的凭据、文件、网络有什么关系,需要你自己看。

技能内容

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.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.

  1. Create an .inputactions 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).

  1. 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.

  • Direct in code (InputActionReference / InputActionAsset) — most control; you

Enable() actions and read them. Best for systems and tools.

  1. Enable the actions/maps you read. PlayerInput enables its default map automatically;

actions you reference yourself must be .Enable()d (and disabled on teardown).

  1. Switch action maps for context (gameplay ↔ UI/menu) instead of guarding every handler.
  2. 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 to Enable() the action/map. PlayerInput auto-enables; raw InputActions do not.

  • 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).

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.

想直接用这个技能?

本站把开放许可(MIT / Apache 等)的技能按仓库打包整理到网盘,点一下转存到你自己的网盘,不用一个个从 GitHub 拉。许可未声明的技能只给原始仓库链接,不打包。