总的笔记: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位数表示对象,但是我记得某个版本有变化,所以最好版本相近甚至相同。