乌蒙滴叉自制谱上机教程
RT,本文将分享博主对Unity游戏第三方修改技术的一些探索,仅限于学习研究,若本文冒犯了您的权益请及时通知我。
本自制谱上机教程将会以乌蒙地插(UNiVERSE Plus SDEZ1.27-H)这款游戏进行举例,作者无意冒犯WAHLAP与SEGA等公司,纯学习用,无任何商业行为。
同时特别感谢C.Y (就是做MaiWindowTool那位)
私 聊 索 要 H D D ,不 予 回 复
首先本文是讲自制谱上机,就是把自己的谱子扔到游戏上去,对于其他内容概不涉及,那对于自制谱上机,你肯定得准备如下几个东西 ↓
MP3格式的曲子音频数据、MA2格式的谱面音符数据、PNG格式的曲绘、背景BGA图片或视频(啥格式都行,因为要转换)
关于MA2格式的音符数据哪来的,请在GitHub自行搜索convert ma2 simai等关键词,这里不进行赘述,总之就是用软件把MajData之类的模拟器用的Simai格式转换成MA2格式就行
我们都知道Maimai是一个基于Unity引擎开发的游戏,说白了就是C#写的
乌蒙滴叉这款游戏的结构与其他Unity游戏别无二致,都是AssetStreaming下一堆乱七八糟的资源文件
然后它的文件基本是Unity的统一压缩资源格式——AssetBundle(AB包),另外也有一些简单的XML文件。
在Maimai里,像活动事件(xx区域包含xx曲子,xx头像框获得条件),乐曲谱面信息(曲师,BPM,谱师)这些信息都是存储在XML文件当中,而对于游戏资源例如图像资源、Unity Animator资源、Shader资源等都存储AB包当中。
XML文件没什么好说的,纯Text形式,对于任意编辑器都可打开修改,打开与保存时注意编码支持日文,因为可能包含中日韩统一表意文字
而对于音频来说,它使用CRIWARE的ADX2 Unity插件进行音视频资源的编解码
对于游戏用使用的影片文件来说就没这么好办了,除了压缩这个步骤,它还用到了一个key进行加密Encoding,否则单纯打包成dat的criware影片文件读取会失败
我们注意到,游戏魔改圈有一个叫Audio Cue Editor的编辑器就是干这事的,专门针对CRIWARE打包的AWB/ACB文件。对于影片文件,使用WANCRI打包即可。资源下载自行寻找
对于AB包,使用UABE(UnityAssetBundleExtractor)进行编辑替换即可,同时可使用AssetStudio进行AB包文件导出和预览,在上机之前检查修改编译后的AB文件是否出错
这是要为了让自制谱上机所列出的需修改的一些文件的所在目录 ↓
├─StreamingAssets
│ ├─A000
│ │ ├─AssetBundleImages│ │ │ ├─jacket│ │ │ ├─jacket_s│ │ ├─Music
│ │ ├─MusicGenre
│ │ ├─CollectionGenre
│ │ ├─SoundData
│ │ ├─MovieData
了解了以上知识后,我们要知道Mai的谱面相关的一堆文件格式是怎样的。
首先,Mai的谱面文件与谱面信息XML位于.\StreamingAssets\A000\Music\下,每个曲子都有唯一的ID用于标识,文件夹目录如下 ↓
└─Music
│ GenreSort.xml (乐曲种类分类)
│ MusicGenreSort.xml (Tab种类注册表)
│ MusicRanking.xml (可排位的乐曲)
│ MusicSort.xml (乐曲注册表)
│
├─music011333
│ 011333_00.ma2 (谱面代码文件)
│ 011333_01.ma2
│ 011333_02.ma2
│ 011333_03.ma2
│ 011333_04.ma2
│ Music.xml (谱面信息)
│
├─music011353
└─music011364
我们可以看到,Music目录下有一个文件叫MusicSort.xml
这个文件存储了Mai所有谱面的ID与名称(不算Option的差分更新内容)
如果我们想添加一个全新的谱子,那么就需要在这个XML文件的末尾写上自己的谱子名称与ID(起一个大些的数字就好,防止ID重复)
Mai关于谱面资源加载的业务逻辑是首先读取MusicSort.xml,然后把信息都读到内存的MusicRegister这个C#的HashMap(Directory)中备用,然后再试图读取Music同级目录下的其他文件夹。Mai只会读取MusicSort.xml里存在的<id></id>字符串的乐曲所对应的文件夹名字,所以说MusicSort.xml和谱面文件夹是一一对应的。
通过向MusicSort.xml添加新的曲子,我们完成了一次曲子的注册,接下来我们就需要完善我们的自制谱
你也可以通过修改MusicGenre下的XML来添加一个全新的谱面分类,关于如何添加新谱面分类和对应Logo的AB打包回头再更新,现在只讲如何把自制谱进行上机
然后紧接着我们就是要起一个包含新曲子ID的文件夹放在Music目录下,跟其他谱面一样的文件夹名字,照猫画虎就行。
ID不足以占位6个字符的就在前面加上前导0占位,比如你的谱子ID叫233,你的文件夹名字就叫music000233如此如此...
然后我们复制一个其他谱子的Music.xml进来,进行一个修改变成我们的谱子 ↓
然后到此为止,我们的谱面基本信息与谱子注册已经完成了,下面就是完成谱子的曲绘和音视频的工作。
我们先看谱子的曲绘如何添加 ↓
注意看,这个文件叫AssetBundleImages,它位于.\StreamingAssets\A000\AssetBundleImages目录下,以下简称(ABI)
用UABE解压并Export Dump成JSON文件我们不难发现,它的主要内容如下
在它的目录树当中的一部分,用于存储AB包的位置索引,其结构无非是用键值对(Key-Value Pair)的方式存储。
"0 int first"代表这个资源的PathID(唯一),而"1 string second"代表这个资源位于ABI的相对路径。
而目录树的另一部分则是AB包的分块Hash校验,这方面我们无需考虑进行修改,能跑就行.jpg。我们只需要关注这个AB包的索引
所以说,我们想要把自己的曲绘添加进游戏,不光要打包一个ab格式的曲绘图片,还需要在ABI这个文件里写上我们ab包的相对目录和一个ID
这个东西就要用到UABE的Export Dump功能和Import Dump功能了(见下图,有UABE的窗口展示),首先你打开ABI文件后点击INFO进入Assets Info窗口,找(Size)最大的那个文件点Export Dump
导出一个JSON格式的文件,然后自己慢慢翻,在最后一个键值对资源的后面另起一行写上你的资源ID(要按着序号写)和名字,你的名字跟其他Jacket资源名字大同小异,唯一变的就是后面那串6位数字,跟你music文件夹里的谱面文件夹的名字里的数字一样。 (如果你不懂JSON语法,麻烦请自学一下,改炸了可就不好说了)。
然后至此,我们完成了图像资源的目录索引的注册,接下来我们要把自己的曲绘打包成AB包并扔进ABI文件夹了,不然光注册了但没图你上机了看个啥.jpg ↓
我们注意到,一个曲子的曲绘共有jacket_s,和jacket这两个ab包组成,一个(jacket)用于Tab显示,另一个(jacket_s)用于游玩时副显示屏的曲子信息展示和谱面结算界面的小图显示
我们需要把谱面图片(曲绘)变成一个400*400的无附加数据PNG图像,用各种常见图像处理就可以做到,然后随便各找一个正常的其他喷谱子的jacket和jacket_s文件,用UABE打开并解压它,然后修改
见上图,我们修改的Unity资源类型是Texture2D,不是Sprite也不是别的玩意,点击资源只选中之后再点击Plugin然后点Edit再OK,然后进入如下界面进行修改 ↓
然后然后点击Edit Texture2D窗口的OK按钮完成编辑并关闭当前窗口,然后点击软件Asset Info窗口的菜单栏当中的File->Save进行保存,保存完毕后继续点OK关闭当前窗口
然后你就可以点File->Save进行保存了,保存的名字得是UI_Jacket_xxxxxx.ab和UI_Jacket_xxxxxx_s.ab,然后扔ABI文件夹里就完事了。
至此,你完成了曲绘的打包工作,现在你的谱子可以正常显示进游戏并且可以看见曲绘。
但是没有音频和BGA数据,对于maimai来说这是灾难性的,MAI的游玩进程是基于音频的BPM进行计算的,下面我们进行音频数据的添加 ↓
懒得写了,反正用下面这个东西,自己Google搜搜得了,先自己摸索着用,回头更新。