fda094dd44
- Add SplashState delay timer using BootSettings.SplashDurationSeconds with cancellation support - Implement LoadState progress tracking via ReactiveProperty<float> with step-by-step updates - Update LoadingUIViewModel to accept and expose Progress reactive property - Connect LoadingUIView to ViewModel progress changes using UniRx subscriptions - Add CompositeDisposable for proper cleanup of UI subscriptions in Release() - Scale ProgressFill transform based on progress value for visual feedback Выполнена задача TASK-0005 и реализованы splash и loading состояния: - Добавлен таймер задержки в SplashState с использованием BootSettings.SplashDurationSeconds и поддержкой отмены - Реализован трекинг прогресса в LoadState через ReactiveProperty<float> со пошаговыми обновлениями - Обновлён LoadingUIViewModel для принятия и экспорта реактивного свойства Progress - Подключён LoadingUIView к изменениям прогресса ViewModel с использованием подписок UniRx - Добавлен CompositeDisposable для правильной очистки UI подписок в Release() - Масштабирование ProgressFill на основе значения прогресса для визуальной обратной связи
38 lines
2.0 KiB
Markdown
38 lines
2.0 KiB
Markdown
# TASK-0004: UI база и ViewModel слой
|
||
|
||
## Статус
|
||
|
||
Ready
|
||
|
||
## Цель
|
||
|
||
Создать базовый UI слой, в котором View отвечает только за Unity-ссылки и биндинги, а логика находится во ViewModel или state/flow сервисах.
|
||
|
||
## Что сделать
|
||
|
||
- Создать `IUIViewModel`.
|
||
- Создать `UIView : MonoBehaviour` с методами `Initialize()` и `Release()`.
|
||
- Создать `UIView<TVm> : UIView where TVm : IUIViewModel`.
|
||
- Добавить явную привязку ViewModel во View через метод вроде `Bind(TVm vm)` или `Setup(TVm vm)`.
|
||
- Сделать `Release()` идемпотентным для всех View.
|
||
- Подготовить View для splash, loading и menu экранов.
|
||
|
||
## Технические требования
|
||
|
||
- ViewModel должна быть обычным C#-классом, не `MonoBehaviour`.
|
||
- Runtime-данные передавать во View явно, а не через DI-поля MonoBehaviour.
|
||
- View не должна содержать orchestration-логику boot flow.
|
||
- Все подписки и listeners должны сниматься в `Release()`.
|
||
- Повторный вызов `Release()` не должен приводить к ошибкам.
|
||
|
||
## Критерии готовности
|
||
|
||
- Есть базовые классы `UIView` и `UIView<TVm>`.
|
||
- ViewModel можно передать во View явно перед `Initialize()`.
|
||
- `Release()` безопасен при повторном вызове.
|
||
- View не вызывает `FindObjectOfType`, не хранит глобальное состояние и не управляет переходами state machine.
|
||
|
||
## Заметки
|
||
|
||
MonoBehaviour должны оставаться presentation layer. Это соответствует задаче: логика находится в VM или сервисах, View только показывает состояние и прокидывает UI-события.
|