diff --git a/IMPLEMENTATION_CHECKLIST.md b/IMPLEMENTATION_CHECKLIST.md index 796e9ea..8a4972c 100644 --- a/IMPLEMENTATION_CHECKLIST.md +++ b/IMPLEMENTATION_CHECKLIST.md @@ -226,9 +226,16 @@ **6000.6.6f1**. Уже работают логин/регистрация, refresh, `/me`, выход и главный экран профиля. Подробности — `client/README.md` и `docs/HANDOFF.md`. +**Визуальное направление зафиксировано:** 3D-клиент на URP, отдельные +сцены-экраны **Login / Lobby / Collection / DeckBuilder / Battle**; +`Boot` — служебная сцена. Очередь и онбординг — оверлеи Lobby. Текущий +единый Canvas — временный функциональный gray-box. Полное решение — +`docs/client-visual-direction.md`. + - [x] Unity 6 LTS, URP, Addressables, Input System, Localization. DOTween — следующим шагом (пока UI без внешних твинов). -- [x] Сцена `Boot` + runtime bootstrap; `Meta`/`Battle` появятся дальше. +- [ ] 3D-сцены `Login`, `Lobby`, `Collection`, `DeckBuilder`, `Battle` + и `SceneFlow`; `Boot` уже есть как служебный bootstrap. - [x] Composition root + DI (VContainer), без синглтон-свалок. - [x] `ApiClient` (HTTP/JSON), `PlayerState`, таймауты и разбор `ApiError`. - [x] `GameConnection` (WebSocket + MessagePack), snapshot/events, @@ -252,6 +259,8 @@ **Первый gray-box есть:** доска, рука, сила/крит, часы, все легальные интенты кнопками, сдача и результат. Арты и анимации — следующие. +Финальный визуал — отдельная 3D-сцена `Battle`, а не текущий Canvas +(`docs/client-visual-direction.md`). - [x] Поле: Vanguard, 5 кругов Арьергарда, рука, damage/soul/drop-счётчики (без артов и анимаций). diff --git a/README.md b/README.md index b291278..089d7d6 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ | CI (Forgejo Actions) | готово: `ci.yml` проходит на `home-runner` | | EF-миграции | готово (`InitialCreate`) | | Orleans | готово: silo + `MatchActorGrain`, включается `Orleans:Enabled` | -| Клиент | Unity 6.6: логин, онбординг, коллекция, колоды, очередь, gray-box бой | +| Клиент | Unity 6.6: 3D-сцены Login/Lobby/Collection/DeckBuilder/Battle; сейчас gray-box на одном Canvas | | Лаунчер | не начато | ## Требования diff --git a/client/README.md b/client/README.md index 838d9f0..8be57c0 100644 --- a/client/README.md +++ b/client/README.md @@ -32,6 +32,14 @@ http://localhost:5080 Аккаунт создаётся кнопкой «Создать аккаунт»; имя 3–32 символа, пароль 8–128. Пароль от реального аккаунта в dev-клиенте не использовать. +## Визуальное направление + +Клиент делаем в **3D** на URP. Основные экраны — отдельные сцены: +**Login**, **Lobby**, **Collection**, **DeckBuilder**, **Battle**. +`Boot` — служебная сцена с общими сервисами; очередь и онбординг — +оверлеи Lobby. Текущий единый Canvas — временный gray-box, его разносим +по сценам. Полное решение — `docs/client-visual-direction.md`. + ## Что уже есть - `ClientBootstrap` — запуск без привязки к сцене. @@ -53,12 +61,14 @@ http://localhost:5080 ## Что дальше -1. Довести боевой UI: арты карт, зоны, анимации, скип/ускорение. -2. Реконнект на всех шагах и аккуратная обработка таймаутов. -3. Полный декбилдер с фильтрами и счётчиками. -4. Магазин и открытие бустера. -5. История матчей и реплей. -6. Локализация RU/EN, настройки, DOTween-анимации. +1. Разнести gray-box по 3D-сценам **Login / Lobby / Collection / + DeckBuilder / Battle** и добавить `SceneFlow`. +2. Довести боевой UI: арты карт, зоны, анимации, скип/ускорение. +3. Реконнект на всех шагах и аккуратная обработка таймаутов. +4. Полный декбилдер с фильтрами и счётчиками. +5. Магазин и открытие бустера. +6. История матчей и реплей. +7. Локализация RU/EN, настройки, DOTween-анимации. ## Плагины @@ -79,9 +89,10 @@ MessagePack-сериализатор и юнион-кадры. это значение вернуть в «Not allowed». - Токены лежат в `PlayerPrefs` — только для разработки; для релиза нужно защищённое хранилище. -- UI собран кодом на uGUI; префабы/UI Toolkit подключим, когда появятся - макеты. DOTween пока не добавлен, чтобы не тянуть Asset Store-зависимость - в первый коммит. +- Текущий UI собран кодом на uGUI и одном Canvas — это временный gray-box. + Финальные экраны — отдельные 3D-сцены; UI-слой может быть uGUI или + UI Toolkit в зависимости от сцены. +- DOTween пока не добавлен; анимации UI — после перехода на сцены. - Мета-экраны — заглушки: сеть и авторизация настоящие, разделы следующие. - Бой — gray-box: карты показываются по `printingId`, без артов и анимаций; действия — кнопки всех `MatchView.LegalIntents`. diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index c357930..0a08a8f 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -508,6 +508,9 @@ CI подключён и проходит; серверный блок закр - проект создан из URP-шаблона Unity 6.6; пакеты: URP, Input System, Addressables, Localization, Newtonsoft.Json, VContainer (OpenUPM); +- визуальное направление зафиксировано: **3D**, отдельные сцены-экраны + Login/Lobby/Collection/DeckBuilder/Battle (`docs/client-visual-direction.md`); + текущий единый Canvas — временный gray-box; - сцена `Boot` + runtime-инициализатор, поэтому клиент стартует и в пустой сцене; - composition root на VContainer: `AppConfig`, `TokenStore`, `ApiClient`, @@ -539,22 +542,26 @@ CI подключён и проходит; серверный блок закр Дальше по клиенту: -1. Довести боевой UI: арты, зоны, анимации, скип/ускорение. -2. Реконнект на всех шагах и аккуратная обработка таймаутов. -3. Полный декбилдер с фильтрами и счётчиками. -4. Магазин и открытие бустера. -5. История матчей и реплей. -6. Локализация RU/EN на лету, настройки, DOTween-анимации. +1. Перейти к **3D-визуалу**: отдельные сцены **Login**, **Lobby**, + **Collection**, **DeckBuilder**, **Battle**; `Boot` — служебная сцена. +2. Довести боевой UI: арты, зоны, анимации, скип/ускорение. +3. Реконнект на всех шагах и аккуратная обработка таймаутов. +4. Полный декбилдер с фильтрами и счётчиками. +5. Магазин и открытие бустера. +6. История матчей и реплей. +7. Локализация RU/EN на лету, настройки, DOTween-анимации. -Старый план экранов остаётся в силе: +**Зафиксированное визуальное направление** — `docs/client-visual-direction.md`: +3D-клиент на URP, отдельные сцены-экраны Login / Lobby / Collection / +DeckBuilder / Battle; Boot и общие сервисы остаются персистентными. +Текущий единый Canvas — временный gray-box, его разносим по сценам. - Unity 6 LTS, URP, Addressables, Input System, Localization, DOTween. -- Сцены `Boot`, `Meta`, `Battle`. -- VContainer, `ApiClient`, `GameConnection`. -- Экраны: логин, меню, магазин, коллекция, декбилдер, очередь, настройки. +- VContainer, `ApiClient`, `GameConnection`, `SceneFlow`. +- Сцены: `Boot` (служебная), `Login`, `Lobby`, `Collection`, `DeckBuilder`, + `Battle`; очередь/онбординг — оверлеи Lobby. - История матчей и экран реплея: `GET /api/matches`, `GET /api/replays/{id}`, проигрывание `frames` + `events`. -- Боевая сцена: поле, рука, зоны, анимации, таймер. - Локализация RU/EN на лету. ### 7.4. Лаунчер @@ -576,10 +583,12 @@ CI подключён и проходит; серверный блок закр 1. Прочитать `docs/HANDOFF.md`, `IMPLEMENTATION_CHECKLIST.md`, `README.md`. 2. Прогнать проверки из раздела 3. -3. Следующий блок — **клиент** (Unity): `Boot`/`Meta`/`Battle`, `ApiClient`, - `GameConnection`, логин, коллекция, декбилдер, магазин, очередь, - история и реплей. Сервер и мета-API готовы: `docs/protocol.md`, - `docs/server-api.md`, `Vanguard.Shared`. +3. Следующий блок — **клиент** (Unity): 3D-сцены `Login`, `Lobby`, + `Collection`, `DeckBuilder`, `Battle`; `Boot` — служебная сцена. + `ApiClient`, `GameConnection`, логин, коллекция, декбилдер, магазин, + очередь, история и реплей. Визуальное решение — + `docs/client-visual-direction.md`. Сервер и мета-API готовы: + `docs/protocol.md`, `docs/server-api.md`, `Vanguard.Shared`. 4. CI и Orleans закрыты; следующий блок — клиент. Перед началом: проверить `docs/protocol.md`, `docs/server-api.md`, `Vanguard.Shared`. 5. После каждого блока: тесты, `validate`, `translations check`, коммит, push. diff --git a/docs/client-visual-direction.md b/docs/client-visual-direction.md new file mode 100644 index 0000000..f20eba7 --- /dev/null +++ b/docs/client-visual-direction.md @@ -0,0 +1,62 @@ +# Клиент: визуальное направление + +**Статус:** зафиксировано 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.