1. 项目概述为什么我们需要XUnity.AutoTranslator如果你是一个喜欢玩独立游戏或者小众Unity游戏的玩家或者你本身就是一名游戏开发者那么“游戏文本本地化”这个词对你来说一定不陌生。很多优秀的游戏尤其是那些由小型团队或个人开发者制作的精品往往因为语言障碍而将大量潜在玩家拒之门外。官方汉化遥遥无期而传统的“解包-翻译-封包”式汉化门槛极高不仅需要专业的逆向工程知识还常常因为游戏更新而失效。正是在这种背景下XUnity.AutoTranslator下文简称XUAT应运而生。它不是一个简单的文本替换工具而是一个运行时的、基于插件的自动化翻译框架。简单来说它能在游戏运行时“截获”游戏引擎Unity试图在屏幕上显示的任何文本将其发送到你指定的翻译服务如谷歌翻译、百度翻译、DeepL等然后将翻译结果实时替换回游戏界面。这意味着你几乎可以在不修改游戏原始文件的情况下为任何基于Unity引擎开发的游戏实现即时汉化。这听起来很神奇但背后的原理其实非常直接。Unity游戏在运行时所有要显示的文本UI文字、物品描述、对话台词最终都会通过特定的API调用进行渲染。XUAT的核心工作就是“拦截”Hook这些API调用。当游戏说“我要显示‘Hello World’这句话”时XUAT会抢先一步将这个字符串“Hello World”捕获然后询问你配置的翻译引擎“‘Hello World’的中文是什么”拿到“你好世界”这个结果后再塞回给游戏去显示。整个过程对游戏本身是透明的游戏并不知道自己显示的文字已经被“调包”了。那么谁最适合使用它呢首先是广大的玩家群体特别是那些热衷于体验非中文区独立游戏的玩家。你不再需要苦苦等待汉化组或者去论坛寻找可能带有风险的非官方汉化补丁。其次是游戏Mod社区的爱好者你可以利用XUAT为基础制作和分享特定游戏的汉化文本包。甚至对于小型开发团队XUAT也可以作为一个快速的本地化原型测试工具在正式投入翻译之前先用机器翻译预览整个游戏的大致效果。我最初接触XUAT是为了玩一款非常冷门的策略模拟游戏官方明确表示没有中文计划。在尝试了各种方法无果后XUAT几乎成了唯一的救命稻草。实测下来虽然机器翻译在文学性和准确性上无法与专业汉化媲美但对于理解游戏机制、推进剧情而言其效果已经足够让人满意体验从“完全看不懂”提升到了“能顺畅玩下去”。更重要的是它的配置过程本身就像一次对Unity游戏运行机制的趣味探索。2. 核心原理与工作流程拆解要熟练使用XUAT不能只停留在“点击安装”的层面理解其核心工作原理和流程能帮助你在遇到各种奇怪问题时快速定位原因。整个工作流程可以概括为“拦截-翻译-缓存-显示”四个核心环节。2.1 文本拦截XUAT的“耳朵”和“眼睛”XUAT之所以能翻译游戏内文本前提是它能“听到”或“看到”这些文本。它主要通过两种技术手段实现这一点IL代码注入Harmony库这是XUAT最核心、最强大的文本捕获方式。Unity游戏最终会编译成.NET的中间语言IL运行。Harmony是一个强大的.NET库它允许在运行时修改目标方法的IL代码。XUAT利用Harmony在游戏调用关键文本显示函数如TextMeshProUGUI.SetText、string.Localization.Get等时插入自己的处理逻辑。这就好比在游戏的“发声器官”里安装了一个窃听器任何经过这个器官的“声音”文本都会被XUAT记录并处理。这种方式兼容性最好能捕获到绝大多数动态生成的文本。资源文件监视对于一些直接存储在游戏资源文件如AssetBundle中的静态文本XUAT也会尝试进行加载时拦截。当游戏从资源文件中读取一个文本字符串时XUAT可以介入这个读取过程对字符串进行替换。注意不是所有文本都能被100%捕获。一些游戏可能使用非常规的自定义文本渲染方式或者对文本进行了复杂的加密、混淆。这时XUAT可能会失效。判断是否被成功拦截的一个简单方法是打开XUAT的实时日志查看游戏中触发文本显示时日志里是否有对应的捕获记录。2.2 翻译流程从捕获到显示的完整链条当一个文本被成功捕获后它会经历一个标准化的处理链条游戏请求显示文本 - XUAT拦截 - 检查本地翻译缓存 - 缓存命中 - 是使用缓存 - 替换文本并返回游戏 - 否 - 发送至在线翻译API - 接收翻译结果 - 存入本地缓存 - 替换文本并返回游戏这个流程中有几个关键设计点本地缓存Translation Cache这是提升体验的关键。首次翻译一个句子后结果会被保存在本地的一个文本文件通常是Translation.txt中。下次游戏再遇到完全相同的句子时XUAT会直接使用缓存的结果而不再请求在线翻译。这带来了三个巨大好处一是极大加快了文本显示速度避免了网络延迟二是节省了翻译API的调用次数很多API有额度限制三是允许玩家手动编辑这个缓存文件来修正机器翻译的错误实现“半人工汉化”。翻译端点EndpointXUAT本身不包含翻译引擎它只是一个调度器。它支持配置多种在线翻译服务如Google Translate、Bing Translator、DeepL、Yandex.Translate等也支持一些国内服务如百度翻译、有道智云的API。你需要根据自身网络环境和对翻译质量的需求来选择合适的端点。延迟与异步处理为了不阻塞游戏主线程导致卡顿XUAT的翻译请求通常是异步进行的。这意味着在翻译结果返回前游戏可能暂时显示原文或空白待翻译完成后才刷新为中文。在配置文件中可以调整相关参数来优化这个体验。2.3. 配置文件解析掌控行为的钥匙XUAT的所有行为都通过一个名为AutoTranslatorConfig.ini的配置文件来控制。这个文件是汉化能否成功、体验是否良好的核心。你需要像一名工程师一样去理解它。主要配置节包括[Service]配置翻译服务。最重要的两个选项是Endpoint和Url。例如使用谷歌翻译时EndpointGoogleTranslate。[General]通用行为设置。如DelaySeconds翻译延迟、MaxCharactersPerTranslation单次翻译最大字符数用于应对长文本、EnableTranslation总开关。[TextFrameworks]配置文本框架的识别和挂钩方式通常保持默认即可。[Speech]配置是否翻译语音字幕如果游戏支持。[Subtitle]字幕翻译相关设置。理解并合理调整这些参数是解决“翻译不出来”、“翻译速度慢”、“游戏卡顿”等问题的第一步。例如如果你的网络连接翻译API较慢可以适当增大DelaySeconds让XUAT积累更多文本一次性发送减少请求次数但代价是文本显示的中文化会有更明显的延迟。3. 实战部署一步步为你的游戏穿上中文外衣理论讲得再多不如动手操作一遍。下面我将以一款虚构的Unity游戏《Fantasy Quest》为例展示从零开始部署XUAT的完整过程。请记住不同游戏的具体情况可能略有差异但核心流程是相通的。3.1 环境准备与工具选择在开始前你需要准备好以下几样东西目标游戏确保你拥有该游戏的正版副本并知道其安装目录。通常路径类似于Steam\steamapps\common\Fantasy Quest。BepInEx框架这是为Unity游戏注入和管理Mod的行业标准框架。XUAT需要依赖BepInEx才能运行。你需要下载与游戏架构x86或x64匹配的BepInEx版本。通常选择BepInEx_x64_5.4.21.0.zip这样的版本即可。XUnity.AutoTranslator插件从GitHub的官方发布页面下载最新版本的XUnity.AutoTranslator-BepInEx-5.4.21.zip。务必选择与BepInEx版本对应的插件包。文本编辑器推荐使用Notepad或VS Code用于后续编辑配置文件和解码缓存文件。3.2 安装BepInEx框架这是最基础也是最关键的一步目的是在游戏进程中创建一个可以加载第三方代码即Mod的环境。解压你下载的BepInEx压缩包例如BepInEx_x64_5.4.21.0.zip。将解压出的所有文件和文件夹BepInEx目录、doorstop_config.ini、winhttp.dll等复制到游戏的根目录。也就是Fantasy Quest.exe所在的文件夹。首次运行双击启动游戏。此时游戏可能会有一个稍长的加载过程BepInEx正在初始化。运行成功后关闭游戏。验证安装回到游戏根目录你应该能看到新生成了一个BepInEx文件夹并且其内部有plugins、config等子目录。这证明BepInEx安装成功。实操心得有些游戏的反作弊或保护机制可能会阻止BepInEx正常加载。如果游戏无法启动或启动后没有生成BepInEx文件夹你需要查阅该游戏特定的Mod社区看是否有特殊的破解或绕过方法。对于单机游戏这通常不是问题。3.3 安装与配置XUnity.AutoTranslatorBepInEx框架搭好之后就可以安装我们的主角了。解压XUnity.AutoTranslator的插件包。将解压后得到的Translation文件夹和AutoTranslator文件夹注意是整个文件夹复制到游戏根目录\BepInEx\plugins\目录下。最终路径应类似于...\Fantasy Quest\BepInEx\plugins\AutoTranslator。现在BepInEx\plugins\AutoTranslator目录下应该有一个AutoTranslatorConfig.ini文件。用文本编辑器打开它进行关键配置。核心配置修改示例[Service] ; 选择翻译端点这里以谷歌翻译为例 EndpointGoogleTranslate ; 如果你在中国大陆直接使用GoogleTranslate可能无法连接。可以尝试使用内置的谷歌镜像或更换为百度翻译 ; EndpointGoogleTranslateLegacy ; 使用百度翻译时需要配置AppId和密钥 ; EndpointBaidiTranslate ; BaiduAppId你的AppId ; BaiduSecret你的密钥 [General] ; 是否启用翻译总开关 EnableTranslationtrue ; 初始延迟秒建议从1.0开始尝试 DelaySeconds1.0 ; 是否在屏幕左上角显示翻译状态调试用 ShowStatustrue ; 最大字符数超过会分割发送。谷歌翻译单次限制约为5000字符 MaxCharactersPerTranslation4500 [Speech] ; 是否翻译语音字幕 Enabledfalse保存配置文件。3.4 首次运行与初步验证配置完成后再次启动游戏。如果一切顺利你会注意到以下几点游戏启动日志在游戏根目录的BepInEx\LogOutput.log文件中会记录BepInEx和所有插件的加载日志。搜索“AutoTranslator”如果看到成功加载的信息说明插件已激活。屏幕状态提示如果你在配置中设置了ShowStatustrue游戏屏幕左上角会显示“XUnity AutoTranslator”的状态信息如“Waiting...”、“Translating...”等。这是一个非常直观的验证方式。生成缓存文件进入游戏触发一些对话或界面文字。然后退出游戏检查BepInEx\plugins\AutoTranslator\Translation目录。你应该能看到生成了一个新的文本文件文件名可能包含游戏名称和语言代码如Fantasy Quest_zh-CN.txt。这个文件就是你的翻译缓存文件。打开它你会看到类似这样的内容Hello|你好 Start Game|开始游戏 Load Game|加载游戏这证明XUAT已经成功捕获并翻译了文本并将结果缓存了下来。至此最基本的自动化汉化已经部署成功。4. 高级调优与问题排查实战基础部署只是开始。要让汉化体验从“能用”变得“好用”甚至“完美”还需要进行一系列调优和问题排查。下面是我在多个项目中总结出的核心经验。4.1 翻译质量优化从机翻到“准人工”机器翻译的直译常常生硬、不符合语境。XUAT的强大之处在于它允许你通过编辑本地缓存文件对翻译结果进行永久性修正。定位与编辑缓存文件游戏运行并翻译一些内容后在Translation目录下找到对应的*_zh-CN.txt文件。用支持UTF-8编码的编辑器如Notepad打开。理解格式文件格式是“原文|译文”每条记录占一行。你可以直接修改“|”后面的译文部分。修正翻译术语统一将游戏内重要的技能名、物品名、地名等统一修正。例如将“Fire Ball”的机翻“火球”修正为更符合游戏背景的“炎爆术”。语境优化英文中一个词可能有多个意思。例如“Craft”在菜单中是“制作”在技能描述里可能是“手艺”。根据上下文在缓存文件中分别修正。语言风格将生硬的书面语改为更符合游戏角色性格的口语。例如将“I cannot do that.”的机翻“我不能那样做。”改为“这事儿我可办不到。”保存与生效保存文件后重启游戏。XUAT会优先使用缓存文件中你修改过的译文。你可以通过反复游玩、收集文本、修正缓存像滚雪球一样逐步完善整个游戏的汉化。这个过程甚至可以与社区合作共享一个不断完善的翻译缓存文件。4.2 性能与稳定性调优翻译过程会占用网络和计算资源不当配置可能导致游戏卡顿、翻译延迟高。调整DelaySeconds参数这个参数控制XUAT捕获文本后等待多久才打包发送去翻译。值太小如0.1会导致频繁发起网络请求可能造成卡顿值太大如5.0会导致玩家看到原文的时间过长。建议从1.0开始根据实际体验微调。在网络好、文本量不大的游戏中可以尝试0.5反之则可能需要2.0或更高。利用MaxCharactersPerTranslation将这个值设置为略低于翻译API的单次限制谷歌是5000可以让XUAT尽可能将多个短句打包成一个请求发送减少请求次数显著提升效率。管理缓存文件随着游戏进程缓存文件会越来越大。定期清理其中已经不再出现的、或翻译质量很差的条目可以加快XUAT加载缓存的速度。你可以将确认无误的优质翻译转移到一个单独的“基础词典”文件中并在配置中通过FallbackTranslationFile指定这样每次新游戏都能有一个高质量的翻译起点。选择低延迟的翻译端点GoogleTranslate端点在国内可能不稳定。可以尝试以下替代方案GoogleTranslateLegacy有时更稳定。BaiduTranslate需要申请百度翻译开放平台的API免费额度足够个人使用延迟低且稳定。自定义端点如果你有自己的翻译服务器或代理可以在配置中指定自定义的URL格式。4.3 常见问题与解决方案速查表在实际使用中你几乎一定会遇到下面这些问题。这里我整理了一份速查表附上我的排查思路和解决方案。问题现象可能原因排查步骤与解决方案游戏启动崩溃或黑屏1. BepInEx版本与游戏不兼容。2. XUAT插件版本与BepInEx不匹配。3. 游戏有反作弊系统。1. 检查游戏是32位(x86)还是64位(x64)下载对应版本的BepInEx。2. 确保下载的XUAT插件明确标注支持你使用的BepInEx 5.x版本。3. 查看游戏社区寻找特定的破解或绕过补丁针对单机游戏。游戏能运行但没有任何文本被翻译1. XUAT插件未正确加载。2. 配置文件EnableTranslation未开启。3. 翻译端点配置错误或网络不通。4. 游戏文本渲染方式特殊未被成功挂钩。1. 查看LogOutput.log确认AutoTranslator插件加载日志。2. 检查AutoTranslatorConfig.ini中[General]下的EnableTranslation是否为true。3. 尝试将ShowStatus设为true看屏幕是否有状态提示。检查端点配置和网络连接。4. 尝试在配置文件中启用或禁用不同的TextFrameworks选项或查阅该游戏特定的XUAT适配讨论。翻译延迟极高或翻译请求失败1. 网络连接翻译API慢或被阻断。2.DelaySeconds设置过小请求过于频繁。3. 翻译API额度用尽或无效。1. 更换翻译端点如从GoogleTranslate换为BaiduTranslate。2. 适当增大DelaySeconds值如从1.0改为2.0或3.0。3. 如果使用付费API检查额度如果使用内置免费端点可能是临时IP限制等待一段时间或重启路由器更换IP。部分UI文字如主菜单未被翻译这些文本可能是以图片形式Texture存在或是在游戏启动初期、XUAT插件加载完成前就已加载。1. 对于图片文字XUAT无能为力这是硬编码汉化的范畴。2. 对于早期加载的文本可以尝试在游戏完全启动进入主菜单后再手动触发一次翻译通常XUAT有热键重新翻译当前屏幕文本。翻译缓存文件Translation.txt乱码文件编码不是UTF-8。使用Notepad等编辑器打开文件在“编码”菜单中选择“转为UTF-8编码”然后保存。确保配置中语言代码正确如zh-CN。翻译结果中有大量“未翻译”或重复原文1. 翻译API无法处理该文本如特殊格式、代码。2. 文本中包含游戏引擎的特殊富文本标签如colorred。1. 这是正常现象机器翻译无法翻译非自然语言。可以在缓存文件中手动为这些条目添加译文。2. XUAT通常能很好地处理富文本标签但极端情况下标签可能被破坏。可以尝试在配置中调整TextFrameworks的设置或手动编辑缓存文件确保标签的完整性。4.4 进阶技巧预处理与正则表达式对于有规律的、批量出现的翻译问题手动逐条修改缓存文件效率太低。XUAT支持在翻译前后对文本进行预处理Preprocessing和后处理Postprocessing这需要通过修改配置文件来实现。例如游戏里所有物品名称后面都跟着一个星号*用于标记稀有度但翻译API会把星号一起翻译导致译文很奇怪。你可以在配置文件中添加[Preprocess] \*$这个简单的正则表达式规则会在文本发送给翻译API之前移除行末的星号。等翻译完成后你还可以通过后处理规则再加回去或者用更本地化的方式如“[稀有]”前缀来替代。再比如游戏内所有数字都使用了逗号作为千位分隔符如1,000但中文习惯不使用。你可以添加后处理规则[Postprocess] (\d),(?\d{3})$1这条规则会在翻译完成后移除数字中的逗号。掌握基础的正则表达式能让你解决一大批系统性的翻译格式问题。经过以上步骤你不仅能让一个Unity游戏显示中文更能逐步打磨出一份高质量的、带有个人或社区风格的汉化补丁。XUAT的魅力正在于此它降低了对游戏进行文本修改的技术门槛将创造力交还给玩家和社区。从“能用”到“好用”再到“精益求精”的过程本身就是一种充满成就感的Mod制作体验。