# TASK-0005: SplashState, LoadState и прогресс ## Цель Реализовать splash и loading состояния с настоящей отменой async-операций и реактивным прогрессом через UniRx. ## Что сделать - Реализовать `SplashState`. - В `SplashState.EnterAsync` показать splash View и подождать 1 секунду через `UniTask.Delay(..., cancellationToken: ct)`. - В `SplashState.ExitAsync` скрыть или release-нуть splash View. - Реализовать `LoadState`. - В `LoadState` создать реактивный прогресс от `0` до `1` через UniRx. - Наружу отдавать progress как read-only значение или read-only интерфейс. - В `LoadState.EnterAsync` сбрасывать progress в `0f`. - Выполнить 5 шагов загрузки по 200 мс с обновлениями `0.2f`, `0.4f`, `0.6f`, `0.8f`, `1f`. - Реализовать `LoadingUIView`, подписанный на progress. ## Технические требования - Использовать UniTask и `CancellationToken` во всех delay. - Использовать UniRx для progress и подписок. - Подписки хранить в `CompositeDisposable` и очищать в `Release()`. - `LoadingUIView` не должна менять progress, только читать его. - Не обновлять progress UI через `Update()`. - При использовании tween/lerp останавливать предыдущую визуализацию перед запуском новой. ## Критерии готовности - `SplashState` отменяется через внешний `CancellationToken`. - `LoadState` выставляет ожидаемую последовательность progress значений. - `LoadingUIView` корректно обновляет progress bar. - При выходе из `LoadState` подписки очищаются. - Повторный вход в `LoadState` не создает дублирующихся подписок и не вызывает `NullReferenceException`. ## Заметки В этом проекте важнее чистый lifecycle и гигиена подписок, чем сложная анимация progress bar. Достаточно прямого обновления или простого lerp.