55e271805b
- 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
2.3 KiB
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.