[教學] Quest 一體機 UE4 簡中遊戲繁體化
這幾個月嘗試學習 UE4 引擎製作的 Meta Quest 一體機遊戲繁體中文化,並將學習成果
撰寫成教學文,本來預計根據困難程度由淺至深整理三篇:
(已發表)Lv1. 已經有簡體漢化補丁,轉換成繁體中文化更新檔
https://forum.gamer.com.tw/C.php?bsn=60606&snA=4213
(已發表)Lv2. 已經有簡體漢化破解安裝版,提取文本簡轉繁製作繁體中文化更新檔
https://forum.gamer.com.tw/C.php?bsn=60606&snA=4237
(未發表)Lv3. 只有原版無中文,提取文本翻譯完製作繁體中文化更新檔
不過最近熊熊想到,介於 Lv2 和 Lv3 之間應該還有一個難度,姑且稱之為 Lv2.5, 也就
是:
「Lv2.5 正版即支援簡體中文,提取文本翻譯完製作繁體中文化更新檔」
理由是:因為非官方的簡體中文版,拆包 obb 文件後,裡面通常已經存在 “遊戲名_p.p
ak” 的文本 + 字型檔,只需要針對文本簡轉繁並以繁體字型替換就可以了。而官方如果
已經支援簡體中文,就需要在解包 “遊戲名.pak” 的過程中找到實際的文本和字型檔進
行簡轉繁,再逐步打包成 “遊戲名_p.pak” 和 更新檔 / 補丁 形式的 obb 文件,試誤
的機率和步驟會稍微多一點點。
本篇教學文就針對 Lv2.5 的步驟做說明。(一樣強烈建議先閱讀過 Lv1 & Lv2 再閱讀 Lv
2.5, 因為先前描述過的詳細步驟會以較簡單的方式帶過)
》前置作業
1. 安裝 Java Runtime Environment (JRE, Java 運作環境)
https://www.java.com/zh-TW/download/manual.jsp
(建議 32/64 位元版本都安裝比較保險)
2. 安裝 .NET 8.0 或更新版本 (因為 FModel 需要 C# 運作環境)
https://dotnet.microsoft.com/zh-tw/download/dotnet/8.0/runtime
3. 下載 FModel 拆包工具 (優點是可以先瀏覽 pak 的內容,再針對需要的部分解包)
https://github.com/4sval/FModel/wiki/Installing-FModel
4. 下載加密遊戲獲取 AES key 的工具 (有些 pak 被加密過,需要金鑰才能正常解包)
https://myppt.cc/jwMS2D
5. 下載安卓手機程式「超級備份」的 apk 並透過 SideQuest 側載於 Quest 內
https://apkpure.com/tw/super-backup-restore/com.idea.backup.smscontacts/amp
(如果 pak 被加密,解密前需要先從 apk 安裝檔內提取 libUE4.so 檔案)
6. 已安裝解壓縮軟體如 WinRAR
》操作步驟(在此以《Fracked 壓裂》為例,這款遊戲剛好是正版即支援簡體中文字幕)
一、解包 obb 檔和 pak 檔
1-1. 安裝完正版遊戲後,透過 SideQuest 把 Quest 內部儲存空間/Android/obb/com.nD
reams.FrackedAppsLab 資料夾內的 main.com.nDreams.FrackedAppsLab.obb 複製到電腦
中
1-2. 透過 WinRAR 開啟 main.com.nDreams.FrackedAppsLab.obb 並解壓縮,得到 \Blac
k\Content\Paks\Black-Android_ASTC.pak
1-3. 這邊若採用 Lv1. 教學的 2-2 解包 pak 可以成功,就能直接跳到「二、文本簡轉
繁和字型檔替換」,但這款遊戲剛好是有加密的 pak, 需要搭配 AES key 解密工具才能
解包 pak
1-4. 解壓縮前置作業 4. 的解密工具,裡面有兩個程式:AES_finder_0.9f (PC / PCVR
遊戲用) 和 AES_finder_mobile_0.9e (一體機 / 安卓 遊戲用)
使用方法很簡單:
PC / PCVR 遊戲直接把程式放到含有 xxxx-Shipping.exe 的資料夾(通常是 遊戲名\工
作室\Binaries\Win64\工作室-Win64-Shipping.exe),雙擊 AES_finder_0.9f.exe,幾
十秒就能取得。(同資料夾會出現 key.txt)
不過這次要處理的是一體機遊戲,因此必須先在 Quest 的不明來源執行超級備份,並使
用「備份應用程式」的功能備份《Fracked》,得到 apk 安裝檔並複製到電腦,然後用 W
inRAR 開啟 apk, 提取 lib 資料夾中的 libUE4.so,然後將 libUE4.so、Black-Android
_ASTC.pak 和 AES_finder_mobile.exe 放到同一個資料夾,雙擊exe,說明上寫著根據你
CPU 的性能,大概10 - 40 分鐘可以獲得 key.txt (我是五年前的筆電,大約 72 分鐘
得到金鑰)。
打開 key.txt 後,裡面的金鑰是 hex 格式不能直接使用,要先透過以下網站把 hex 轉
換成 base64:
https://base64.guru/converter/encode/hex
我在得到金鑰後嘗試用 UnrealPakSwitchv10 解包仍然失敗(註 1),因此以下的步驟使
用評價更好的 FModel 解包工具
1-5. 執行 FModel.exe, 第一次執行時會跳出小藍視窗,選「其他資訊」、「繼續執行」
,然後在 Directory Selector 視窗內的 Directory 選擇 Black-Android_ASTC.pak 所
在的資料夾,然後按 OK, 可能會出現重新啟動 FModel 的視窗,按確認即可。這時左側
的 Game Archive 就會出現 Black-Android_ASTC.pak, 但狀態是紅燈,表示缺少 AES ke
y 無法看內容。點選左上角 Directory -> AES, 然後複製步驟 1-4 得到的 key (0x 開
頭的 Base64 格式編碼), Ctrl + v 貼上,確認,就能看到狀態變綠燈,可正常讀取。
1-6. 雙擊亮綠燈的 Black-Android_ASTC.pak, 可以看到 Black 和 Engine 兩個資料夾
,選擇 /Black/Content/Localization/Game/zh 然後按右鍵 Export (目的是得到 Game.
locres 文本檔), 再選擇 Engine 然後按右鍵 Export (需要 Engine 資料夾才能成功打
包), Export 匯出來的檔案都在 FModel.exe 程式同資料夾的 \Output\Exports 裡面
https://youtu.be/LN1oUX9Ql-4
二、文本簡轉繁和字型檔替換
2-1. 從步驟 1-3 或 1-6 得到的 /Black/Content/Localization/Game/zh/Game.locres,
可透過 Lv2 教學的 2. 文本簡轉繁得到新的 Game.locres, 不過在匯出 csv 文本文字
時要注意資料筆數和 Powershell 視窗中顯示的 Strings 數量是否一致,譬如這款遊戲
是 1255 strings, 但用 Excel 檢視內容時,會發現多了 20 幾列,實際檢查會發現原來
有好幾個文本自動跳行,導致上一列的 Source 欄出現在下一列的 Key 欄,而下一列的
Source 和 Target 都是空的。解決方法很簡單,只要把下一列的 Key 值剪下並貼在上一
列 Source 欄的最後面即可,然後再將已經完全空白的下一列刪除,最後就能得到剛好為
1255 的資料筆數
2-2. 這款遊戲的 Black 資料夾內沒有 ufont 字型檔,而是在 /Engine/Content/Engine
Fonts/Faces/ 資料夾內,有六個:
DroidSansFallback.ufont
RobotoBold.ufont
RobotoBoldItalic.ufont
RobotoItalic.ufont
RobotoLight.ufont
RobotoRegular.ufont
全部用繁體字 ttf 去取代(詳 Lv1 教學 3-7 步驟)
(全部取代的理由見註 2)
三、打包 pak 檔和 obb 檔
3-1. 把 FModel.exe 程式同資料夾的 \Output\Exports 裡面的 Black 和 Engine 兩個
資料夾移動到 UnrealPakSwitchv10 資料夾內(雖然現在不用它解包,但打包還是需要)
3-2. 在 UnrealPakSwitchv10 資料夾內建立一個文字檔 lista.txt, 內容是:
"../../../Black/Content/Localization/Game/zh/Game.locres"
"../../../Engine/Content/EngineFonts/Faces/DroidSansFallback.ufont"
"../../../Engine/Content/EngineFonts/Faces/RobotoBold.ufont"
"../../../Engine/Content/EngineFonts/Faces/RobotoBoldItalic.ufont"
"../../../Engine/Content/EngineFonts/Faces/RobotoItalic.ufont"
"../../../Engine/Content/EngineFonts/Faces/RobotoLight.ufont"
"../../../Engine/Content/EngineFonts/Faces/RobotoRegular.ufont"
3-3. 用 Lv1 2-2 的方法得知引擎版本是 11 or 11.27, 因此用 pack-v11.cmd 打包(原
因詳見 Lv2 教學步驟 5-1)
3-4. 把 newpak.pak 改名為 Black-Android_ASTC_p.pak
3-5. 建立一個新資料夾結構:
\Black\Content\Paks\
並把 Black-Android_ASTC_p.pak 移動到 Paks 裡面
3-6. 在 Black 資料夾按右鍵加到壓縮檔,務必選擇 ZIP 和「僅儲存」,參考 Lv1 教學
步驟 4-3, 即可得到 Black.zip
3-7. 把 Black.zip 改名為 patch.com.nDreams.FrackedAppsLab.obb 即得到繁體中文化
更新檔(命名規則參考 Lv2 教學的最後補充)
3-8. 把 patch.com.nDreams.FrackedAppsLab.obb 複製到 Quest 的內部儲存空間/Andro
id/obb/com.nDreams.FrackedAppsLab, 再執行遊戲就是繁體中文版了!(複製前先執行
過一次遊戲,至少進到標題選單再退出,否則可能會卡在一開始的 logo 畫面)
https://youtu.be/ZRsWdzYo-nw
參考資料:
B 站 逗逗米玩啊 大大的教學影片
https://www.bilibili.com/video/BV1PF411p7G4/
AES tools 來源與討論
https://cs.rin.ru/forum/viewtopic.php?f=10&t=100672&hilit=aes
https://www.deviantart.com/artinkers/art/ue4-Updated-Aes-Keys-840377092
(內含一些 UE4/UE5 的金鑰,如果你想解包的加密遊戲有出現在裡面就能直接用,毋需
再花時間解密)
註 1:步驟 1-4 輸入金鑰後仍然解包失敗,經逗逗米玩啊大大指點改用 FModel 的對話
Q: 大佬您好,我近期遇到一個有加密的 pak 文件,使用您提供的 加密游戏获取AES key
的工具 之後得到 key.txt, 然後透過以下網址轉換成 Base64:
https://base64.guru/converter/encode/hex
並編輯 crypto.json (把 DUMMY 換成 key 值)
版本是 11 or 11.27, 嘗試解包後,發現 key 應該是對了,但有非常多檔案只有 0 kb,
譬如
Engine\Content\EngineFonts\Faces 裡面的 ufont 全是 0kb,
遊戲名\Content\Localization\Game\語言\ 裡面的 Game.locres 也全是 0 kb
查看 lista.txt, 應該是有占空間的,譬如:
LogPakFile: Display: "Black/Content/Localization/Game/zh/Game.locres" offset:
3009865709, size: 43807 bytes, sha1: 791B0D603729CC3E86A0DEF37E540B4EFC7C26F7,
compression: Oodle.
有看到解包過程出現 error:
LogCompression: Error: FCompression::GetCompressionFormat - Unable to find a m
odule or plugin for compression format Oodle
請問大佬有遇過這問題嗎?謝謝
A: 用fmodel直接导出。脚本有时候会比较麻烦。导出速度也不慢。如果是安卓移动端的
,直接反编译Apk 查看xml,一般就能确定引擎版本。pc端直接右击游戏启动程序一般就
能查看到游戏版本。
註 2:採用最懶的方法,把 ufont 全部替換為繁體字型最不會出錯
Q: 大大您好,想請教一個問題:很多漢化補丁pak都是包含兩個檔案 1. game.locres 2.
ufont
不過在 Content\UI\Fonts\ 文件夾裡面有很多個 ufont 檔
請問我們在漢化的時候,要如何判定需要替換哪一個呢?謝謝
A: 一种最懒的全部替换,一种是用引擎自己制作根据需要调用字体,不用理会原来游戏
的UFONT字体,自己新增就好。