烏蒙滴叉自製譜上機教程

 


 

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搜搜得了,先自己摸索着用,回頭更新