1. 项目概述:为什么我们需要XUnity.AutoTranslator?
如果你是一个喜欢玩各种独立游戏或小众Unity游戏的玩家,肯定遇到过这样的烦恼:一款游戏玩法精妙、美术独特,但偏偏没有中文支持。开发者可能来自非中文区,或者游戏本身受众较小,官方汉化遥遥无期。手动修改游戏文件?对于Unity游戏来说,资源文件往往被打包加密,直接修改如同大海捞针。这时候,一个名为XUnity.AutoTranslator的工具就进入了我们的视野。
简单来说,XUnity.AutoTranslator是一个运行时的“外挂”式翻译插件。它不像传统的汉化补丁那样直接修改游戏资源,而是在游戏运行时,动态拦截游戏引擎(Unity)显示文本的调用,将获取到的原始文本(比如英文、日文)发送到指定的在线翻译服务(如谷歌翻译、百度翻译、DeepL),再将翻译结果“塞回”给游戏引擎进行显示。整个过程对游戏本身文件几乎零修改,实现了“即插即用”的实时汉化效果。这对于那些更新频繁、或者资源文件难以解包的游戏来说,几乎是目前最优雅、最通用的解决方案。
我接触这个工具已经有好几年了,从它早期的版本一直用到现在的稳定版,期间用它“啃”下了不下几十款生肉游戏。可以说,它极大地拓宽了我的游戏选择范围。但我也深知,对于刚接触的新手来说,从下载、安装、配置到最终成功运行,每一步都可能遇到坑。网上的教程要么过于简略,要么版本陈旧,很多关键细节一笔带过。这篇指南,就是把我这些年积累的所有经验、踩过的所有坑,系统地梳理出来,目标是让你看完之后,能够独立完成从零到一的Unity游戏汉化,并且理解其背后的工作原理,做到举一反三。
2. 核心原理与工作流程拆解
在动手之前,我们有必要花点时间搞清楚XUnity.AutoTranslator到底是怎么工作的。理解原理不仅能帮你更好地配置它,更重要的是,当翻译出现问题时,你能知道该从哪里着手排查,而不是盲目地重装。
2.1 Unity游戏的文本显示机制
Unity游戏中的文本,绝大多数是通过UGUI(Unity GUI)的Text或TextMeshPro组件来显示的。当游戏运行时,这些组件会从一个“数据源”获取需要显示的字符串。这个数据源可能是硬编码在脚本里的字符串,也可能是从Resources文件夹加载的文本资源(如.txt,.json,.xml),或者是通过AssetBundle加载的本地化文件。
XUnity.AutoTranslator的核心思路,就是在这个“获取字符串”的环节进行拦截。它通过一种叫做“Harmony”的库(一个强大的.NET运行时补丁库),在游戏代码中“打入”一个钩子(Hook)。当游戏试图获取某个文本时,这个钩子会先被触发。
2.2 XUnity.AutoTranslator的拦截与替换流程
整个工作流程可以概括为以下几个步骤,我画了一个简单的思维图来帮助理解:
- 文本拦截:游戏代码调用
Text.text = “Hello World”;。Harmony钩子捕获到这个调用,并获取到原始字符串“Hello World”。 - 缓存查询:插件首先检查本地是否已经存在“Hello World”对应的翻译缓存。这个缓存通常是一个名为
Translation.txt的文本文件,存储在游戏目录的BepInEx/Translation文件夹下。如果找到了,直接跳到第5步。 - 在线翻译:如果缓存中没有,插件会将“Hello World”以及你配置的目标语言(如简体中文
zh-CN)作为参数,调用你预设的在线翻译API(例如谷歌翻译)。 - 结果缓存:收到翻译API返回的“你好,世界”后,插件一方面将这个结果返回给游戏进行显示,另一方面会将“Hello World -> 你好,世界”这个键值对追加写入本地的
Translation.txt缓存文件。 - 文本替换:最后,插件将“你好,世界”这个字符串设置回
Text.text属性,游戏界面便显示出了中文。
这个过程有两个巨大的优势:一是非侵入性,不修改游戏原始文件;二是增量缓存,同一句文本只会在第一次出现时请求在线翻译,之后都从本地缓存读取,既节省了网络请求,也避免了因API调用频繁可能导致的IP限制问题。
注意:这个流程主要针对动态文本。对于直接以图片形式存在的文字(如图片UI上的标题),此工具无能为力,这类文本需要传统的图像处理汉化方式。
2.3 工具选型:为什么是XUnity.AutoTranslator?
市面上也有一些其他的Unity游戏翻译工具,比如EmbeddedTranslator或者某些OCR截图翻译工具。选择XUnity.AutoTranslator的主要原因在于它的通用性和社区活跃度。
它基于BepInEx框架,而BepInEx是Unity游戏Mod开发的事实标准框架,兼容性极广。只要游戏能运行BepInEx,理论上就能运行这个翻译器。其次,它的配置非常灵活,支持多种翻译引擎,缓存机制完善。最重要的是,它的开源社区持续维护,遇到问题更容易找到解决方案或同类求助。
3. 环境准备与前置工具安装
工欲善其事,必先利其器。要让XUnity.AutoTranslator跑起来,我们需要先搭建好它的运行环境。整个过程就像搭积木,每一步都是下一步的基础。
3.1 第一步:确认游戏运行环境与架构
首先,找到你想要汉化的游戏。右键点击游戏的启动程序(.exe),选择“属性” -> “兼容性”选项卡 -> 点击“更改高DPI设置”。在弹出的窗口中,勾选“替代高DPI缩放行为”,并在下拉菜单中选择“应用程序”。这个操作可以解决一些Unity游戏在高分辨率屏幕下文本显示错位的问题,虽然不是翻译器必需,但能避免后续很多奇怪的显示Bug。
接着,你需要知道游戏是基于.NET Framework还是.NET Core/.NET 5+,以及是x86还是x64架构。一个简单的方法是使用工具DetectItEasy或直接查看游戏主目录下是否有UnityPlayer.dll(通常为x64)或UnityCrashHandler64.dll等文件。大多数较新的Unity游戏都是64位的。了解这一点对后续选择正确版本的BepInEx至关重要。
3.2 第二步:安装BepInEx框架
BepInEx是基石,XUnity.AutoTranslator是运行在它上面的插件。前往BepInEx的GitHub发布页,下载与你的游戏架构匹配的版本。对于绝大多数现代Unity游戏,下载BepInEx x64版本即可。
安装步骤非常简单:
- 将下载的BepInEx压缩包解压。
- 将解压出的所有文件和文件夹(主要是
BepInEx文件夹、doorstop_config.ini、winhttp.dll等)复制到你的游戏根目录(即.exe启动文件所在的文件夹)。 - 首次运行游戏。游戏启动后可能会黑屏一段时间(这是BepInEx在注入和初始化),稍等片刻后正常进入游戏。然后退出游戏。
- 此时,游戏根目录下会生成完整的
BepInEx文件夹结构,里面包含plugins、config等子文件夹。这表明BepInEx安装成功。
实操心得:第一次运行BepInEx后,务必检查
BepInEx/LogOutput.log文件。如果这个文件成功生成且没有大量红色错误信息,说明注入成功。如果游戏无法启动或瞬间崩溃,很可能是BepInEx版本与游戏不兼容,需要尝试其他版本(如x86版本,或带“unitymono”特殊版本的游戏需使用BepInEx Unity Mono版本)。
3.3 第三步:获取XUnity.AutoTranslator插件
前往XUnity.AutoTranslator的官方发布页(如GitHub Releases)。你需要下载两个核心文件:
XUnity.AutoTranslator-{版本号}.zip:这是主插件。XUnity.ResourceRedirector-{版本号}.zip:这是一个资源重定向依赖库,用于处理一些更复杂的文本资源(如AssetBundle中的文本),必须同时安装。
下载完成后,分别解压这两个zip文件。
3.4 第四步:安装插件与依赖
安装过程就是文件复制:
- 将
XUnity.AutoTranslator解压出的BepInEx文件夹,与游戏根目录下的BepInEx文件夹合并。通常是将plugins、patchers等子文件夹复制过去。 - 同样地,将
XUnity.ResourceRedirector解压出的BepInEx文件夹也与游戏目录的合并。 - 确保最终在
BepInEx/plugins目录下,能看到类似XUnity.AutoTranslator和XUnity.ResourceRedirector的文件夹,里面包含各自的.dll文件。
至此,所有硬性安装步骤就完成了。接下来是最关键的一环:配置。
4. 核心配置详解与翻译引擎设置
安装只是把工具放进了工具箱,配置才是决定它如何工作的说明书。XUnity.AutoTranslator的所有配置都集中在BepInEx/config/AutoTranslatorConfig.ini这个文件里。用记事本或任何文本编辑器打开它,我们会看到大量可配置项。别担心,我们只需要关注最核心的几个。
4.1 基础配置:告诉插件“翻译什么”和“译成什么”
[General] Language=zh-CN FromLanguage=en- Language:这是目标语言,即你想翻译成的语言。
zh-CN代表简体中文。如果你想翻译成繁体中文,则用zh-TW。 - FromLanguage:这是源语言,即游戏原本的语言。通常设置为
en(英文)或ja(日文)。如果你不确定,可以留空或设置为auto,让翻译API去自动检测,但这可能会影响首次翻译的准确率和速度。
注意:语言代码必须使用标准的ISO代码。设置错误会导致翻译API无法工作或翻译出奇怪的语言。
4.2 翻译服务配置:选择你的“翻译官”
这是整个配置的灵魂。插件支持多种后端,我们主要看最常用的两个:谷歌翻译和百度翻译。
方案一:使用谷歌翻译(免费,但可能需要网络环境)
找到配置文件中[Service]部分,确保配置如下:
[Service] Endpoint=GoogleTranslate谷歌翻译的免费接口相对稳定,但请注意,在某些网络环境下直接访问可能受限。插件本身不解决网络连通性问题。
方案二:使用百度翻译API(稳定,需申请免费额度)
这是我个人更推荐的方式,因为百度翻译API在国内访问稳定,且有每月免费的字符额度(标准版每月200万字符),对个人玩家完全够用。
- 申请API:前往百度翻译开放平台官网,注册开发者账号。在控制台创建通用翻译API服务,你会得到
AppId和密钥。 - 修改配置:
[Service] Endpoint=BaiduTranslate BaiduAppId=你的AppId BaiduSecret=你的密钥 - 设置语言:由于百度翻译的语言代码与ISO略有不同,我们还需要调整之前的语言设置(如果使用百度):
注意,目标语言简写为[General] Language=zh FromLanguage=enzh。
4.3 缓存与性能优化配置
[General] MaxCharactersPerTranslation=500 DelaySecondsAfterTranslation=0.5- MaxCharactersPerTranslation:单次翻译请求的最大字符数。设置一个合理的值(如500)可以防止因单个文本过长导致翻译失败,同时符合一些API的调用限制。
- DelaySecondsAfterTranslation:每次翻译后的延迟秒数。对于免费API,设置一个小的延迟(如0.2-0.5秒)可以避免因请求频率过高被服务器封禁。如果是本地离线翻译引擎(如后面会提到的LecisTranslator),可以设为0。
[Text] EnableTranslationCache=true SaveTranslationsToFile=true- 这两个选项务必保持
true。前者启用内存缓存,加速重复文本的读取;后者将翻译结果保存到Translation.txt文件,实现永久缓存。
4.4 文本抓取与排除配置
不是所有文本都适合翻译,比如版本号、代码、特定格式符。
[Text] RegexFilters=^\\d+$, ^v\\d+\\.\\d+, ^[A-Z0-9_]+$ IgnoreWhitespaceDifferences=true- RegexFilters:正则表达式过滤器。上面这个示例会过滤纯数字、类似“v1.2”的版本号、全大写下划线组成的字符串(常为代码常量)。你可以根据需要添加自己的过滤规则。
- IgnoreWhitespaceDifferences:设为
true,插件会忽略原文和缓存中文本的空格差异进行匹配,更智能。
完成这些核心配置后,保存AutoTranslatorConfig.ini文件。启动游戏,如果配置正确,你应该能看到游戏内的文本逐渐被替换成中文。第一次运行会边玩边翻译,稍显卡顿是正常的,因为它在不断请求API并写入缓存。
5. 高级技巧与深度定制
基础翻译能运行后,我们可以追求更好的体验。这部分内容能解决你实际使用中遇到的大部分痛点。
5.1 离线翻译方案:彻底摆脱网络依赖
在线API虽好,但总有网络不稳或担心额度的时候。我们可以部署一个本地翻译服务,实现完全离线汉化。这里推荐使用LecisTranslator或BertVITS2等本地化翻译工具作为后端。
以配置XUnity.AutoTranslator使用本地HTTP翻译服务为例:
- 部署本地翻译服务:你需要先在本机(或局域网内另一台机器)上搭建一个翻译服务。例如,使用LecisTranslator,它会提供一个HTTP API接口,比如
http://localhost:5000/translate。 - 修改插件配置:
你需要根据本地服务的实际API文档,调整[Service] Endpoint=Custom CustomUrl=http://localhost:5000/translate CustomQuery=text={Text}&from={FromLanguage}&to={ToLanguage}CustomUrl和CustomQuery的格式。{Text},{FromLanguage},{ToLanguage}是插件会自动替换的变量。 - 注意请求格式:确保你的本地服务能够接收并处理插件发送的HTTP GET或POST请求,并返回JSON格式的翻译结果,例如
{"translation": "翻译后的文本"}。
这种方式需要一定的技术动手能力,但一旦搭建成功,翻译速度极快,且完全私密、无网络要求。
5.2 翻译缓存(Translation.txt)的妙用与手动编辑
Translation.txt文件是汉化的核心资产。它不仅是缓存,更是我们进行人工校对和润色的入口。
这个文件格式很简单:
原文1<|>译文1 原文2<|>译文2游戏运行后,所有翻译过的条目都会追加到这里。你可以直接用记事本打开它进行编辑:
- 修正机翻错误:找到翻译生硬或错误的行,直接修改
<|>后面的译文部分。 - 统一术语:确保同一角色名、技能名、专有名词在整个游戏中的翻译一致。你可以利用文本编辑器的查找替换功能。
- 添加未翻译文本:如果你发现某些文本始终没有被自动翻译(可能被正则过滤了),可以手动在此文件中添加一行。格式为
原文<|>你的翻译。注意,原文必须与游戏内显示的完全一致,包括大小写和空格。
手动编辑并保存后,重启游戏,插件就会优先使用你修改后的翻译。这是提升汉化质量的终极手段。
5.3 处理特殊文本与Unity UI框架
TextMeshPro (TMP) 支持:现代Unity游戏大量使用TextMeshPro来显示更精美的字体。XUnity.AutoTranslator默认支持TMP。但有时TMP文本可能包含富文本标签(如<color=red>),插件在翻译时会尝试保留这些标签,但复杂的嵌套可能导致问题。如果发现TMP文本翻译后格式错乱,可以在配置中尝试调整[Text]下的TextMeshProSupportLevel选项。
UGUI动态生成文本:有些游戏的UI文本是在运行时通过代码拼接生成的(例如,“你获得了” + itemName + “x” + count)。插件会尝试翻译每一个片段,但可能会导致语义不通。对于这种情况,最佳实践是在Translation.txt中为完整的常见拼接句添加手动翻译条目,或者通过正则过滤掉那些单独的变量片段。
下拉框(Dropdown)、输入框(InputField):这些交互组件的文本也可能被翻译。但翻译输入框的提示文字(Placeholder)是没问题的,而翻译用户正在输入的内容则不合适。插件通常能较好地区分,如果出现问题,可以通过组件类型在配置中进行排除。
6. 实战问题排查与故障解决指南
即使按照教程一步步来,也难免会遇到问题。下面是我总结的常见问题清单和排查思路,基本能覆盖90%的情况。
6.1 游戏启动崩溃或插件未加载
现象:安装BepInEx和插件后,游戏无法启动,或启动后无任何翻译效果。
排查步骤:
- 检查日志:第一时间查看
BepInEx/LogOutput.log。这是最重要的诊断文件。如果文件为空或不存在,说明BepInEx注入失败。 - BepInEx版本:确认下载的BepInEx版本(x86/x64/Unity Mono)与游戏匹配。对于较老或使用Mono后端(而非IL2CPP)的Unity游戏,可能需要尝试BepInEx的“Unity Mono”专用版本。
- 依赖冲突:确保
XUnity.ResourceRedirector已正确安装。缺少这个依赖,插件可能无法加载。 - 杀毒软件拦截:有时杀毒软件会误将注入工具(如
winhttp.dll)视为威胁而隔离。将游戏目录添加到杀毒软件的白名单中。 - 管理员权限:尝试以管理员身份运行游戏。
6.2 翻译功能已加载,但游戏内无任何文本被翻译
现象:游戏能正常启动,日志显示插件已加载,但游戏里还是原文。
排查步骤:
- 检查配置文件:确认
AutoTranslatorConfig.ini中的Language和FromLanguage设置正确,并且配置文件确实保存在BepInEx/config目录下,而非其他地方。 - 检查翻译服务:确认
Endpoint设置正确。如果使用百度翻译,检查AppId和Secret是否填写无误,并在百度翻译平台确认服务已启用。 - 查看实时日志:运行游戏,并保持
BepInEx/LogOutput.log文件打开(用记事本等工具),在游戏中触发一些文本(如打开菜单)。观察日志中是否有类似Translating ‘Hello’ to zh-CN的记录。如果没有,说明文本未被捕获;如果有但翻译失败,会显示错误信息。 - 文本捕获范围:有些游戏的文本可能通过非常规方式加载,超出了插件的默认钩子范围。可以尝试在配置文件中启用实验性选项(如
EnableExperimentalFeatures),但需谨慎。
6.3 翻译结果错误、乱码或部分文本缺失
现象:翻译出来了,但质量很差,是乱码,或者有些按钮文字没翻译。
排查步骤:
- 乱码问题:通常是编码问题。确保
Translation.txt文件以UTF-8编码保存(推荐使用Notepad++等编辑器查看和修改)。在配置中,可以尝试设置FileEncoding=utf-8。 - 翻译质量差:在线机翻的局限性。对于关键术语,务必使用
Translation.txt进行手动修正和统一。对于百度/谷歌翻译都不理想的句子,可以考虑使用DeepL的API(如果支持),或者在本地缓存中精心修改。 - 部分文本未翻译:
- 被正则过滤:检查
RegexFilters是否过于严格,误过滤了正常文本。可以暂时注释掉(在行首加#)所有过滤规则进行测试。 - 图片文本:确认是否为图片UI。如果是,则无法翻译。
- 动态生成文本:如前所述,可能需要手动添加完整句子到缓存。
- 字体缺失:翻译后的中文文本,如果游戏字体不支持中文,会显示为方框(□□□)。你需要为游戏替换或添加中文字体,这涉及更深的Unity游戏Mod制作,通常需要其他工具(如UnityEX)解包游戏资源,替换字体文件。
- 被正则过滤:检查
6.4 性能问题与游戏卡顿
现象:游戏在文本出现时明显卡顿。
排查步骤:
- 延迟设置:适当增加
DelaySecondsAfterTranslation的值(如从0.2调到0.5),降低请求频率。 - 缓存生效:首次游玩卡顿正常,因为所有文本都在请求翻译。玩过一段时间、缓存文件丰富后,第二次及以后游玩会非常流畅。
- 关闭实时翻译:对于配置较低的机器,可以在配置中设置
EnableTranslation=false,让插件只从已有的Translation.txt缓存中读取翻译,完全不进行网络请求。这适合在缓存已基本完备后使用。 - 检查网络:如果使用在线API,网络延迟是卡顿的主因。考虑使用本地翻译服务方案。
7. 维护、更新与社区资源
汉化不是一劳永逸的事,游戏会更新,插件也会更新。
游戏更新后汉化失效:游戏大更新可能会改变内部代码结构,导致BepInEx或翻译插件失效。通常的解决步骤是:1) 等待BepInEx和XUnity.AutoTranslator插件更新到兼容新游戏版本的版本;2) 重新安装新版框架和插件;3) 你之前积累的Translation.txt缓存文件通常可以保留并继续使用,除非游戏文本键值完全改变。
插件更新:关注XUnity.AutoTranslator的GitHub发布页。更新时,建议先备份整个BepInEx文件夹以及你的Translation.txt。然后删除旧的插件文件,放入新版本的文件。配置文件AutoTranslatorConfig.ini通常可以保留。
社区与资源:
- GitHub Issues:遇到棘手的技术问题,首先去插件的GitHub仓库的Issues页面搜索,很可能已经有人提出并解决了。
- 玩家社区:一些专门的游戏Mod社区或论坛(如贴吧、Reddit相关板块、Discord群组)是寻找特定游戏汉化补丁或交流心得的好地方。有时你可以直接下载到别人已经翻译好的、质量较高的
Translation.txt缓存文件,这能节省大量初期翻译和校对时间。 - 术语表:对于大型游戏或系列游戏,自己维护一个术语表(在
Translation.txt文件开头或单独一个文件)非常重要,确保翻译的一致性。
最后,我想分享一个最重要的心得:耐心和细心是汉化工作的核心。自动翻译工具提供了前所未有的便利,但它只是一个强大的辅助。真正让汉化作品有灵魂的,是你在Translation.txt文件中逐行校对、推敲词句所花费的时间。当你看到自己精心润色过的文本流畅地呈现在游戏世界中,那种成就感和为更多玩家扫清语言障碍的满足感,是任何机翻都无法替代的。从这个工具开始,你不仅是在玩游戏,更是在参与创造游戏的体验。祝你在Unity游戏的海洋里,畅行无阻。