# 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.