Record 3D scene-based client visual direction
CI / test (push) Successful in 1m22s Details

This commit is contained in:
MpakobecEx 2026-10-21 17:35:35 +05:00
parent 887aa9d1a5
commit f618b69ae4
5 changed files with 117 additions and 26 deletions

View File

@ -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-счётчики
(без артов и анимаций).

View File

@ -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 |
| Лаунчер | не начато |
## Требования

View File

@ -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`.

View File

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

View File

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