[教学] 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字体,自己新增就好。