Как работает Input System в Unity? В чем разница между старой и новой системой ввода?
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Введение в Unity Input System
Система ввода в Unity прошла значительную эволюцию от legacy Input Manager к современному Input System Package. Новая система предлагает более мощный, гибкий и кроссплатформенный подход к обработке пользовательского ввода.
Основы работы новой Input System
Input System работает на основе абстракции действий (Actions), которые не привязаны к конкретным устройствам. Основные компоненты:
- Input Actions - логические действия (прыжок, движение, атака)
- Input Action Assets - конфигурационные файлы, определяющие связи действий с физическими устройствами
- Input Devices - абстрактные представления физических устройств ввода
- Processors - обработчики для нормализации входных данных
Базовый пример настройки
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerMovement : MonoBehaviour
{
private PlayerInput playerInput;
private InputAction moveAction;
private void Awake()
{
playerInput = GetComponent<PlayerInput>();
moveAction = playerInput.actions["Move"];
}
private void OnEnable()
{
moveAction.performed += OnMove;
moveAction.canceled += OnMoveStopped;
}
private void OnDisable()
{
moveAction.performed -= OnMove;
moveAction.canceled -= OnMoveStopped;
}
private void OnMove(InputAction.CallbackContext context)
{
Vector2 movement = context.ReadValue<Vector2>();
// Обработка движения
}
}
Ключевые различия между старой и новой системами
Legacy Input Manager (старая система)
- Прямой доступ к клавишам через
Input.GetKey(),Input.GetAxis() - Жесткая привязка к конкретным клавишам в настройках проекта
- Ограниченная поддержка новых типов контроллеров
- Минимальная абстракция - код напрямую оперирует кодами клавиш
- Отсутствие событийной модели - требует опроса состояния в Update()
// Пример старого подхода
void Update()
{
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
if (Input.GetKeyDown(KeyCode.Space))
{
// Прыжок
}
}
Новый Input System Package
- Событийно-ориентированная архитектура - подписка на события ввода
- Абстракция действий - логические действия вместо конкретных клавиш
- Автоматическое переключение между устройствами (геймпад/клавиатура/тач)
- Продвинутые возможности:
- Rebinding - переназначение управление в рантайме
- Input Processors - фильтрация и нормализация ввода
- Композитные привязки - комбинации устройств для одного действия
- Пресеты устройств - поддержка различных контроллеров "из коробки"
Пример переназначения управление в новой системе
public class InputRebinder : MonoBehaviour
{
public InputActionReference jumpAction;
public void StartRebinding()
{
var rebindingOperation = jumpAction.action
.PerformInteractiveRebinding()
.WithControlsExcluding("Mouse")
.OnMatchWaitForAnother(0.1f)
.Start();
rebindingOperation.OnComplete(operation =>
{
// Сохранение новых привязок
var rebinds = operation.action.SaveBindingOverridesAsJson();
PlayerPrefs.SetString("rebinds", rebinds);
operation.Dispose();
});
}
}
Преимущества новой системы
- Кроссплатформенность - один код работает на всех платформах
- Гибкость конфигурации - настройка через Inspector или код
- Лучшая производительность - оптимизированная обработка событий
- Поддержка современных контроллеров - DualSense, Switch Pro Controller и др.
- Визуальная отладка - инструмент Input Debugger для анализа ввода
Миграция со старой системы
Для постепенного перехода можно использовать трансляцию событий:
// Компонент для совместимости со старым кодом
public class LegacyInputCompatibility : MonoBehaviour
{
public void OnJump(InputAction.CallbackContext context)
{
if (context.performed)
{
// Эмулируем вызов старого API
SendMessage("OnLegacyJump", SendMessageOptions.DontRequireReceiver);
}
}
}
Практические рекомендации
- Используйте Input Action Assets для централизованного управления вводом
- Применяйте Processors для нормализации значений (инверсия, deadzone)
- Реализуйте систему сохранения настроек управления
- Тестируйте на различных устройствах с помощью Input Debugger
Новая Input System требует больше начальной настройки, но предоставляет несравненно больше возможностей для создания качественного управления, особенно в кросс-платформенных проектах. Для новых проектов рекомендуется использовать именно ее, тогда как для поддержки legacy-проектов может быть оправдано использование старой системы.