6c46b3043a
- Create 7 new task files (TASK-0001 through TASK-0007) - Add task template file for future use - Update Agent.md with project information - Update TASK.md with task tracking
36 lines
2.2 KiB
Markdown
36 lines
2.2 KiB
Markdown
# TASK-0006: MenuState и Restart
|
||
|
||
## Цель
|
||
|
||
Реализовать меню с кнопкой `Restart`, которое завершает `MenuState` и возвращает flow к загрузке.
|
||
|
||
## Что сделать
|
||
|
||
- Реализовать `MenuState`.
|
||
- Реализовать `MenuUIView`.
|
||
- Реализовать `MenuUIViewModel` или аналогичный plain C# объект для restart-сигнала.
|
||
- В `MenuState.EnterAsync` показать menu View и ожидать restart.
|
||
- Ожидание restart реализовать через `UniTaskCompletionSource` или аналогичный UniTask-friendly механизм.
|
||
- По нажатию кнопки `Restart` завершать ожидание `MenuState.EnterAsync`.
|
||
- В `MenuState.ExitAsync` release-нуть menu View и очистить подписки/listeners.
|
||
|
||
## Технические требования
|
||
|
||
- Кнопку подключать через `Button.onClick.AddListener(...)`.
|
||
- В `Release()` снимать ровно тот же listener через `RemoveListener(...)`.
|
||
- Не использовать `RemoveAllListeners()` как основной способ очистки.
|
||
- Не использовать анонимную лямбду, которую невозможно симметрично снять.
|
||
- Не переводить state machine напрямую из `MenuUIView`.
|
||
- Restart-событие должно попадать во flow через ViewModel/state, а не через глобальное состояние.
|
||
|
||
## Критерии готовности
|
||
|
||
- `MenuState.EnterAsync` завершается после нажатия `Restart`.
|
||
- После завершения `MenuState` внешний `BootFlowService` запускает `LoadState`.
|
||
- Несколько циклов `Menu -> Restart -> Load -> Menu` не дублируют callbacks.
|
||
- Повторный `Release()` у `MenuUIView` не падает.
|
||
|
||
## Заметки
|
||
|
||
Для кнопки лучше использовать method group или заранее сохраненный delegate. Это упрощает симметричный `AddListener`/`RemoveListener` и снижает риск дублирующихся callbacks.
|