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# событий
- Host: GitHub
- URL: https://github.com/madeyellow/inputbus
- Owner: madeyellow
- License: mit
- Created: 2025-11-07T10:44:34.000Z (8 months ago)
- Default Branch: main
- Last Pushed: 2025-11-09T11:23:29.000Z (8 months ago)
- Last Synced: 2025-11-09T11:27:20.159Z (8 months ago)
- Topics: events, input-system, unity
- Language: C#
- Homepage:
- Size: 68.4 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
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** создайте новую шину для работы с инпутом игрока.

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

Нажмите на кнопку **"Сгенерировать 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** и опишите баг/функционал. Я постараюсь добавить его, если он будет полезен этому пакету.