К содержимому
Связь с Afterbeat
На этой странице

Связь с Afterbeat

Конвертация уровней, тем и префабов Afterbeat в формат Bullet Hero и обратно и то, что теряется по дороге

Afterbeat (бывший Project Arrhythmia, от Vitamin Games) хранит уровень в четырёх JSON-документах. SDK конвертирует все четыре в обе стороны через один класс - ABInterop

ДокументРасширениеИмпортЭкспорт
уровень.vgdImportLevel(levelJson, metaJson, options)ExportLevel(level, meta, options)
метаданные.vgmвместе с уровнемвместе с уровнем
тема.vgtImportTheme(themeJson, report)ExportTheme(theme, report)
префаб.vgpImportPrefab(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
времясекундыкадры с частотой уровня
поворотградусы, каждый ключ относительно предыдущегорадианы, абсолютно
зум камерыполовина видимой высоты, по умолчанию 20Zoom, вся видимая высота, то есть вдвое больше
порядок отрисовкиглубина 0-60, меньше - ближеLayer относительно родителя, больше - ближе
уронобъект с непрозрачностью ниже 1 не раниттип объекта задаёт ColliderId, а непрозрачность - когда этот коллайдер существует
параллаксотдельная фоновая подсистемаобычные объекты без коллайдера

Темы переходят точно в обе стороны. 34 цвета Afterbeat - та же раскладка слотов, что у ThemeData, без альфы

21 тема, которую поставляет игра, материализуется в уровне как обычные темы

Ограничения

Не импортируются:

  • триггеры
  • дорожка событий градиента экрана
  • глубина резкости
  • наследование от родителя по отдельным осям и смещения времени родителя
  • превью и время упреждения префабов

Сила игрока и дорожка оттенка помечаются в отчёте как отложенные. Они ждут работы, а не решения

Не экспортируются:

  • аудио: уровень Afterbeat - это один файл песни, без списка дорожек, смещений и эффектов
  • геометрия, созданная в уровне
  • якоря
  • цвета по углам
  • эффекты текста по символам
  • случайные значения
  • бит-сегменты после первого
  • пространства чекпоинтов, кроме World
  • несколько эффектов постобработки
  • переопределения отдельных экземпляров префабов
  • лицензии, возрастной рейтинг и атрибуция: в .vgm для них нет полей

Что это значит для автора - Импорт из Afterbeat

Полное соответствие - Interop/AfterBeat/README.md