Персонаж: модель киберниндзя со скелетом вместо капсул
- player/character/character.glb: 752 треугольника, 17 костей, 14 анимаций (idle, walk, run, crouch, slide, jump, fall, air_jump, dash, wallrun L/R, mantle, death); ноги на IK, исходник и скрипт сборки в Blender models - Ghost: выбор анимации по флагам и скорости, подгонка speed_scale, голова повторяет взгляд, свечение красится в цвет игрока от его id - Net: флаги FLAG_WALL_RIGHT и FLAG_AIR (RPC не менялись, сервер перевыкладывать не нужно) - Игрок: капсула в player.tscn заменена моделью, спрятанной от своей камеры - Модель в ghost.gd грузится через load, чтобы не ломать сервер без неё Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WxZo3ekR5m1af437Qzqwc1
This commit is contained in:
@@ -28,7 +28,7 @@
|
||||
| ❌ | Серверных проверок (антиспуфинг позиций, античит): сервер только пересылает |
|
||||
| ❌ | Сохранения прогресса, аккаунтов |
|
||||
| ❌ | Автоматических тестов в CI (есть боты для ручного прогона, см. «Тесты без окна») |
|
||||
| ❌ | Анимаций персонажа: чужой игрок — просто капсула (`net/ghost.gd`) |
|
||||
| ✅ | Чужой игрок — модель киберниндзя со скелетом (`player/character/character.glb`, 752 треугольника, 17 костей, 14 анимаций); свечение красится в цвет игрока от его id. Своё тело — та же модель, спрятанная от своей камеры |
|
||||
|
||||
## Быстрый старт
|
||||
|
||||
@@ -68,7 +68,8 @@ godot --path . # можно запустить несколько ок
|
||||
project.godot, export_presets.cfg, icon.svg
|
||||
net/ сеть. Net — автолоад: и клиент, и сервер (один скрипт)
|
||||
net.gd состояние комнат, преследователей, RPC (см. «Сеть»)
|
||||
ghost.gd чужой игрок: капсула с цветом от id и ником
|
||||
ghost.gd чужой игрок: модель, выбор анимации по флагам и скорости, цвет свечения от id, ник
|
||||
player/character/ character.glb — модель и анимации (исходник и скрипт сборки: `../Blender models/character_01/`)
|
||||
server.tscn пустая сцена для запуска выделенного сервера
|
||||
core/
|
||||
map_loader.gd автолоад MapLoader: скачивает пакет карты и подключает его (см. «Загрузка карт»)
|
||||
@@ -161,7 +162,7 @@ tools/ export_all.sh, serve_web.py, deploy_server.sh, test/ (
|
||||
| `submit_life(dead, pos)` / `recv_life(id, dead, pos)` | клиент → сервер → остальные | смерть/возрождение, `reliable` |
|
||||
| `recv_left(id)` | сервер → комната | игрок вышел |
|
||||
|
||||
Флаги состояния (`Net.FLAG_*`): подкат, бег по стене, рывок, подтягивание. Присед передаётся как подкат (у призрака сплюснутая капсула).
|
||||
Флаги состояния (`Net.FLAG_*`): подкат, бег по стене (+ сторона стены), рывок, подтягивание, «в воздухе». Присед передаётся как подкат; призрак отличает их по скорости. Скорость и двойной прыжок призрак считает сам по смещению позиции — в протокол они не входят.
|
||||
|
||||
**RPC требуют одинаковые путь узла и скрипт на сервере и клиенте**, поэтому `net.gd` один. Любое изменение RPC — **клиент и сервер выкладываются вместе**
|
||||
(старый клиент с новым сервером не работает). Имена вроде `rock_owner`/`recv_rock_owner` остались от времени, когда преследователь был один.
|
||||
@@ -291,11 +292,24 @@ ssh root@192.168.10.110 'journalctl -u my-world -f' # лог: «+ игрок
|
||||
|
||||
### Другое
|
||||
|
||||
- Ники по выбору игрока, текстовый чат, анимации персонажа вместо капсулы, настройки (чувствительность, громкость), меню паузы.
|
||||
- Ники по выбору игрока, текстовый чат, анимация приземления, свои руки/тело от первого лица, настройки (чувствительность, громкость), меню паузы.
|
||||
- Серверные проверки (антиспуфинг позиций), если игроков станет много.
|
||||
- Новые карты (добавляются по инструкции выше) и новые преследователи.
|
||||
- Автоматизировать прогон ботов в CI и проверку «пакет не пустой» после экспорта.
|
||||
|
||||
## Персонаж
|
||||
|
||||
Модель и анимации **генерирует скрипт** `Blender models/character_01/build_character.py` (Blender 5.x: `exec` в окне или `blender -b -P`).
|
||||
Он строит меш из гранёных сегментов (жёсткие веса: одна кость на сегмент), арматуру из 17 костей, считает позы и пишет 14 анимаций
|
||||
(`idle walk run crouch_idle crouch_walk slide jump fall air_jump dash wallrun_R wallrun_L mantle death`), ноги ставятся через IK.
|
||||
Экспорт: GLB, `export_animation_mode=NLA_TRACKS`, в `player/character/character.glb`. Материалы: `Suit` (тёмный) и `Glow` (свечение; в игре заменяется цветом игрока).
|
||||
|
||||
- **Выбор анимации** — `Ghost._choose()`: смерть > подтягивание > рывок > бег по стене > воздух > присед/подкат > бег/ходьба/стоит.
|
||||
Скорость шага подгоняется `speed_scale` (`REF_SPEED`), между анимациями смешивание 0,15 с. Голова повторяет взгляд вверх-вниз.
|
||||
- **Своё тело:** та же модель стоит в `player/player.tscn` (видна в редакторе, отбрасывает тень), но спрятана от своей камеры слоем 2 (`player.gd → _ready`). Не анимируется.
|
||||
- **Выкладка сервера:** `ghost.gd` лежит и на сервере, где модели нет, поэтому модель грузится `load()` внутри `setup()`, а не `preload`.
|
||||
- Изменить позы: правь функции анимаций в скрипте, перезапусти его в Blender, заново экспортируй GLB и импортируй в Godot.
|
||||
|
||||
## Лицензии и авторство
|
||||
|
||||
- Модель карты Backrooms — «Backrooms VR», автор VTX (https://sketchfab.com/VTX_car), **CC-BY 4.0** (`maps/backrooms/model/CREDITS.md`).
|
||||
|
||||
Reference in New Issue
Block a user