Unity手游汉化笔记②:使用UABE替换TTF字体

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

原文地址:https://www.cnblogs.com/guobaoxu/p/12060027.html