總的筆記:https://www.cnblogs.com/guobaoxu/p/12055930.html
目錄
Unity版本:2018.4.5f1
工具:UABE(地址:https://7daystodie.com/forums/showthread.php?22675-Unity-Assets-Bundle-Extractor)
一、分析
在Unity中,可以看到一個TTF文件在導入后,可以展開成下面這樣

也就是一個大哥帶兩個小弟,合理猜測在這個“大哥”的二進制塊中會包含指向兩個“小弟”的指針
二、思路
首先實驗只替換“大哥”,同時要保持兩個指向小弟的指針不變,如果可以正常顯示就結束,如果不行就把兩個“小弟”在一起替換
三、具體實踐
【1】Demo
用Unity導出兩個Demo,內容上都只有一個Text,但用了不同的字體,目標是把仿宋Demo的字體改成楷體
【2】用UABE導出
在UABE里可以直接看到字體名字的FONT類型資源,先試着DUMP出文本,仿宋的文本DUMP出來之后非常大,足足有300M,用VS Code打開(用記事本肯定打不開的),可以看到內容如下

顯然兩個指針是要保留的,但是其他數據不用動,如果繼續用文本,感覺實在太慢了,所以轉而用RAW。於是分別DUMP出仿宋Demo和楷體Demo的字體,得到兩個dat格式的文件。
【3】對二進制文件的處理
對楷體的dat文件進行處理,替換那兩個指針,換成和仿宋的dat一樣
根據DUMP文本,首先是字體名字,一個變長的String,然后一個32位數,隨后是第一個指針,然后再一個32位數,第二個指針,只需要把楷體的這兩個指針改掉即可

【4】寫回楷體Demo
用UABE打開仿宋Demo的資源文件,Import Raw,選擇修改后的楷體dat文件,寫回,重新打包
【5】結果

仿宋Demo的字體被成功替換成楷體
四、總結
完整的操作過程是:
① 分別得到新字體.dat,舊字體.dat
② 把新字體.dat的兩個指針改成和舊字體.dat一致
③ 把新字體.dat寫入舊字體的資源文件里去,代替舊字體
麻煩的點:新字體需要專門去建一個Unity工程並編譯來得到二進制描述,而且版本要相近,本文demo中的指針是一個32位數表示文件、一個64位數表示對象,但是我記得某個版本有變化,所以最好版本相近甚至相同。
