139 lines
7.9 KiB
Markdown
139 lines
7.9 KiB
Markdown
# Vanguard ReMaster — Unity client
|
||
|
||
Клиент на **Unity 6000.6.6f1** (Unity 6), URP. Пока это каркас:
|
||
авторизация, восстановление сессии и главный экран профиля.
|
||
|
||
## Как открыть
|
||
|
||
1. Unity Hub → **Add project from disk** → папка `client`.
|
||
2. Открыть проект редактором **6000.6.6f1**.
|
||
3. Первый импорт скачает пакеты (URP, Input System, Addressables,
|
||
Localization, Newtonsoft.Json, VContainer с OpenUPM).
|
||
4. Открыть `Assets/Scenes/Boot.unity` и нажать Play.
|
||
|
||
Если Unity предложит включить новый Input System — согласиться (в проекте
|
||
уже `activeInputHandler: 1`).
|
||
|
||
## Сервер
|
||
|
||
В форме входа по умолчанию стоит стенд:
|
||
|
||
```
|
||
http://192.168.31.158:18080
|
||
```
|
||
|
||
Адрес можно изменить прямо в поле и сохранить: он пишется в `PlayerPrefs`.
|
||
Локальный сервер:
|
||
|
||
```
|
||
http://localhost:5080
|
||
```
|
||
|
||
Аккаунт создаётся кнопкой «Создать аккаунт»; имя 3–32 символа, пароль
|
||
8–128. Пароль от реального аккаунта в dev-клиенте не использовать.
|
||
|
||
## Визуальное направление
|
||
|
||
Клиент делаем в **3D** на URP. Основные экраны — отдельные сцены:
|
||
**Login**, **Lobby**, **DeckBuilder**, **Battle**.
|
||
`DeckBuilder` совмещает коллекцию и редактор колоды. `Boot` — служебная
|
||
сцена с общими сервисами; очередь и онбординг — оверлеи Lobby. Текущий единый Canvas — временный gray-box, его разносим
|
||
по сценам. Полное решение — `docs/client-visual-direction.md`.
|
||
|
||
## Что уже есть
|
||
|
||
- `ClientBootstrap` — запуск без привязки к сцене.
|
||
- DI на VContainer: `AppConfig`, `TokenStore`, `ApiClient`, `AuthService`,
|
||
`MetaService`, `PlayerState`, `SceneFlow`.
|
||
- HTTP-клиент на `UnityWebRequest` + Newtonsoft.Json, разбор `ApiError`.
|
||
- Логин, регистрация, refresh, `/me`, выход.
|
||
- Восстановление сессии по refresh-токену при старте.
|
||
- Онбординг: две триал-деки из `/api/store`, выбор одной, 50 карт и 5 токенов.
|
||
- Коллекция и колоды: карточная сетка, сортировка клан→ранг→имя,
|
||
фильтры, статистика по рангам, добавление/удаление карт кликом.
|
||
- ПКМ по карте — оверлей с картой, способностями, разбором в пыль и
|
||
крафтом за пыль.
|
||
- Магазин в Lobby: бустер за Gold/токен, показ 5 карт, покупка второй
|
||
триал-деки.
|
||
- История матчей: список результатов, награды, MMR; просмотр реплея по
|
||
кадрам и событиям.
|
||
- Очередь: classic-ranked, опрос статуса, отмена, тикет и переход в бой.
|
||
- Тренировка с ботом: casual-матч против серверного случайного бота,
|
||
без истории/MMR/наград.
|
||
- `GameConnection`: WebSocket + MessagePack, handshake, snapshot/events,
|
||
интенты, ответы на ping, закрытие и переподключение.
|
||
- Боевой экран: доска, рука, часы, кнопки всех легальных интентов,
|
||
сдача с подтверждением и экран результата.
|
||
- Боевой UX: клик по картам/зонам, подсветка целей, сгруппированные
|
||
действия, выбор силы/эффекта триггера, журнал событий и подсказки;
|
||
event-анимации с очередью и скипом.
|
||
- Карты в бою и коллекции: реальные арты, рамка по клану, имя, ранг,
|
||
триггер, сила/крит, REST и рубашка для скрытых карт; call/ride-въезд,
|
||
пульс атаки и призрак ухода в дроп.
|
||
- Реальные арты: `CardImageService` ищет `Resources/CardArt/{imageKey}`;
|
||
`imageKey` приходит из `/api/cards`. Скачаны все **124** арта;
|
||
импорт — `tools/import_card_art.py`.
|
||
- Локализация RU/EN: `Localization.cs` (`Loc` + `LocalizedText`),
|
||
переключатель в Login/Lobby, сохранение в `PlayerPrefs`; имена и тексты
|
||
карт берутся из `nameRu/nameEn` и `textRu/textEn`.
|
||
- Экран входа и главный экран с балансами, MMR и переходами в разделы.
|
||
|
||
## Что дальше
|
||
|
||
1. Drive/damage-анимации карт и стола, звук, ускорение/скип.
|
||
2. Реконнект на всех шагах и аккуратная обработка таймаутов.
|
||
3. Декбилдер: drag&drop, live-валидация, редкость/тип/арт, пресеты.
|
||
4. Настройки (язык уже есть), DOTween-анимации.
|
||
|
||
## Плагины
|
||
|
||
`Assets/Plugins/Vanguard.Shared` — сборка `Vanguard.Shared` из
|
||
`server/src/Vanguard.Shared` (netstandard2.1). В ней DTO протокола,
|
||
MessagePack-сериализатор и юнион-кадры.
|
||
|
||
`Assets/Plugins/MessagePack` — MessagePack 3.1.12 и его runtime-зависимости
|
||
(netstandard2.1), MIT.
|
||
|
||
При изменении протокола пересобрать `Vanguard.Shared` на серверной стороне
|
||
и заменить DLL в `Assets/Plugins/Vanguard.Shared`.
|
||
|
||
## Ограничения каркаса
|
||
|
||
- Для dev-стенда включён HTTP: Project Settings → Player → **Allow downloads
|
||
over HTTP = Always** (`insecureHttpOption: 2`). Для релиза нужен HTTPS и
|
||
это значение вернуть в «Not allowed».
|
||
- Токены лежат в `PlayerPrefs` — только для разработки; для релиза нужно
|
||
защищённое хранилище.
|
||
- Текущий UI собран кодом на uGUI; каждая сцена имеет свой Canvas.
|
||
Префабы/UI Toolkit подключим, когда появятся макеты.
|
||
- DOTween пока не добавлен; текущие анимации карт — собственные корутины/тики.
|
||
- Мета-экраны — заглушки: сеть и авторизация настоящие, разделы следующие.
|
||
- В бою нет звука и отдельных drive/damage-анимаций; остальное работает.
|
||
- `GameConnection` использует `System.Net.WebSockets.ClientWebSocket`
|
||
(Windows/десктоп first). Для WebGL понадобится другой транспорт или
|
||
нативный WebSocket-плагин.
|
||
|
||
## Проверки
|
||
|
||
EditMode:
|
||
|
||
```powershell
|
||
& 'C:\Program Files\Unity\Hub\Editor\6000.6.6f1\Editor\Unity.exe' `
|
||
-batchmode -nographics -projectPath client `
|
||
-runTests -testPlatform EditMode `
|
||
-testResults client\TestResults.xml
|
||
```
|
||
|
||
Smoke сцен (входит в Play Mode, открывает Boot → Login, проверяет 3D-фон
|
||
и экран):
|
||
|
||
```powershell
|
||
& 'C:\Program Files\Unity\Hub\Editor\6000.6.6f1\Editor\Unity.exe' `
|
||
-batchmode -nographics -projectPath client `
|
||
-executeMethod Vanguard.Editor.SceneSmoke.Run
|
||
```
|
||
|
||
Тесты не ходят в сеть: проверяются composition root, создание Canvas,
|
||
экранов, импорт арта и локализация (статические строки, динамика,
|
||
live-переключение). Сейчас **3/3**.
|