乌蒙滴叉自制谱上机教程

 


 

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插件进行音视频资源的编解码

通常来说,游戏使用的CRIWARE打包后的AWB与ACB文件是加密的,原始文件后还需要Key做加密Encoding处理,但是Mai很幸运的不需要这么做,直接压成AWB/ACB即可

 对于游戏用使用的影片文件来说就没这么好办了,除了压缩这个步骤,它还用到了一个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图像,用各种常见图像处理就可以做到,然后随便各找一个正常的其他喷谱子的jacketjacket_s文件,用UABE打开并解压它,然后修改

 

 

 

 

 

 见上图,我们修改的Unity资源类型是Texture2D,不是Sprite也不是别的玩意,点击资源只选中之后再点击Plugin然后点Edit再OK,然后进入如下界面进行修改 ↓

 

 

 

 

然后然后点击Edit Texture2D窗口的OK按钮完成编辑并关闭当前窗口,然后点击软件Asset Info窗口的菜单栏当中的File->Save进行保存,保存完毕后继续点OK关闭当前窗口

然后你就可以点File->Save进行保存了,保存的名字得是UI_Jacket_xxxxxx.abUI_Jacket_xxxxxx_s.ab,然后扔ABI文件夹里就完事了。

至此,你完成了曲绘的打包工作,现在你的谱子可以正常显示进游戏并且可以看见曲绘。

但是没有音频和BGA数据,对于maimai来说这是灾难性的,MAI的游玩进程是基于音频的BPM进行计算的,下面我们进行音频数据的添加 ↓

 

 


 

 

懒得写了,反正用下面这个东西,自己Google搜搜得了,先自己摸索着用,回头更新