В Zenject событие называeтся
Signal, очевидно, это сделано для того, чтобы не было конфликта с зарезервированным в C# словом event. В не буду рассказывать о преимуществах Event Bus (шины событий), этой информации полно в интернете, скажу лишь, что я не представляю разработку игры без использования этого паттерна.
Приведу пример, как я использую и чем мне помогают события при разработке игры на Unity.
В моей игре, уровень начинается с того, что игрок нажимает кнопку влево или вправо. За ввод данных (player input) отвечает один монобех,
PlayerController, который знает, когда уровень начался или ещё нет. Он и "бросает" событие PlayLevel.Есть ряд действий, которые нужно выполнить в тот момент, когда начинается уровень:
- Камера переходит из начального положения в игровое положение (меняется
offset)- Изменяется фоновая музыка
- С экрана убирается подсказка
- Запускается процесс потребления топлива
Все компоненты, отвечающие за эти действия, подписаны на сигнал
PlayLevel и выполняют действия в нужный момент. Без событий мне бы пришлось либо в каждом компоненте дублировать логику, которая понимает, что начался уровень, либо добавлять в PlayerController все эти компоненты как зависимости, чтобы PlayerController явно вызывал в них нужные действия. И первый, и второй вариант полностью убивают архитектуру игры, и я вижу шину событий единственным адекватным решением задачи.В пользу Zenject'а по сравнению с событиями, реализованными с помощью
Scriptable Objects, замечу, что с Zenject1) мне не нужно присваивать значения в инспекторе, всё происходит в коде
2) я могу легко найти все места, где используется какое-то событие в IDE, поиском по местам использования класса
PlayLevel#zenject