Unity手游汉化笔记⑦:il2cpp脚本后端,修改代码中的字符串
總的筆記:https://www.cnblogs.com/guobaoxu/p/12055930.html
對于Mono腳本后端,代碼被編譯進DLL,如果沒有安全措施,利用dnSpy就可以很輕松的修改其中的字符串。
對于il2cpp腳本后端,代碼中的字符都在global-metadata.dat文件中。用il2cppdumper,通過libil2cpp.so和global-metadata.dat導出很多信息,其中stringliteral.json文件中就有代碼中的字符串,但是這個工具是用來dump信息的,不是用來修改的,所以我參考他的源碼,做了一個簡單的工具來對代碼進行修改,下面是操作過程。
一、Demo制作
Demo很簡單,頁面上添加一個UI/Text,綁定一個腳本,然后導出apk之前,記得先在PlayerSettings里面設置好使用il2cpp腳本后端。
腳本代碼如下:
1 public class MyScript : MonoBehaviour {
2 void Start () {
3 var text = gameObject.GetComponent<Text>();
4 text.text = "Test String";
5 }
6 }
運行效果(沒有截全屏)如下:
二、修改
Demo是Unity直接導出的,沒有安全措施,直接用WinRAR打開,在assetsinDataManagedMetadata下找到global-metadata.dat文件,用我自己做的一個小工具(https://github.com/JeremieCHN/MetaDataStringEditor)打開他,效果如下:
上面的輸入框是搜索用的,搜索要改的字符串,回車或者點擊下一個找到它,然后右鍵該字符串,編輯(可以中文,但要考慮字體支不支持),保存,效果如下
我沒有做成寫回源文件的方式,要另存為,手動覆蓋一下,然后裝回去。最終效果(沒有截全屏)如下:
三、基本原理
global-metadata.dat里面的信息很多,在il2cppdumper里面可以看到,字符串的區域有兩個,代碼中的字符串在其中一個,這個區域的特點是這樣,首先在文件頭部有一個列表,里面放了每一個字符串的長度和在數據區的偏移量,同時在數據區,字符串是緊湊放置的,也就是說字符串和字符串之間沒有分割符號,用010Editor打開文件的話,可以找到字符串的區域,
而另一個區域則是每一個字符串的結尾都會有一個,兩個區域的功能應該是不同的,我的猜測是,我改的這個區域是代碼中的字符串,而另一個區域則是類名、方法名等。
具體修改過程也比較簡單,對于頭部的列表,因為修改前后字符串的數量是不變的,所以這個列表所占據的空間也是不變的,數據區的話大概率是會變的,我的做法是,在修改之后先計算數據區的長度,如果可以放入原來數據區所在的空間,就直接放,否則在文件尾另外開辟一塊空間來放,這樣我就不需要去重排后面的其他數據了。關于字符串的編碼,還是Unity常用的UTF-8編碼。
總結
以上是生活随笔為你收集整理的Unity手游汉化笔记⑦:il2cpp脚本后端,修改代码中的字符串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gMap使用简单介绍
- 下一篇: 计算机组成 计算机五大部件 I/O