Связь с Afterbeat
Конвертация уровней, тем и префабов Afterbeat в формат Bullet Hero и обратно и то, что теряется по дороге
Afterbeat (бывший Project Arrhythmia, от Vitamin Games) хранит уровень в четырёх JSON-документах. SDK конвертирует все четыре в обе стороны через один класс - ABInterop
| Документ | Расширение | Импорт | Экспорт |
|---|---|---|---|
| уровень | .vgd | ImportLevel(levelJson, metaJson, options) | ExportLevel(level, meta, options) |
| метаданные | .vgm | вместе с уровнем | вместе с уровнем |
| тема | .vgt | ImportTheme(themeJson, report) | ExportTheme(theme, report) |
| префаб | .vgp | ImportPrefab(prefabJson, options, ...) | ExportPrefab(prefab, options, ...) |
ExportLevel возвращает ExportedLevel с LevelJson, MetaJson и Report
В редакторе импорт обёрнут в генератор gen_level_afterbeat. Как он выглядит для автора - Импорт из Afterbeat
Как это работает
- Текст на входе, текст на выходе. Слой связи не читает файлов и не принимает путей. Откуда взялся документ, решает хост
- Хосту стоит искать файлы, а не полагаться на их имена. Папка уровня Afterbeat описана плохо:
level.vgd,cover.jpg, песня в.ogg,.mp3или.wav - Не через
SerializationService. Чужой документ не получает конверт{"g", "v"}и конвертеры этого формата: и то и другое его бы испортило. У формата Afterbeat нет поля версии вообще - Неизвестные ключи сохраняются. Каждая модель Afterbeat хранит ключи, которых не знает (
[JsonExtensionData]). Прогон туда и обратно их не удаляет - Идентификаторы выводятся, а не генерируются. Afterbeat называет темы и префабы произвольными строками, и
ABIdMapхеширует их в стабильные Guid. Импорт.vgt, а затем.vgd, который на неё ссылается, оба раза даёт один и тот же id - Каждая потеря попадает в отчёт.
InteropReportгруппирует всё потерянное или приближённое по причине. У каждой причины есть число случаев и первое место, где это произошло
ABOptions содержит решения, которые конвертация не может принять сама: Framerate (по умолчанию 60), ImportParallax, ImportPrefabs, LayerImport, OpacityHitThreshold и другие
Что меняется по дороге
| Что | В Afterbeat | В Bullet Hero |
|---|---|---|
| время | секунды | кадры с частотой уровня |
| поворот | градусы, каждый ключ относительно предыдущего | радианы, абсолютно |
| зум камеры | половина видимой высоты, по умолчанию 20 | Zoom, вся видимая высота, то есть вдвое больше |
| порядок отрисовки | глубина 0-60, меньше - ближе | Layer относительно родителя, больше - ближе |
| урон | объект с непрозрачностью ниже 1 не ранит | тип объекта задаёт ColliderId, а непрозрачность - когда этот коллайдер существует |
| параллакс | отдельная фоновая подсистема | обычные объекты без коллайдера |
Темы переходят точно в обе стороны. 34 цвета Afterbeat - та же раскладка слотов, что у ThemeData, без альфы
21 тема, которую поставляет игра, материализуется в уровне как обычные темы
Ограничения
Не импортируются:
- триггеры
- дорожка событий градиента экрана
- глубина резкости
- наследование от родителя по отдельным осям и смещения времени родителя
- превью и время упреждения префабов
Сила игрока и дорожка оттенка помечаются в отчёте как отложенные. Они ждут работы, а не решения
Не экспортируются:
- аудио: уровень Afterbeat - это один файл песни, без списка дорожек, смещений и эффектов
- геометрия, созданная в уровне
- якоря
- цвета по углам
- эффекты текста по символам
- случайные значения
- бит-сегменты после первого
- пространства чекпоинтов, кроме World
- несколько эффектов постобработки
- переопределения отдельных экземпляров префабов
- лицензии, возрастной рейтинг и атрибуция: в
.vgmдля них нет полей
Что это значит для автора - Импорт из Afterbeat
Полное соответствие - Interop/AfterBeat/README.md