# Клиент: визуальное направление **Статус:** зафиксировано 2026-10-21. Это решение для клиента Unity; серверные контракты и `Vanguard.Rules` не меняются. ## Решение - Клиент делаем в **3D** (Unity 6, URP), а не как плоский 2D-интерфейс. - Основные экраны — **отдельные сцены**, каждая со своим 3D-окружением, камерой, светом и UI-слоем: 1. **Login** — вход/регистрация; 2. **Lobby** — лобби, профиль, выбор режима, очередь, магазин/история; 3. **Collection** — коллекция карт; 4. **DeckBuilder** — конструктор колоды; 5. **Battle** — боевой стол. - **Boot** — служебная сцена: поднимает `VanguardApp`, DI-контейнер, сервисы, сеть, аудио и локализацию. Пользователю не показывается. - Очередь, онбординг и настройки — **оверлеи внутри Lobby**, отдельными сценами не являются. - В Unity «отдельные окна» означают **отдельные сцены-экраны** внутри одного окна приложения, а не несколько OS-окон. ## Что остаётся общим Между сценами живут и не пересоздаются: - `VanguardApp` + VContainer; - `ApiClient`, `AuthService`, `MetaService`, `TokenStore`, `PlayerState`; - `GameConnection` и боевое состояние; - аудио, локализация, Addressables, настройки; - `SceneFlow` — единая точка переходов между сценами. Сцены отвечают за 3D-презентацию и свой UI. Сервисы не должны зависеть от конкретной сцены. ## План миграции с текущего gray-box Сейчас работает один runtime-Canvas (`AppRootView`) со всеми экранами — это функциональный каркас. Его сохраняем как основу логики и постепенно разносим: - `LoginView` → сцена **Login** (3D-фон/стол, форма поверх); - `MetaView` → сцена **Lobby** (3D-холл, панель профиля и входы в разделы); - `CollectionView` → сцена **Collection** (3D-витрина/альбом карт); - `DecksView` + будущий декбилдер → сцена **DeckBuilder** (3D-стол, стопка колоды, карты, фильтры); - `QueueView` → оверлей в **Lobby**; - `BattleView` → сцена **Battle** (3D-стол, зоны, карты, камера, UI рук и таймера). Сетевые и доменные классы (`GameConnection`, `ApiClient`, `MetaService`) переносятся без изменения контрактов. Сцены подключаются через `SceneFlow`; `Boot` остаётся загруженной/персистентной. ## Ограничения и следующие шаги - Пока нет 3D-ассетов: карты в gray-box показываются по `printingId`. Арт и 3D-модели будут подключаться по `cardId` через Addressables. - Ближайший визуальный шаг — создать пустые сцены Login/Lobby/Collection/ DeckBuilder/Battle, добавить `SceneFlow` и перенести Login/Lobby. - Боевые анимации, камера и 3D-карты — после стабилизации сетевого протокола и базового UI.