← Назад к вопросам

Как работает Input System в Unity? В чем разница между старой и новой системой ввода?

2.3 Middle🔥 112 комментариев
#C# и ООП

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Введение в 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();
        });
    }
}

Преимущества новой системы

  1. Кроссплатформенность - один код работает на всех платформах
  2. Гибкость конфигурации - настройка через Inspector или код
  3. Лучшая производительность - оптимизированная обработка событий
  4. Поддержка современных контроллеров - DualSense, Switch Pro Controller и др.
  5. Визуальная отладка - инструмент 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-проектов может быть оправдано использование старой системы.

Как работает Input System в Unity? В чем разница между старой и новой системой ввода? | PrepBro