Skip to content

Шина обработки Unity Input System на основе C# событий

License

MIT, Unknown licenses found

Licenses found

MIT
LICENSE
Unknown
LICENSE.meta
Notifications You must be signed in to change notification settings

madeyellow/InputBus

Repository files navigation

Warning

Этим пакетом уже можно пользоваться, но он ещё на ранней стадии разработки. Возможно некоторые его части могут измениться.

❓ Что это такое?

Используйте C# event из PlayerInput в Unity без лишнего кода и хлопот.

Этот пакет реализует подобие "шины", слушая происходящие в PlayerInput действия InputAction и автоматически маршрутизирует их к нужным игровым методам-обработчикам! Вам остаётся только реализовать.

Добавить методы-обработчики к маршрутизации можно следующим образом:

// Это нужно добавить внутрь вашего MonoBehaviour где вы будете принимать инпут

using MadeYellow.InputBus;

public class MyInputController : MonoBevaiour {
  // Не забудьте назначить сюда ту же шину, что вы указывали для InputController!
  [SerializeField]
  private InputService _inputService;

  // Ваш класс, куда нужно передать команду
  private MyCharacter _character;

  // И при вызове Start однократно подписать нужные методы-обработчики на `InputActions`
  private void Start() {
    _character = GetComponent<MyCharacterClass>();

    // Подписываем методы Move и Sprint в _character на InputAction с названиями Move и Sprint
    _inputService
                .Subscribe(_character.Move)
                .Subscribe(_character.Sprint);
  }
}

💾 Установка

  • Откройте Unity Package Manager (Window > Package Manager) ИЛИ (Window > Package Management > Package Manager) для Unity 6;
  • Нажмите "+" → "Add package from git URL";
  • Вставьте URL этого репозитория (можно скопировать ниже) и нажмите Install;
https://github.com/madeyellow/InputBus.git

🚀 Начало работы

Предварительные условия

Note

Если вы уже используете и настроили ранее PlayerInput - то можете пропустить этот шаг.

Если вы ещё не используете компонент PlayerInput (это компонент Unity для работы с "новой" Input System), то:

  • Создайте пустой GameObject;
  • Добавьте к нему компонент PlayerInput;
    • Укажите в поле Actions нужную вам схему;

Шаг 1. Настройка шины

В окне Project где-нибудь в папке Assets нажнимте правой кнопкой мышки и при помощи комадны Create > Input Bus > Input Service создайте новую шину для работы с инпутом игрока.

Создание шины интупа

Добавьте к GameObject в котором располагается компонент PlayerInput компонент InputController из этого пакета. Укажите в поле Input Service созданную вами шину.

Установка компонентов системы

Нажмите на кнопку "Сгенерировать Input Scheme". Делайте это каждый раз, когда в InputActionsAsset добавляется новая схема.

Всё настроено и готов к работе! Далее рассмотрим как настроить маршрутизацию инпута и вашего метода-обработчика.

Шаг 2. Реализация метода-обработчика

Представим, что вам нужно связать инпут "Move" (допустим это клавиши WASD, образующие Vector2) с какой-то функцией, которая будет запоминать инпут пользователя и двигать персонажа игрока.

В классе, который должен двигать игрока нужно добавить связь с шиной и подписаться на нужный инпут. Будет выглядеть это так:

using MadeYellow.InputBus.Components; // Добавляем это, чтобы использовать шину
using UnityEngine.InputSystem; // Добавляем это, чтобы использовать типы InputSystem

public class MyCharacter : MonoBehaviour 
{
    // Добавляем ссылку на шину
    public InputService inputBus; 
    
    // В эту переменную мы сохраним инпут перемещения от игрока.
    // Что-то подобное у вас уже скорее всего есть.
    private Vector2 _moveInput; 
    
    private void Start() 
    {
        // Добавляем метод Move в шину (вызываем один раз), чтобы принимать инпут от игрока.
        // Функция Move для его обработки будет вызываться автоматически
        inputBus.Subscribe(Move);   
    }
    
    // Добавляем метод-обработчик. Называем его так же, как называется инпут!
    // Можете реализовать его тело как угодно. Самый простой пример представлен внизу.
    public void Move(InputAction.CallbackContext context)
    {
        if (context.performed)
            // Когда пользователь выполнил инпут для перемещения - считать что он нажал
            _moveInput = context.ReadValue<Vector2>();  
        else if (context.canceled)
            // Если пользователь отпустил все кнопки - запомнить это и сбросить инпут
            _moveInput = Vector2.zero; 
    }
    
    // Ваша логика перемещения персонажа - может быть абсолютно любой.
    private void Update() 
    {
        transform.Translate(new Vector3(_moveInput.x, 0f, _moveInput.y) * 10 * Time.deltaTime, Space.World);
    }
}

⚡ Почему вам это понравится

  • 🧠 Быстрый старт и удобное использование;
  • ⚡ Автоматическая маршрутизация инпута к методам без лишних заморочек;
  • 💎 Понятное и мощное API;
  • 🚀 Высокая производительность;
  • 📦 Малый размер и отсутствие внешних зависимостей;

🗺️ Roadmap

Запланированные функции

  • Обработка смены схемы управления + событие смены схемы;
  • Генератор схем на основе PlayerInput;
  • Способ схемо-зависимой обработки инпута;
  • Добавить в Samples примеры использования;
  • Расписать все способы работы с пакетом;

🐞 Нашли баг или хотите запросить какой-то функционал?

Создайте Issue и опишите баг/функционал. Я постараюсь добавить его, если он будет полезен этому пакету.

About

Шина обработки Unity Input System на основе C# событий

Topics

Resources

License

MIT, Unknown licenses found

Licenses found

MIT
LICENSE
Unknown
LICENSE.meta

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages