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 нужную вам схему;
В окне Project где-нибудь в папке Assets нажнимте правой кнопкой мышки и при помощи комадны Create > Input Bus > Input Service создайте новую шину для работы с инпутом игрока.
Добавьте к GameObject в котором располагается компонент PlayerInput компонент InputController из этого пакета. Укажите в поле Input Service созданную вами шину.
Нажмите на кнопку "Сгенерировать Input Scheme". Делайте это каждый раз, когда в InputActionsAsset добавляется новая схема.
Всё настроено и готов к работе! Далее рассмотрим как настроить маршрутизацию инпута и вашего метода-обработчика.
Представим, что вам нужно связать инпут "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;
- 🚀 Высокая производительность;
- 📦 Малый размер и отсутствие внешних зависимостей;
- Обработка смены схемы управления + событие смены схемы;
- Генератор схем на основе
PlayerInput; - Способ схемо-зависимой обработки инпута;
- Добавить в Samples примеры использования;
- Расписать все способы работы с пакетом;
Создайте Issue и опишите баг/функционал. Я постараюсь добавить его, если он будет полезен этому пакету.

