An open API service indexing awesome lists of open source software.

https://github.com/madeyellow/inputbus

Шина обработки Unity Input System на основе C# событий
https://github.com/madeyellow/inputbus

events input-system unity

Last synced: about 1 month ago
JSON representation

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

Awesome Lists containing this project

README

          

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

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

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

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

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

using MadeYellow.InputBus;

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

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

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

// Подписываем методы 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** создайте новую шину для работы с инпутом игрока.

![Создание шины интупа](https://github.com/madeyellow/InputBus/blob/main/Samples/Images/how-to-create-input-bus.jpg)

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

![Установка компонентов системы](https://github.com/madeyellow/InputBus/blob/main/Samples/Images/how-to-set-components.jpg)

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

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

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

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

```csharp
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();
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
## Запланированные функции
- [x] Обработка смены схемы управления + событие смены схемы;
- [x] Генератор схем на основе `PlayerInput`;
- [x] Способ схемо-зависимой обработки инпута;
- [ ] Добавить в Samples примеры использования;
- [ ] Расписать все способы работы с пакетом;

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

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