
1. 项目概述打破语言壁垒的利器如果你和我一样是个喜欢尝鲜各种独立游戏、视觉小说或者日式RPG的玩家那你肯定没少遇到过“游戏是好游戏可惜没中文”的尴尬。面对满屏的日文、英文或者其他小语种查字典查到眼酸剧情体验支离破碎那种感觉实在让人抓狂。几年前为了解决这个问题我几乎尝试了所有能想到的土办法截图OCR翻译、外挂翻译软件甚至自己动手用Cheat Engine去内存里抓文本过程繁琐不说效果还时好时坏严重破坏了游戏沉浸感。直到我遇到了XUnity.AutoTranslator下文简称XUA这一切才发生了根本性的改变。它不是一个简单的屏幕取词工具而是一个深度集成到Unity游戏引擎内部的实时文本钩取与替换框架。简单来说它能在游戏运行时“监听”到游戏UI上即将显示的每一段文本将其发送到你指定的翻译服务如谷歌、百度、DeepL等获取翻译结果后再“悄无声息”地替换掉原始文本显示在屏幕上。整个过程几乎是实时的你看到的就是翻译后的中文或其他目标语言仿佛游戏原生就支持一样。这个项目的核心价值在于它的普适性与自动化。它不针对某一款特定游戏而是基于Unity引擎的通用性理论上能覆盖海量的Unity游戏。对于玩家而言它是解锁非母语游戏的“万能钥匙”对于Mod作者和汉化组而言它提供了一个强大、稳定且可扩展的底层框架可以基于此构建完整的本地化解决方案甚至实现图片资源的替换。经过我多年的实际使用和折腾XUA的成熟度和可定制性已经达到了一个非常高的水平足以应对从简单的文字冒险到复杂的3A级Unity游戏的各种翻译需求。2. 核心原理与架构拆解它究竟是如何工作的要玩转XUA不能只停留在“复制粘贴”的层面理解其工作原理能帮你解决90%的疑难杂症。它的核心工作流程可以概括为“钩取-翻译-替换-渲染”四个步骤背后依赖几个关键的技术组件。2.1 核心工作流从文本出现到翻译显示文本钩取Hooking这是第一步也是技术核心。XUA通过Harmony或备选的MonoMod这类.NET运行时补丁库在游戏运行时动态修改Unity引擎中用于显示文本的组件如UnityEngine.UI.Text、TextMeshPro等的关键方法。当游戏代码调用这些方法设置文本内容时XUA的代码会抢先一步被调用从而截获到原始的、未经翻译的文本字符串。这个过程对游戏本身是透明的游戏并不知道自己显示的文本被“劫持”了。翻译查询Translation Query截获到文本后XUA不会立刻发送翻译请求。为了提高效率并遵守翻译API的调用限制如每秒请求数、单次文本长度它内置了一个智能的缓存与批处理系统。缓存查询首先检查本地是否已经存在该原文的翻译记录。这些记录存储在Translation文件夹下的_AutoGeneratedTranslations.txt等文件中。如果命中缓存则直接使用速度极快且不消耗网络资源。批处理与发送对于未缓存的文本XUA会根据配置进行批处理EnableBatchingTrue将多个短句合并为一个请求发送以减少API调用次数。然后通过配置的翻译终端Endpoint如GoogleTranslate、BaiduTranslate等将文本发送出去。文本替换与渲染Replacement Rendering收到翻译结果后XUA需要将翻译后的文本“塞回”游戏原本的文本组件中。这里涉及到一些棘手问题字体支持如果翻译成中文、韩文等非拉丁字符游戏自带的字体可能不包含这些字形导致显示为方框□□□。XUA提供了OverrideFontTextMeshPro或FallbackFontTextMeshPro配置项允许你指定一个包含目标语言字形的字体文件通常是.ttf或.assetbundle格式来覆盖或作为后备字体。UI自适应翻译后的文本长度很可能与原文不同。一个英文单词翻译成中文可能变长导致文本超出UI框。XUA的EnableUIResizing选项可以尝试自动调整文本框的溢出模式或者你可以通过编写resizer.txt规则文件来手动微调特定UI元素的字体大小和布局。资源重定向Resource Redirection - 高级功能对于硬编码在游戏资源文件如.assets、.unity3d资源包里的文本和图片单纯的运行时钩取可能无效。XUA集成了独立的Resource Redirector模块。这个模块能拦截Unity加载资源Resources.Load,AssetBundle.LoadAsset的调用让你可以将修改后的资源文件如翻译好的文本文件、替换后的图片放在指定目录游戏加载时就会优先使用你修改后的版本实现更彻底的本地化。2.2 配置文件掌控一切的中枢XUA的所有行为都由一个名为Config.ini的配置文件控制。这个文件结构清晰但选项繁多。理解几个关键区块是高效配置的前提[General]区块这是全局设置。Language决定目标语言如zh-CNEndpoint选择翻译服务如GoogleTranslate。MaxCharactersPerTranslation最大字符数务必设置为400或更低这是为了遵守多数免费翻译API的服务条款避免因单次请求文本过长而被封禁。如果你要分享你的配置这一点尤其重要。[Behaviour]区块控制插件核心行为。EnableTranslationCacheTrue是必须的开启本地缓存。EnableBatching建议开启以提升效率。EnableUIResizing根据游戏UI情况决定是否开启。[Texture]区块管理图片翻译如替换游戏内的日文图片为中文。EnableTextureTranslationFalse默认关闭因为开启后需要手动准备替换图片且对性能有影响。TextureHashGenerationStrategy推荐使用FromImageName以资源名生成哈希性能最好。各翻译服务区块如[Google]、[Baidu]等用于配置API密钥或自定义服务地址。实操心得初次配置时不要试图一次性理解所有选项。我的建议是先确保[General]和[Behaviour]的基础项正确让文字翻译跑起来。图片替换、高级正则表达式、UI重定向这些功能等基本流程通了再按需深入研究。配置文件是纯文本修改后保存游戏内按Alt0打开插件控制台选择“Reload Config”即可生效无需重启游戏这为调试提供了极大便利。3. 从零开始完整部署与配置实战理论懂了我们来动手。假设我们要为一款名为MyUnityGame.exe的日文游戏实现在线英译中。3.1 环境准备与插件安装XUA本身不直接运行它需要依赖一个插件框架来注入到Unity游戏中。最主流、兼容性最好的框架是BepInEx。获取BepInEx前往BepInEx的GitHub发布页下载对应你游戏位数通常是x64的版本。通常是一个名为BepInEx_x64_5.4.xx.x.zip的压缩包。安装BepInEx将压缩包内所有文件解压到你的游戏根目录即MyUnityGame.exe所在的文件夹。运行一次游戏如果安装成功根目录下会生成BepInEx文件夹里面包含plugins、config等子目录。安装XUnity.AutoTranslator前往XUA的GitHub发布页下载名为XUnity.AutoTranslator-BepInEx-5.x-{版本号}.zip的包确保匹配BepInEx 5.x版本。解压后你会看到两个核心文件夹plugins和translations。部署文件将解压得到的plugins文件夹内的XUnity.AutoTranslator文件夹整个复制到游戏目录的BepInEx\plugins\下。同样将translations文件夹复制到游戏根目录。最终目录结构应类似MyUnityGame/ ├── MyUnityGame.exe ├── BepInEx/ │ ├── core/ │ ├── plugins/ │ │ └── XUnity.AutoTranslator/ │ │ ├── XUnity.AutoTranslator.dll │ │ └── ... │ └── config/ ├── translations/ │ ├── en/ │ └── ... └── 其他游戏文件3.2 首次运行与基础配置启动游戏运行MyUnityGame.exe。如果一切正常游戏启动时在命令行窗口或BepInEx的日志文件BepInEx/LogOutput.log中会看到XUA的加载信息。进入游戏主界面后按Alt 0数字零应该能呼出XUA的配置窗口。验证与初始配置首次呼出配置窗口翻译服务Endpoint可能是空的或为None。我们需要先进行基础配置。退出游戏找到BepInEx/config/AutoTranslatorConfig.ini文件用记事本等文本编辑器打开。关键配置修改找到并修改以下关键项[General] ; 目标语言简体中文 Languagezh-CN ; 翻译服务这里以谷歌免费版为例 EndpointGoogleTranslate ; 源语言自动检测 SourceLanguage ; 单次翻译最大字符数务必设为400或以下 MaxCharactersPerTranslation400 [Behaviour] ; 启用翻译缓存至关重要 EnableTranslationCacheTrue ; 启用批处理以提升效率 EnableBatchingTrue ; 输出自动生成的翻译文件 OutputFileTranslation\{Lang}\Text\_AutoGeneratedTranslations.txt选择与配置翻译服务XUA支持多种后端。对于免费用户GoogleTranslate谷歌网页版翻译和BaiduTranslate需要申请免费AppID/密钥是常用选择。以谷歌为例通常无需额外配置即可使用但可能受网络环境影响。如果翻译失败可以尝试在[Google]区块下配置ServiceUrl指向一个可用的代理地址注意此处仅作技术原理说明用户需自行确保其网络请求的合法合规性。测试翻译保存Config.ini重新启动游戏。进入一个有大量文本的场景如对话界面。XUA会在后台工作。首次遇到的文本会稍慢需要联网翻译翻译成功后会被记录到Translation\zh-CN\Text\_AutoGeneratedTranslations.txt。之后再次遇到相同文本则会瞬间从缓存加载。你可以按Alt T快速切换翻译的开启/关闭对比效果。3.3 字体问题解决告别“口口口”翻译中文后最常遇到的就是字体显示为方框。这是因为游戏原字体不包含中文字形库。定位字体问题首先确认是字体缺失。如果只是部分生僻字显示为方框可能是字体覆盖不全如果全部中文都是方框那就是字体不支持。获取中文字体你需要一个包含中文的.ttf字体文件例如“思源黑体”、“方正准圆”等。但XUA特别是处理TextMeshPro时通常需要的是Unity的字体Asset文件.asset或打包好的AssetBundle.assets。使用预编译字体包推荐给新手在XUA的GitHub发布页有时会附带TMP_Font_AssetBundles.zip这样的字体资源包。下载后将其中的.assets文件例如SourceHanSansSC-Normal.assets放入游戏根目录。配置字体覆盖在Config.ini中配置[Behaviour] ; 对于TextMeshPro文本指定备用字体资源包的文件名不含.assets后缀 FallbackFontTextMeshProSourceHanSansSC-Normal ; 或者直接覆盖所有字体如果上述无效可尝试 ; OverrideFontTextMeshProSourceHanSansSC-NormalFallbackFontTextMeshPro是更安全的选择它只在不支持的字形时使用备用字体。OverrideFontTextMeshPro则会强制替换所有字体。自定义字体打包高级如果预编译包不适用你需要使用与游戏相同版本的Unity Editor将.ttf字体导入创建TextMeshPro Font Asset然后将其打包成AssetBundle。这个过程需要一定的Unity操作知识。踩坑记录字体问题是新手最大的拦路虎。我遇到过无数次配置了字体但无效的情况原因包括1) 字体文件放错了位置应放在游戏根目录或BepInEx\plugins\XUnity.AutoTranslator下2) 字体Asset的生成版本与游戏使用的TextMeshPro版本不兼容3) 游戏使用的是UGUI的Text组件而非TextMeshPro这时需要用OverrideFont配置但需要字体是Unity可识别的.ttf且游戏打包时包含了动态字体渲染支持。最稳妥的方法是先确认游戏用的是UGUI还是TextMeshPro可以通过Unity Explorer等运行时调试工具查看再对症下药。4. 高级功能与深度定制当基础翻译流程稳定后你可以利用XUA的强大功能进行深度定制让翻译体验更上一层楼。4.1 手动翻译与词条管理打造精品汉化自动翻译的准确率毕竟有限尤其是专有名词、角色名、技能名等。XUA允许你进行完全的手动翻译覆盖。定位自动生成文件所有由插件自动翻译并缓存的条目都保存在Translation\zh-CN\Text\_AutoGeneratedTranslations.txt中。这个文件格式很简单每行是原文译文。创建手动翻译文件你不应该直接大规模修改_AutoGeneratedTranslations.txt因为插件运行时可能会重写它。正确做法是新建一个.txt文件例如Manual_Translations.txt放在Translation\zh-CN\Text\目录下。将你需要修正的条目从自动生成文件里复制过来修改等号右边的译文。优先级系统XUA加载翻译文件时_AutoGeneratedTranslations.txt优先级最低。其他任何你创建的.txt文件中的条目如果原文相同都会覆盖自动生成的翻译。你可以按功能、章节创建多个文件便于管理。使用正则表达式Regex对于有规律的文本比如道具名“生命药水 x 5”可以用正则表达式批量处理。在翻译文件中写入r:^(.?) x ([0-9])$$1 × $2这会将“生命药水 x 5”翻译为“生命药水 × 5”仅修改了乘号。正则表达式功能强大但需谨慎使用不当的正则可能导致性能下降或错误匹配。4.2 图片翻译纹理替换本地化UI与贴图对于游戏内嵌在图片里的文字如菜单按钮、图标文字需要替换图片本身。启用图片翻译在Config.ini中设置[Texture] EnableTextureTranslationTrue TextureDirectoryTranslation\Texture EnableTextureDumpingTrue ; 首次使用时开启用于导出游戏内图片 EnableTextureScanOnSceneLoadTrue ; 帮助发现更多可替换纹理 TextureHashGenerationStrategyFromImageName ; 性能最佳导出游戏图片用此配置启动游戏遍历各个场景。XUA会将游戏加载的纹理图片自动导出到Translation\Texture文件夹文件名类似button_ok [ABCD1234-EF567890].png。哈希值[ABCD1234-EF567890]用于唯一标识该纹理。编辑与替换用图像处理软件如Photoshop, GIMP打开导出的图片将上面的外文修改为目标语言保持图片尺寸、格式和文件名包括哈希值完全不变保存。关闭导出享受成果编辑完成后将EnableTextureDumping设为False再次启动游戏。XUA会从TextureDirectory加载你修改后的图片替换游戏内的原始纹理。重要警告EnableTextureDumping、EnableTextureToggling、LoadUnmodifiedTextures这几个选项会显著影响性能且导出的图片可能包含游戏版权内容。绝对不要在公开发布你的翻译补丁时开启这些选项。只在自己本地编辑时使用。4.3 翻译作用域与场景控制有些翻译可能只在特定场景或特定游戏版本中才需要。XUA提供了精细的作用域控制。场景Level作用域在翻译文件非_AutoGeneratedTranslations.txt中可以使用指令限制翻译生效的场景。#set level 5,10,15 欢迎来到商店Welcome to the Shop! #unset level上面这段翻译只会在场景ID为5、10、15时生效。场景ID可以通过游戏内按CtrlAltNum7小键盘7查看。可执行文件Exe作用域如果你为同一个游戏的多个版本如Steam版、DMM版制作翻译可以用{GameExeName}变量和#set exe指令来区分配置和翻译文件避免冲突。5. 疑难杂症排查与性能优化即使配置正确在实际使用中也可能遇到各种问题。以下是我积累的一些常见问题解决方案。5.1 翻译不生效或部分文本未被捕获检查插件是否加载查看BepInEx/LogOutput.log搜索“XUnity.AutoTranslator”确认插件初始化成功没有报错。检查热键默认Alt0打开控制台AltT切换翻译开关。确保没有其他软件占用这些热键。文本组件类型XUA主要支持UGUI Text和TextMeshPro (TMP)。一些非常古老或自定义的文本渲染方式可能无法钩取。可以尝试开启[Behaviour]下的EnableTextPathLoggingTrue然后在日志中查看哪些文本路径被捕获了。IL2CPP问题对于使用IL2CPP后端编译的游戏多见于移动端移植或较新Unity版本XUA的钩取能力可能受限。可以尝试使用官方提供的XUnity.AutoTranslator.IL2CPP.BruteForceFix辅助插件来增强兼容性。游戏反调试/反修改少数游戏可能有反修改机制会干扰插件运行。这类情况处理起来比较复杂可能需要寻找特定的游戏社区寻求帮助。5.2 翻译后游戏功能异常或崩溃启用兼容模式有些游戏逻辑会检查屏幕上显示的文本内容。翻译后文本改变可能导致逻辑错误。在Config.ini中设置TextGetterCompatibilityModeTrue这个模式会尝试“欺骗”游戏让它认为显示的仍是原始文本。关闭UI重排如果EnableUIResizing或ForceUIResizing引起布局混乱或崩溃尝试关闭它们。检查翻译缓存文件有时自动生成的翻译文件_AutoGeneratedTranslations.txt可能包含错误或异常字符导致解析失败。可以尝试临时重命名或删除这个文件游戏会重新生成看问题是否解决。5.3 性能优化与网络问题最大化利用缓存确保EnableTranslationCacheTrue。首次游玩后大部分重复文本都已缓存后续游戏体验会非常流畅。你可以将游玩一段时间后生成的_AutoGeneratedTranslations.txt文件作为翻译补丁的一部分分享其他人安装后即可获得大量预翻译内容极大减少在线翻译请求。调整批处理大小EnableBatchingTrue通常能提升性能。但如果遇到翻译延迟可以尝试关闭看是否是批处理导致响应变慢。管理翻译端点免费的在线翻译API通常有速率限制。如果频繁遇到翻译失败超时、返回空可能是触发了限制。可以尝试切换不同的翻译服务如从GoogleTranslate换到BaiduTranslate。在配置中增加[所选端点]区块下的MinDelay最小延迟和MaxDelay最大延迟参数降低请求频率。对于完全离线环境可以研究使用离线翻译库如Argos Translate并为其编写自定义的ITranslateEndpoint实现但这需要较强的开发能力。5.4 配置问题速查表问题现象可能原因解决方案按Alt0无反应插件未加载/热键冲突检查BepInEx日志在Config.ini中修改[General]下的Key设置热键翻译全是方框□□□字体缺失配置FallbackFontTextMeshPro或OverrideFontTextMeshPro并确保字体文件放置正确翻译延迟非常高网络问题/API限制检查网络尝试更换翻译端点增加MinDelay/MaxDelay游戏内部分按钮/菜单无响应UI重排导致点击区域错位关闭EnableUIResizing和ForceUIResizing自动翻译文件_AutoGeneratedTranslations.txt为空或不更新输出路径错误/权限问题检查OutputFile配置路径确保游戏有写入该目录的权限图片替换无效纹理哈希策略不匹配/图片未正确编辑确认TextureHashGenerationStrategy设置确保替换的图片文件名哈希部分与原文件完全一致折腾XUnity.AutoTranslator的过程其实是一个深入理解Unity游戏运行机制和Mod制作原理的绝佳途径。从最初只会套用现成配置到后来能根据游戏特性调整正则表达式、手动修复UI布局、甚至为特定游戏编写资源重定向规则每一次问题的解决都带来巨大的成就感。它不仅仅是一个翻译工具更是一个强大的游戏本地化开发框架。记住耐心和仔细阅读官方文档尽管它很庞大是成功的关键。遇到问题时先去GitHub的Issues页面搜索你遇到的问题很可能已经有前人踩过坑并提供了解决方案。现在去享受那些曾经因语言障碍而被你束之高阁的游戏吧。