EventBus07 / 13

События и EventBus

Отправитель сообщает факт, а подписчики выбирают свою реакцию.

EventBus связывает сервисы, компоненты и FSM через события. После изменения очков сервис не ищет Text-узел: он отправляет ScoreChanged.

Фрагмент отправки события из BlockPuzzleGameplayService.ts:

this.sceneContext.engine.events.emit({
  type: BlockPuzzleEvents.ScoreChanged,
  data: { score: this.getSession().score, delta },
});

Публичный метод emit принимает data. Подписчик получает AppEvent, где те же данные находятся в payload. Сократим обработчик из BlockPuzzleScoreComponent.ts:

const off = this.node.events.on(BlockPuzzleEvents.ScoreChanged, (event) => {
  const payload = SchemaDecoder.decode(
    event.payload,
    BlockPuzzleEventSchemas.ScoreChanged,
    BlockPuzzleEvents.ScoreChanged,
  );
  this.node.setText(String(payload.score));
});

Подписка и обновление текста объединены для примера; в исходном компоненте это разные методы. Функцию off нужно сохранить и вызвать при отключении компонента.

01
Отправительemit({ type, data })
02
EventBusПреобразует data → payload
03
ПодписчикAppEvent → декодер → действие
04
FSMEngineEventBridge ставит событие в очередь активной FSM
Шина меняет оболочку события; сама полезная нагрузка не становится проверенной автоматически.

on подписывает на одно событие, а onAny — на все. Оба метода возвращают функцию отписки.

emit не ждёт завершения асинхронных обработчиков. Если нужен строгий порядок выполнения, используем команды FSM.