烏蒙滴叉自製譜上機教程
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搜搜得了,先自己摸索着用,回頭更新。


