跳到正文
文档
本页内容

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返回带有LevelJson、MetaJson和Report的ExportedLevel

在编辑器中,导入被包装成生成器gen_level_afterbeat。它在作者眼中的样子:从Afterbeat导入

工作方式

  • 输入文本,输出文本。互通层不读取文件,也不接受路径。文档从哪里来是宿主的事
  • 宿主应当查找文件,而不是假定文件名。Afterbeat的关卡文件夹没有完善的文档:level.vgd、cover.jpg,歌曲为.ogg、.mp3或.wav
  • 不经过SerializationService。外来文档不加{"g", "v"}封套,也不使用本格式的任何转换器:两者都会破坏它。Afterbeat格式根本没有版本字段
  • 未知键会保留。每个Afterbeat模型都保留自己不认识的键([JsonExtensionData])。往返转换不会删除它们
  • ID是推导出来的,不是生成的。Afterbeat用任意字符串命名主题和预制件,ABIdMap把它们哈希成稳定的Guid。先导入一个.vgt,再导入引用它的.vgd,两次得到的ID相同
  • 每一处损失都会报告。InteropReport把所有丢失或近似处理的内容按原因分组。每个原因都有计数和第一次出现的位置

ABOptions保存转换无法自行决定的选择:Framerate(默认60)、ImportParallax、ImportPrefabs、LayerImport、OpacityHitThreshold等

转换中的变化

内容在Afterbeat中在Bullet Hero中
时间秒按关卡帧率计的帧
旋转角度制,每个关键帧相对于上一个弧度制,绝对值
相机缩放可见高度的一半,默认20Zoom,整个可见高度,因此翻倍
绘制顺序深度0-60,越小越靠前相对于父级的Layer,越大越靠前
伤害不透明度低于1的物体不造成伤害物体类型决定ColliderId,不透明度决定该碰撞体何时存在
视差一个背景子系统没有碰撞体的普通物体

主题在两个方向上都能精确转换。Afterbeat的34种颜色与ThemeData使用的槽位布局相同,只是没有Alpha

游戏自带的21个主题会作为普通主题写入关卡

限制

不导入的内容:

  • 触发器
  • 屏幕渐变事件轨道
  • 景深
  • 按轴继承父级和父级时间偏移
  • 预制件预览图和提前时间

玩家推力和色相轨道会被报告为暂缓。它们等的是开发工作,而不是决策

不导出的内容:

  • 音频:Afterbeat关卡只有一个歌曲文件,没有轨道列表、偏移和音频效果
  • 关卡自定义的几何形状
  • 锚点
  • 逐角颜色
  • 逐字符文本效果
  • 随机值
  • 第一个之后的节拍段
  • World以外的检查点空间
  • 部分后期效果
  • 逐个放置的预制件覆盖
  • 许可、年龄分级和署名:.vgm没有对应的字段

这对作者意味着什么:从Afterbeat导入

完整的映射见Interop/AfterBeat/README.md