
1. 项目概述打破语言壁垒的Unity游戏翻译神器如果你是一名热爱独立游戏、视觉小说或者各种小众Unity游戏的玩家肯定遇到过这样的烦恼一款游戏玩法精妙、美术风格独特但偏偏没有中文甚至没有英文只有日文或韩文。硬啃生肉不仅影响剧情理解更让游戏体验大打折扣。手动替换游戏文件对于大多数加密或资源打包的游戏来说这几乎是一项不可能完成的任务。而今天要深入探讨的XUnity AutoTranslator就是为解决这一痛点而生的终极工具。简单来说XUnity AutoTranslator下文简称XUA是一个功能极其强大的Unity游戏实时翻译插件。它的核心原理并非暴力修改游戏原始文件而是通过运行时“钩子”Hook技术拦截游戏引擎渲染到屏幕上的每一段文本将其发送到你指定的翻译服务如谷歌翻译、百度翻译、DeepL等获取翻译结果后再动态替换回游戏界面。这意味着你几乎可以“无痛”地将任何基于Unity引擎开发的游戏实时翻译成你的母语无论是中文、英文还是其他任何主流语言。我接触这个工具已经有好几年了从最早的简单文本替换到如今支持图片资源替换、正则表达式处理、字体覆盖等高级功能它已经发展成了一个相当成熟的游戏本地化框架。它不仅适合普通玩家“开箱即用”其高度可配置的架构和开放的API也吸引了大量Mod作者和社区翻译组成为许多游戏非官方汉化补丁的底层技术支持。接下来我将从一个资深使用者和研究者的角度为你彻底拆解这个工具从基础安装配置到高级调优和开发扩展让你真正掌握这把打开全球游戏宝库的钥匙。2. 核心架构与工作原理深度解析要玩转XUnity AutoTranslator不能只停留在“怎么用”的层面理解其内部运作机制才能在遇到问题时游刃有余。它的设计非常巧妙可以看作是一个运行在游戏进程内的“中间人”。2.1 运行时文本拦截与替换机制XUA的核心是“钩子”技术。它通过注入代码在游戏调用Unity的UI文本显示函数如TextMeshPro的text属性赋值、UGUI Text组件的更新时进行拦截。当游戏试图在屏幕上显示一段文本时XUA会先“截获”这段原始文本。拦截之后它会进行一系列预处理检查这段文本是否在忽略列表里比如一些UI控件名称、代码标识符判断文本长度是否超过限制处理文本中的空白字符如换行符、首尾空格等。处理完毕后它会查询一个内部的翻译词典。这个词典有两个来源一是你事先准备好的手动翻译文件.txt格式二是之前通过在线翻译服务获取并缓存下来的结果。如果词典中有匹配项则直接使用翻译结果。如果没有且你配置了在线翻译服务它就会将这段文本发送到对应的翻译API获取翻译后一方面显示在游戏中另一方面将“原文-译文”这对映射关系保存到本地的_AutoGeneratedTranslations.txt文件中形成缓存下次遇到相同文本就无需再次请求网络。注意这个缓存机制是XUA高效运行的关键。首次运行一个游戏时由于需要逐句翻译可能会感觉卡顿或翻译延迟。但玩过一段时间后大部分常见文本都已缓存游戏体验会变得非常流畅。因此妥善管理和备份这个自动生成的翻译文件是积累个人翻译库的重要一步。2.2 插件加载与游戏兼容性XUA本身是一个纯粹的.NET库它需要依赖一个“插件加载器”才能被注入到Unity游戏中。目前主流支持三种加载器BepInEx这是目前最流行、兼容性最好的Unity游戏Mod框架尤其常见于Steam上的独立游戏。XUA为BepInEx 5.x提供了开箱即用的支持。IPA主要用于一些特定的游戏平台或类型的游戏。ReiPatcher一种较老的注入工具现在已不常用。对于玩家而言绝大多数情况你遇到的是BepInEx环境。你需要做的就是把XUA的插件文件通常是XUnity.AutoTranslator和XUnity.ResourceRedirector两个文件夹放到游戏的BepInEx\plugins目录下。游戏启动时BepInEx会加载所有插件XUA便开始工作。这里有一个关键点游戏是否使用IL2CPP编译。Unity游戏有两种主要的脚本后端Mono和IL2CPP。IL2CPP是Unity推出的将C#代码转换为C再进行编译的技术能提升性能和安全性但也使得传统的代码注入Hook变得困难。XUA对IL2CPP的支持是“部分”的。在IL2CPP环境下某些文本组件的更新可能无法被即时捕获需要手动刷新例如切换场景、按特定热键才能显示翻译。官方提供了一个AutoTranslator.IL2CPP.BruteForceFix的辅助插件来尝试缓解此问题但并非万能。在选择游戏时可以优先考虑使用Mono后端的游戏以获得最完美的翻译体验。2.3 资源重定向器超越文本的翻译除了文本游戏中还有大量图片资源包含文字比如菜单图标、技能说明图、物品图标等。XUA的兄弟模块——Resource Redirector就是为了解决这个问题而存在的。Resource Redirector是一个独立的资源重定向库。它的能力是在游戏通过Unity的Resources.Load或AssetBundle.LoadAsset等API加载资源如图片、文本资产、音频等时将加载请求“重定向”到你指定的外部文件。对于翻译来说最常用的就是TextAssetRedirector重定向文本资产如.json、.txt配置文件和纹理Texture替换功能。纹理替换功能允许你将游戏内的图片资源如带有文字的UI贴图导出用图像处理软件如Photoshop修改其中的文字为你的语言再放回指定目录。XUA在游戏加载原图片时会自动替换成你修改后的版本。这实现了真正意义上的“全界面本地化”。实操心得纹理替换功能非常强大但启用EnableTextureDumping导出纹理和EnableTextureScanOnSceneLoad场景加载时扫描纹理会对游戏性能产生明显影响尤其是在加载场景时。因此我建议仅在需要提取图片进行翻译时开启这些选项完成图片修改并放入Texture目录后就关闭导出和扫描只保留EnableTextureTranslationTrue。这样既能享受图片翻译的便利又不会对游戏流畅度造成太大负担。3. 从零开始完整安装与基础配置实战理论讲完我们进入实战环节。假设我们要为一款名为MyUnityGame.exe的日文游戏安装汉化补丁使用XUA。3.1 环境准备与插件部署首先你需要确定游戏使用的Mod框架。以最常见的BepInEx 5.x为例安装BepInEx从BepInEx的GitHub发布页下载对应游戏架构x86或x64的版本。通常是一个压缩包将其解压到游戏根目录即MyUnityGame.exe所在的文件夹。运行一次游戏BepInEx会自动完成初始化在游戏目录下生成BepInEx文件夹及其子目录。安装XUnity AutoTranslator从XUA的GitHub发布页下载XUnity.AutoTranslator-BepInEx-{VERSION}.zip。解压后你会看到BepInEx文件夹。将其中的plugins文件夹合并复制粘贴到游戏根目录下的BepInEx\plugins里。最终目录结构应类似于GameRoot/ ├── MyUnityGame.exe ├── BepInEx/ │ ├── core/ │ ├── plugins/ │ │ └── XUnity.AutoTranslator/ │ │ ├── AutoTranslatorConfig.ini -- 核心配置文件 │ │ ├── Translation/ │ │ └── ... (其他DLL文件) │ └── ... (其他BepInEx文件)首次运行与生成配置启动游戏。如果安装正确游戏启动时在后台XUA已经开始工作。它会自动在BepInEx\plugins\XUnity.AutoTranslator目录下生成一个名为AutoTranslatorConfig.ini的配置文件并在Translation文件夹下创建对应语言如zh-CN的目录和_AutoGeneratedTranslations.txt文件。3.2 核心配置文件详解与调优AutoTranslatorConfig.ini是XUA的大脑。用记事本或任何文本编辑器打开它我们会看到大量配置项。别担心我们只需要关注几个关键部分。3.2.1 [General] 基础设置[General] Languagezh-CN SourceLanguageja EndpointGoogleTranslateLanguage目标语言即你想翻译成的语言。填zh-CN简体中文。SourceLanguage源语言即游戏文本的原始语言。大多数日系游戏是ja日语英文游戏是en。正确设置源语言能极大提升在线翻译的准确度。Endpoint在线翻译服务。GoogleTranslate是默认的免费服务。其他选项如BaiduTranslate百度翻译、DeepL等需要额外配置API密钥。3.2.2 [Behaviour] 行为控制[Behaviour] EnableTranslationTrue MaxCharactersPerTranslation400 EnableBatchingTrue EnableUIResizingTrueEnableTranslation总开关。MaxCharactersPerTranslation单次发送翻译的最大字符数。切勿超过400这是为了避免滥用翻译服务。如果你要分享你的配置务必检查此项。EnableBatching启用批处理。将多个短句合并为一个请求发送能显著减少网络请求次数提升翻译速度和稳定性。EnableUIResizing启用UI自动重设大小。中文等字符宽度较大的语言翻译后文本容易超出UI框。开启此选项XUA会尝试自动调整文本框大小以适应内容。3.2.3 在线翻译服务配置如果你想使用更准确的付费服务如DeepL需要配置API密钥。找到配置文件中对应的段落[DeepLLegitimate] ApiKeyyour_deepl_api_key_here FreeFalse然后在[General]部分将Endpoint改为DeepLLegitimate。百度翻译的配置类似需要BaiduAppId和BaiduAppSecret。重要提示绝对不要在公开发布的翻译补丁中携带他人的或未授权的API密钥。这会导致密钥被滥用而失效。分发补丁时应将Endpoint设为空或GoogleTranslate让用户自行配置。3.2.4 热键配置游戏内你可以通过热键与XUA交互ALT0打开翻译端点选择窗口可以快速切换或关闭在线翻译。ALTT全局切换翻译功能的开启/关闭。ALTR强制重新加载所有翻译文件当你手动修改了txt文件后按此键立即生效。CTRLALTNP7在调试信息中显示当前场景ID用于高级的翻译范围限定。3.3 字体问题终极解决方案翻译中文时游戏原版字体很可能不包含中文字形导致翻译后显示为方框“□□□”。XUA提供了多种字体覆盖方案。方案一使用内置的TextMeshPro回退字体推荐对于使用TextMeshProTMP的现代Unity游戏这是最优雅的方案。在配置文件中找到[Behaviour] FallbackFontTextMeshProFonts Materials/LiberationSans SDFLiberationSans SDF是TMP自带的资源通常包含基本的中文字形。如果无效可以尝试Fonts Materials/ARIAL SDF。方案二加载系统字体如果游戏使用的是较新的TMP版本3.2.0可以尝试直接指定系统字体名[Behaviour] OverrideFontTextMeshProMicrosoft YaHei UI这会让XUA尝试加载Windows系统自带的“微软雅黑UI”字体。此方法不一定对所有游戏有效。方案三使用自定义字体AssetBundle最可靠这是最通用但稍复杂的方法。你需要一个包含中文字体的Unity AssetBundle文件。从社区如sorrowmoil-MoeFont-for-XUnity.AutoTranslator项目下载别人制作好的中文字体AssetBundle通常是.font或.bundle文件。将这个文件放入游戏根目录或BepInEx\plugins\XUnity.AutoTranslator目录下。在配置中指定文件名不含路径[Behaviour] OverrideFontTextMeshProMyChineseFont.bundle如果游戏使用UGUI则配置OverrideFont项。我个人的经验是方案一能解决70%的问题。如果不行就去游戏社区或XUA的GitHub Release页面寻找现成的字体AssetBundle。自己制作字体AssetBundle需要Unity Editor和一定的技术知识对于普通玩家门槛较高。4. 高级技巧手动翻译、正则表达式与性能优化当自动翻译不尽如人意或者你想贡献一份高质量的翻译补丁时就需要深入手动翻译和高级功能了。4.1 手动翻译文件的组织与管理XUA会读取Translation\{Lang}\Text目录下所有的.txt文件。_AutoGeneratedTranslations.txt是自动生成的缓存优先级最低。你可以创建自己的翻译文件例如MainStory.txt、UI.txt优先级高于自动生成文件。翻译文件的格式非常简单每行一条原文和译文用等号连接こんにちは你好 新しいゲームを開始します开始新游戏更强大的是它支持正则表达式和参数化。标准正则以r:开头用于匹配模式化的文本。r:^獲得金([0-9])G$获得金钱$1G这会把“獲得金100G”翻译为“获得金钱100G”并保留其中的数字。拆分器正则以sr:开头用于拆分组合文本再分别翻译。sr:^([0-9]{2}) ([\S\s])$$1 $2这会把“01 ポーション”拆分成“01”和“ポーション”然后分别查找翻译再组合成“01 药水”。文件组织建议不要把所有翻译都堆在一个文件里。按功能模块分文件存放例如Items.txt、Skills.txt、Dialogue_Chapter1.txt。这样不仅易于维护也方便多人协作和后续更新。4.2 翻译范围限定与场景控制有些翻译可能只在特定场景或特定游戏版本中有效。XUA提供了强大的范围限定功能。 首先在配置中启用[Behaviour] EnableTranslationScopingTrue。 然后在你的翻译文件中可以使用指令#set level 5 魔王の間魔王之间 #unset level 5 #set exe Game_v1.0.exe タイトル画面标题画面 #unset exe Game_v1.0.exe#set level 5意味着“魔王の間魔王之间”这条翻译只在场景ID为5时生效。#set exe则限定翻译只在特定的游戏执行文件下生效。这对于处理游戏不同版本间的文本差异非常有用。如何获取场景ID在游戏中按CTRLALTNP7XUA会在日志或屏幕上输出当前场景信息。4.3 性能调优与常见问题排查XUA在后台默默工作但如果配置不当可能会引起游戏卡顿、翻译延迟甚至崩溃。4.3.1 减少翻译请求与缓存利用善用_AutoGeneratedTranslations.txt首次游戏后这个文件里已经缓存了大量翻译。你可以把它当作基础进行人工校对和修正然后重命名为Manual_Base.txt或其他名字放在Text目录下。下次游戏时这些校对过的翻译会优先使用无需再请求在线翻译。启用批处理确保EnableBatchingTrue。这能将几十个短句打包成一个请求效率提升巨大。合理设置MaxCharactersPerTranslation保持默认的400。过长的文本如一整本书的内容可能被游戏以特殊方式处理翻译效果也不好可以考虑忽略。4.3.2 解决翻译导致的游戏逻辑错误有些游戏会检查屏幕上显示的文本来触发事件。如果文本被翻译了游戏可能因为找不到预期的关键词而卡住。这时需要开启兼容模式[Behaviour] TextGetterCompatibilityModeTrue这个模式会“欺骗”游戏让它以为显示的仍然是原始文本从而绕过逻辑检查。4.3.3 常见问题速查表问题现象可能原因解决方案游戏启动崩溃或黑屏1. BepInEx版本与游戏不兼容。2. XUA插件版本与游戏或BepInEx冲突。3. 游戏为IL2CPP且未使用BruteForceFix插件。1. 尝试更换BepInEx版本如从x64换到x86。2. 使用XUA发布页提供的与BepInEx 5兼容的版本。3. 尝试使用AutoTranslator.IL2CPP.BruteForceFix插件。翻译不显示或显示方框1. 字体缺失。2. 翻译服务未响应或配置错误。3. 文本未被正确钩住常见于IL2CPP。1. 配置FallbackFontTextMeshPro或提供字体AssetBundle。2. 按ALT0检查翻译端点是否启用或切换为GoogleTranslate测试。3. 尝试在游戏中按ALTR强制重载或切换场景。游戏运行缓慢频繁卡顿1. 启用了纹理导出(EnableTextureDumping)。2. 在线翻译延迟高或失败重试。3. 正则表达式过于复杂或范围太广。1. 完成图片提取后关闭纹理导出和场景扫描。2. 使用批处理(EnableBatching)或切换到更稳定的翻译服务。3. 检查翻译文件避免使用全局性的、低效的正则表达式。部分UI如Mod界面被错误翻译其他Mod的UI也被XUA捕获翻译了。1. 如果该Mod基于GameObject在其包含文本的GameObject名称中加入XUAIGNORE。2. 或在配置中通过BlacklistedIMGUIPlugins添加Mod的类名进行屏蔽。_AutoGeneratedTranslations.txt文件过大游戏生成了大量无意义或重复的文本缓存。定期清理该文件删除那些明显是代码、变量名或乱码的行。可以开启OutputUntranslatableTextFalse来减少垃圾文本输出注意分享前务必关闭此选项并清理文件。4.3.4 调试与日志当遇到疑难杂症时启用日志是必须的。在配置文件中设置[Debug] EnableConsoleTrue EnableLogTrue重启游戏XUA会将详细的运行信息输出到BepInEx的控制台窗口或日志文件BepInEx\LogOutput.log。通过日志你可以看到它拦截了哪些文本、发送了什么翻译请求、是否发生了错误这是排查问题的第一手资料。5. 面向开发者和高级用户自定义翻译器与资源重定向XUA不仅仅是一个工具更是一个平台。它提供了完整的API允许开发者为其编写新的翻译服务接口或者利用其资源重定向能力做更多事情。5.1 实现一个自定义翻译端点假设你想接入一个官方未支持的翻译API例如某个私有翻译服务。你需要创建一个C#类库项目。创建项目使用Visual Studio新建一个.NET Framework 3.5或.NET Standard目标改为net35的类库项目。添加引用引用从XUA开发者包中获取的XUnity.AutoTranslator.Plugin.Core.dll。实现接口创建一个类实现ITranslateEndpoint接口或继承自HttpEndpoint等辅助类。using XUnity.AutoTranslator.Plugin.Core; using XUnity.AutoTranslator.Plugin.Core.Endpoints; using XUnity.AutoTranslator.Plugin.Core.Endpoints.Http; using XUnity.AutoTranslator.Plugin.Core.Utilities; public class MyCustomTranslator : HttpEndpoint { private string _apiKey; public override string Id MyCustomTranslate; // 配置中使用的ID public override string FriendlyName 我的自定义翻译; public override void Initialize(IInitializationContext context) { // 从配置文件读取API密钥 _apiKey context.GetOrCreateSetting(MyCustom, ApiKey, ); if (string.IsNullOrEmpty(_apiKey)) throw new Exception(请在配置文件中设置MyCustom.ApiKey); // 为该域名禁用SSL证书检查如需要 context.DisableCertificateChecksFor(api.mytranslation.com); } public override void OnCreateRequest(IHttpRequestCreationContext context) { // 构建HTTP请求 var url $https://api.mytranslation.com/translate?key{_apiKey}text{WwwHelper.EscapeUrl(context.UntranslatedText)}from{context.SourceLanguage}to{context.DestinationLanguage}; var request new XUnityWebRequest(url); request.Headers[HttpRequestHeader.Accept] application/json; context.Complete(request); } public override void OnExtractTranslation(IHttpTranslationExtractionContext context) { // 解析API返回的JSON提取翻译文本 var json context.Response.Data; // 这里需要根据你的API返回格式进行解析 var translation ParseJsonResponse(json); if (string.IsNullOrEmpty(translation)) context.Fail(无法从响应中提取翻译。); else context.Complete(translation); } private string ParseJsonResponse(string json) { /* 你的解析逻辑 */ } }编译与部署将编译生成的DLL文件放入游戏的BepInEx\plugins\XUnity.AutoTranslator\Translators目录。在配置文件中将Endpoint设置为MyCustomTranslate并添加[MyCustom]段设置ApiKey。5.2 利用Resource Redirector进行深度Mod开发Resource Redirector的API允许你在资源加载的各个阶段进行拦截和修改这远超翻译的范畴。例如你可以修改游戏贴图不仅仅是翻译可以替换任何模型、UI的纹理。替换音频文件将游戏音效或BGM替换为自定义版本。动态修改游戏数据拦截并修改加载的ScriptableObject或文本配置文件实现游戏平衡性调整或添加新内容。一个简单的例子拦截并替换所有名为“HealthPotion”的纹理public class MyTextureModPlugin : BaseUnityPlugin { void Awake() { ResourceRedirection.RegisterAssetLoadedHook(HookBehaviour.OneCallbackPerResourceLoaded, 100, OnAssetLoaded); } private void OnAssetLoaded(AssetLoadedContext context) { if (context.Parameters.LoadType AssetLoadType.LoadNamed context.Parameters.Name ! null context.Parameters.Name.Contains(HealthPotion) context.Asset is Texture2D originalTexture) { // 加载你自己的贴图 var myTexture LoadMyCustomTexture(); if (myTexture ! null) { context.Asset myTexture; context.Complete(); } } } }这需要你将此插件编译为DLL并放入BepInEx的plugins目录。通过这种方式你可以实现极其强大的游戏修改功能而XUA的资源重定向框架为你处理了所有底层的兼容性和注入问题。6. 社区协作与翻译补丁分发当你完成了一个游戏的翻译润色或者制作了一个精美的字体包你可能会想分享给其他玩家。这里有一些最佳实践。1. 清理你的补丁包确保AutoTranslatorConfig.ini中没有包含任何个人API密钥。将Endpoint设为空或GoogleTranslate。检查并关闭所有调试选项EnableLogFalse,EnableConsoleFalse。绝对不要开启EnableTextureDumping、LoadUnmodifiedTextures、DetectDuplicateTextureNames或OutputUntranslatableText。这些选项会产生大量垃圾文件或导致性能问题。清理_AutoGeneratedTranslations.txt移除所有无意义的、错误的或重复的翻译条目。一个干净、精炼的翻译文件是高质量补丁的标志。2. 结构化你的翻译文件 不要只提供一个巨大的_AutoGeneratedTranslations.txt。按章节、功能或文件类型组织翻译。例如Translation/zh-CN/Text/ ├── 00_System_UI.txt ├── 01_Items_Equipment.txt ├── 02_Skills_Abilities.txt ├── 03_Dialogue_Chapter1.txt ├── 04_Dialogue_Chapter2.txt └── (可选) _AutoGeneratedTranslations_Backup.txt在发布说明中告诉用户他们可以自由编辑这些文件来改进翻译。3. 包含字体AssetBundle 如果游戏需要中文字体将制作好的字体AssetBundle文件一并打包。在配置文件中预先配置好OverrideFontTextMeshPro的路径。为用户提供“开箱即用”的体验。4. 提供清晰的安装说明 用最简明的步骤说明下载BepInEx - 解压到游戏根目录 - 运行一次游戏 - 将汉化补丁的BepInEx文件夹合并进去。对于常见问题如字体显示、翻译不生效提供快速排查指南。5. 维护与更新 游戏可能会更新导致文本ID或内存地址变化。关注游戏社区当有玩家反馈翻译失效时及时检查并更新翻译文件或插件的兼容性版本。通过XUnity AutoTranslator语言不再是享受全球优秀Unity游戏的障碍。它从一个小巧的翻译工具成长为一个功能丰富的实时本地化与资源修改框架。无论是普通玩家寻求即时的游戏内翻译还是硬核玩家追求完美的界面汉化亦或是Mod开发者寻找强大的资源拦截工具XUA都提供了一个坚实而灵活的解决方案。掌握它你就掌握了开启无数游戏世界大门的万能钥匙。