События и 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 нужно сохранить и вызвать при отключении компонента.
on подписывает на одно событие, а onAny — на все. Оба метода возвращают функцию отписки.
emit не ждёт завершения асинхронных обработчиков. Если нужен строгий порядок выполнения, используем команды FSM.