Files
QuizPlease/Agent/Task/TASK-0003.md
T
horooko 55e271805b feat(task-0003): implement boot flow service with menu restart signal and state transitions
- Implement BootFlowService with IStatesController injection and RunFlowAsync logic
- Add Splash → Load → Menu loop with cancellation support in boot flow
- Create IMenuRestartSignal interface for menu restart coordination
- Implement MenuRestartSignal using UniTaskCompletionSource
- Update MenuState to wait for restart signal instead of completing immediately
- Register MenuRestartSignal as singleton in GameLifetimeScope DI container

Выполнена задача TASK-0003 и реализован поток загрузки:
- Реализован BootFlowService с внедрением IStatesController и логикой RunFlowAsync
- Добавлен цикл Splash → Load → Menu с поддержкой отмены в потоке загрузки
- Создан интерфейс IMenuRestartSignal для координации перезапуска меню
- Реализован MenuRestartSignal с использованием UniTaskCompletionSource
- Обновлён MenuState для ожидания сигнала перезапуска вместо немедленного завершения
- Зарегистрирован MenuRestartSignal как синглтон в DI контейнере GameLifetimeScope
2026-05-27 04:13:29 +07:00

2.3 KiB

TASK-0003: BootFlowService и запуск сценария

Статус

Ready

Цель

Реализовать внешний flow coordinator, который запускает и управляет сценарием загрузки приложения.

Что сделать

  • Создать BootFlowService : Service или сервис с аналогичным lifecycle.
  • Реализовать сценарий Splash -> Load -> Menu -> Load -> Menu ....
  • Сделать так, чтобы SplashState выполнялся один раз при старте.
  • После MenuState возвращаться в LoadState по restart-сигналу.
  • Создать BootstrapEntryPoint, который запускается через VContainer entry point.
  • Запустить BootFlowService из entry point через UniTask.
  • Корректно обработать штатную отмену, не логируя ее как ошибку.

Технические требования

  • Использовать IAsyncStartable или подходящий VContainer entry point для запуска.
  • Не запускать boot flow из MonoBehaviour.Start() вручную.
  • Не делать самопереключающиеся states, которые вызывают EnterStateAsync(...) изнутри своего EnterAsync(...).
  • OperationCanceledException считать нормальным завершением при уничтожении scope или остановке flow.
  • Все ожидания должны использовать токен, полученный сверху.

Критерии готовности

  • При старте выполняется последовательность Splash -> Load -> Menu.
  • Нажатие Restart запускает новый цикл Load -> Menu.
  • При отмене токена boot flow завершается без зависших UniTask.
  • Orchestration-код находится в plain C# классе, не во View.

Заметки

Рекомендуемый сценарий: внешний сервис вызывает _states.EnterStateAsync(...) последовательно. Это проще защищать на ревью и не создает проблем с reentrancy внутри states.