Record 3D scene-based client visual direction
CI / test (push) Successful in 1m22s
Details
CI / test (push) Successful in 1m22s
Details
This commit is contained in:
parent
887aa9d1a5
commit
f618b69ae4
|
|
@ -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-счётчики
|
||||
(без артов и анимаций).
|
||||
|
|
|
|||
|
|
@ -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 |
|
||||
| Лаунчер | не начато |
|
||||
|
||||
## Требования
|
||||
|
|
|
|||
|
|
@ -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`.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
Loading…
Reference in New Issue