Ввод в Unity: настройка Input System, действий и управления без привязки к одной клавише

Если код движения проверяет только W, добавить геймпад или изменить управление трудно. Input System позволяет описать намерение пользователя — например Move или Jump — и связать его с устройствами отдельно от игрового поведения.

Настроим действие Move и подключим его к простому объекту. Пример рассчитан на Unity 6 и Input System 1.11 или совместимую более новую версию. Объект перемещается без физики; Rigidbody здесь не используется.

ТОП-5 курсов обучения Unity:

Сначала выберите систему ввода

В старых проектах встречается Input Manager и вызовы Input.GetAxis. В новых можно использовать пакет Input System. Они требуют согласованной настройки Active Input Handling в Player Settings.

Установите Input System через Package Manager и выберите Input System Package (New) либо Both, если действительно нужны обе системы. Перезапустите Editor при запросе. Both удобен при постепенной миграции, но не исправляет автоматически ошибки в коде и двойную обработку одного действия.

Порядок включения описан в руководстве установки. Если старый код сообщает об использовании отключённого backend, сначала проверьте это сочетание.

Action, binding и action map

Action описывает действие и ожидаемое значение. Binding связывает его с конкретным control: клавишей, стиком или кнопкой. Action Map группирует действия, например Gameplay и Menu.

Move обычно возвращает Vector2. Jump — действие кнопки. Look может получать delta мыши или значение стика, но эти источники имеют разный смысл и могут требовать разной обработки времени.

Такая структура позволяет включить управление меню и выключить gameplay при паузе. Решение о доступности действий принадлежит состоянию игры, а не каждой кнопке отдельно.

Создайте действие Move

  1. Создайте Input Actions asset, например GameControls, и откройте редактор действий.
  2. Добавьте Action Map Gameplay.
  3. Добавьте action Move: Action Type Value, Control Type Vector2.
  4. Добавьте 2D Vector composite с Up=W, Down=S, Left=A, Right=D.
  5. Добавьте отдельный binding <Gamepad>/leftStick.
  6. Сохраните asset.

Composite объединяет несколько кнопок в вектор. Для цифровой диагонали полезна нормализация; в коде дополнительно ограничим длину результата. Устройство bindings описано в документации.

Подключите action к компоненту

Создайте Cube без Rigidbody и файл ActionMoveExample.cs. Прикрепите компонент к Cube. В поле Move Action выберите Gameplay/Move из GameControls. В этом примере компонент сам включает и выключает действие; PlayerInput добавлять не нужно.

using UnityEngine; using UnityEngine.InputSystem; public class ActionMoveExample : MonoBehaviour { [SerializeField] private InputActionReference moveAction; [SerializeField] private float speed = 3f; private void OnEnable() { if (moveAction == null || moveAction.action == null) { Debug.LogError("Назначьте действие Move", this); enabled = false; return; } moveAction.action.Enable(); } private void OnDisable() { if (moveAction != null && moveAction.action != null) moveAction.action.Disable(); } private void Update() { Vector2 input = moveAction.action.ReadValue<Vector2>(); input = Vector2.ClampMagnitude(input, 1f); Vector3 direction = new Vector3(input.x, 0f, input.y); transform.position += direction * speed * Time.deltaTime; } }

В Play проверьте WASD, диагональ и левый стик подключённого геймпада. Стик должен давать аналоговую интенсивность движения. Для физического персонажа передавайте полученное намерение контроллеру Rigidbody или CharacterController, а не копируйте запись Transform без учёта выбранного способа движения.

Если это action используют несколько компонентов, один из них не должен случайно выключать его для остальных. Определите единого владельца включения action map. PlayerInput предоставляет другой способ управления вводом, особенно для нескольких игроков и control schemes; не смешивайте его с примером без продуманной ответственности.

Чтение значения и события

Для непрерывного движения удобно читать текущее Vector2. Для отдельного нажатия используйте методы или callbacks действия, соответствующие нужному моменту. Started, performed и canceled зависят от типа действия и interactions.

Не считайте каждое performed универсальным «пользователь один раз нажал кнопку». Hold и другие interactions меняют условия. Подписки на callbacks удаляйте симметрично, чтобы повторное включение экрана не дублировало обработку.

Логику действий и их жизненного цикла объясняет руководство Actions.

UI, фокус и проверка устройств

Для uGUI с новым Input System проверьте InputSystemUIInputModule у EventSystem и назначение UI-actions. Если кнопка не нажимается, проблема может быть в модуле UI, даже когда движение персонажа работает.

Открытое меню не обязательно автоматически запрещает gameplay-actions. Переключайте maps или состояние управления явно. При тестировании Editor убедитесь, что Game имеет фокус.

Через Input Debugger можно проверить, видит ли пакет устройство и меняются ли его controls. Диагностику проводите по слоям: устройство, binding, action, затем игровой компонент. UI разобран в отдельной статье, а выбор движения — в материале о персонаже.

Документация