Unity游戏实时翻译插件XUnity Auto Translator深度解析与实战指南

发布时间:2026/7/11 4:32:27
Unity游戏实时翻译插件XUnity Auto Translator深度解析与实战指南 1. 项目概述为什么我们需要XUnity Auto Translator如果你是一名Unity游戏的爱好者尤其是经常接触那些由独立开发者或小型团队制作的、尚未推出官方中文版的游戏那么你一定对满屏的日文、英文或者韩文感到头疼。手动查词典效率太低。等汉化组时间不确定。这时候一个能实时、自动将游戏内文本翻译成你母语的工具就成了刚需。XUnity Auto Translator以下简称XUAT正是为了解决这个问题而生的。它不是一个简单的屏幕取词翻译器而是一个深度集成到Unity游戏引擎内部的高级翻译插件。它的核心原理是“劫持”游戏渲染文本的流程在文本被绘制到屏幕之前将其替换为翻译后的内容。这意味着翻译是实时、无缝的你几乎感觉不到延迟就像游戏原生支持你的语言一样。我接触这个项目已经有好几年了从它早期的版本一直用到现在的成熟形态。它最初可能只是为了解决某些特定游戏的翻译问题但如今已经发展成一个功能极其强大、配置异常灵活的通用解决方案。无论是视觉小说VN、角色扮演游戏RPG还是模拟经营类游戏只要它是基于Unity引擎开发的XUAT就有很大概率能搞定它的文本翻译。这个工具的强大之处在于它的“自动化”和“可定制性”。自动化体现在它能够自动调用谷歌、百度、DeepL等在线翻译API或者使用你预先准备好的翻译文件实现“即玩即译”。而可定制性则深不见底你可以精细控制哪些文本需要翻译、如何处理空格和换行、如何调整UI字体大小以适应翻译后的文本长度甚至能替换游戏内的图片资源比如将日文的菜单按钮图替换成中文的。对于Mod开发者而言它还提供了完整的API允许其他插件直接查询翻译缓存或注册自己的翻译内容实现了生态的扩展。接下来我将带你深入解析XUAT的方方面面从基础安装配置到高级功能定制分享我这些年积累的实战经验和避坑指南。无论你是只想轻松玩转外语游戏的普通玩家还是希望为自己的Mod或游戏集成翻译功能的开发者这篇文章都能给你提供直接的帮助。2. 核心架构与工作原理解析要熟练使用甚至定制XUAT首先得理解它到底是如何工作的。很多人把它想象成一个“外挂”其实它的工作层面要深入得多。2.1 核心工作流程从文本捕获到屏幕渲染XUAT本质上是一个运行在游戏进程内的“中间人”。它的工作流程可以简化为以下几个步骤文本钩取Hooking这是最关键的一步。XUAT利用Harmony一个.NET函数库补丁库或MonoMod运行时钩子在游戏调用Unity的UI文本组件如TextMeshPro、UGUI Text、NGUI Label设置文本内容的方法时进行拦截。当游戏执行类似textComponent.text “こんにちは”;这样的代码时XUAT的钩子会先一步拿到这个字符串“こんにちは”。文本处理与查询拿到原始文本后XUAT会进行一系列预处理。比如根据配置移除首尾空格、处理内部的换行符等。处理后的文本会作为“键”Key去一个庞大的翻译字典里查找对应的“值”Value。这个字典由两部分组成自动生成文件通常是Translation\{Lang}\Text\_AutoGeneratedTranslations.txt。当XUAT遇到一个从未见过的文本时它会调用配置的在线翻译服务如谷歌翻译进行翻译并将“原文译文”的对应关系记录到这个文件里。下次再遇到相同文本就直接从本地文件读取无需再次联网速度极快。手动翻译文件你可以创建任意多的.txt文件放在Translation\{Lang}\Text\目录下格式同样是“原文译文”。这些文件的优先级高于自动生成的文件。这意味着你可以手动修正机器翻译生硬或不准确的地方实现精准汉化。文本替换与渲染找到翻译后XUAT会将翻译好的文本设置回游戏的UI组件替换掉原来的文本。随后游戏引擎像什么都没发生一样将这段中文文本渲染到屏幕上。整个过程发生在同一帧内对玩家而言就是“文本显示出来就是中文的”。2.2 两大核心模块AutoTranslator 与 ResourceRedirectorXUAT项目实际上包含两个相对独立但又协同工作的核心DLLXUnity.AutoTranslator.dll这是翻译功能的主体。负责上述的文本钩取、翻译查询、替换逻辑以及管理在线翻译API、翻译文件等。XUnity.ResourceRedirector.dll这是一个更为底层的资源重定向库。它的能力不限于文本而是可以拦截Unity引擎加载任何资源的请求包括图片Texture、音频AudioClip、文本资产TextAsset等并将其重定向到你自己准备的文件。XUAT的“贴图翻译”功能就是基于此实现的。这个库本身是独立的其他不涉及翻译的Mod也可以利用它来修改游戏资源。理解这两者的关系很重要。AutoTranslator专注于“文本流”的实时替换而ResourceRedirector提供了“资源文件”级别的静态替换能力。两者结合才能实现从文字到UI图标的全方位本地化。2.3 支持的翻译后端与选择策略XUAT支持多种翻译服务你需要根据网络环境、翻译质量需求和成本来选择合适的“端点”Endpoint。端点名称是否需要API密钥翻译质量稳定性/速度适用场景GoogleTranslate否较高通用性强依赖网络可能不稳定最常用无需配置开箱即用。GoogleTranslateLegitimate是付费高官方API稳定有速率限制需要稳定、高质量翻译且愿意付费。BaiduTranslate是免费申请中高中文互译优秀国内访问稳定快速国内用户首选。对中英、中日翻译优化好需申请AppID和密钥。BingTranslateLegitimate是付费高稳定同Google官方API替代选择。DeepLTranslate否免费版有限制极高尤其欧洲语言速度一般免费版有配额追求最高翻译质量特别是英、德、法、日等语言互译。YandexTranslate是免费额度中一般俄语等小语种可能有优势。PapagoTranslate否中高韩语优秀一般主打韩语翻译。配置心得 对于绝大多数国内用户我强烈推荐BaiduTranslate。申请百度翻译开放平台的通用版API是免费的每月有一定字符额度个人使用完全足够国内访问速度极快且对中文语境的理解往往比谷歌翻译更接地气。配置时在config.ini中设置EndpointBaiduTranslate并在[Baidu]段填写你的BaiduAppId和BaiduAppSecret即可。如果你主要玩日系游戏且网络环境允许GoogleTranslate是可靠的备选。DeepL虽然质量顶尖但其免费API通过网页端模拟有调用频率限制容易触发验证或中断不适合高强度、自动化的游戏翻译场景更适合手动辅助翻译。3. 实战部署从零开始配置你的游戏翻译环境理论说得再多不如动手实操。下面我将以最常见的Mod管理器BepInEx 5为例演示如何为一款Unity游戏安装和配置XUAT。3.1 环境准备与插件安装确认游戏环境首先你的游戏必须是基于Unity引擎开发的PC版。通常可以通过查看游戏根目录是否有UnityPlayer.dll、GameAssembly.dllIL2CPP编译或Mono相关DLL来判断。安装BepInEx如果游戏还没有安装BepInEx你需要先安装它。去BepInEx的GitHub发布页下载对应版本的BepInEx_x64_5.x.x.x.zip通常选64位版本。将压缩包内的所有文件解压到游戏根目录即Game.exe所在的文件夹。首次运行运行一次游戏让BepInEx完成初始化。之后关闭游戏你会发现游戏根目录下生成了BepInEx文件夹里面包含plugins、config等子目录。安装XUnity Auto Translator前往XUAT的GitHub发布页下载名为XUnity.AutoTranslator-BepInEx-5.x-{VERSION}.zip的压缩包确保版本匹配BepInEx 5。解压这个zip包你会看到BepInEx文件夹。将其整个拖拽到你的游戏根目录与现有的BepInEx文件夹合并。通常需要覆盖或合并plugins和config目录。合并后路径应该类似游戏根目录\BepInEx\plugins\XUnity.AutoTranslator\里面包含核心的XUnity.AutoTranslator.dll和XUnity.ResourceRedirector.dll。3.2 基础配置与首次运行安装完成后首次运行游戏XUAT会在BepInEx\config目录下生成一个名为AutoTranslatorConfig.ini的配置文件。这个文件控制着插件的所有行为。设置语言与翻译源用记事本或任何文本编辑器打开AutoTranslatorConfig.ini。找到[General]段落下的Language项。将其设置为你需要的目标语言代码例如简体中文是zh-CN繁体中文是zh-TW英文是en。找到Endpoint项。将其设置为你选择的翻译服务例如BaiduTranslate或GoogleTranslate。[General] Languagezh-CN EndpointBaiduTranslate配置百度翻译API如果选择前往百度翻译开放平台注册并登录创建一個通用翻译API应用。在应用详情中找到App ID和密钥。在AutoTranslatorConfig.ini中找到[Baidu]段落填写你的信息[Baidu] BaiduAppId你的App ID BaiduAppSecret你的密钥启动游戏并测试保存配置文件启动游戏。当游戏内出现文本时XUAT会开始工作。首次翻译某句文本时会有短暂的网络请求延迟状态栏或日志会有提示翻译结果会被保存到BepInEx\Translation\zh-CN\Text\_AutoGeneratedTranslations.txt。之后再次遇到相同文本就会瞬间显示翻译。重要提示首次运行时插件可能会在屏幕左上角或左下角显示一个半透明的状态窗口显示“Translating...”或“X translations cached”等信息。你可以按Alt0打开翻译器设置窗口在其中可以临时禁用翻译、切换翻译端点等。按AltT可以全局快速开启/关闭翻译功能方便对比原文。3.3 目录结构与文件管理理解XUAT生成的目录结构对于高级应用和问题排查至关重要BepInEx/ ├── plugins/ │ └── XUnity.AutoTranslator/ (核心插件文件) └── config/ │ └── AutoTranslatorConfig.ini (主配置文件) └── Translation/ (翻译相关文件根目录) └── zh-CN/ (对应你设置的语言) ├── Text/ │ ├── _AutoGeneratedTranslations.txt (自动生成的翻译缓存**可编辑**) │ ├── _Substitutions.txt (替换规则文件用于修正固定名词) │ ├── MyManualTranslations.txt (你可以自建的手动翻译文件) │ └── Plugins/ (为其他Mod提供专用翻译的目录) └── Texture/ (贴图翻译资源目录需手动开启)文件管理经验_AutoGeneratedTranslations.txt文件会越来越大。定期备份和清理这个文件是个好习惯。你可以将翻译满意的条目剪切出来粘贴到你自己创建的MyManualTranslations.txt中。因为手动翻译文件的优先级更高且更易于管理。永远不要直接分发包含大量未校对机器翻译的_AutoGeneratedTranslations.txt文件这既是对原作者的不尊重也可能包含翻译错误。分发时应该提供精校过的手动翻译文件。4. 高级功能详解与实战调优基础翻译能解决大部分问题但要想获得完美的游戏体验你需要深入了解并调教XUAT的各项高级功能。4.1 文本处理空格、换行与正则表达式游戏引擎处理文本的方式千奇百怪经常会在文本中插入多余的换行符\n或空格。这会导致“同じ文章なのに、改行位置が違う”同一段话换行位置不同被识别成两个不同的文本需要翻译两次甚至导致翻译结果支离破碎。XUAT通过以下配置项智能处理这些问题[Behaviour] IgnoreWhitespaceInDialogueTrue IgnoreWhitespaceInNGUITrue MinDialogueChars20 ForceSplitTextAfterCharacters0IgnoreWhitespaceInDialogue对于超过MinDialogueChars字符的长文本通常是对话在发送给翻译API前移除所有空白字符空格、换行等。这能确保翻译API看到的是一个完整的段落从而产出更连贯的译文。IgnoreWhitespaceInNGUI专门处理使用老版NGUI系统的游戏中的空白字符。ForceSplitTextAfterCharacters翻译完成后如果译文超过指定字符数强制插入换行。设置为0则禁用。有些游戏的UI框尺寸固定过长的单行文本会显示不全这个功能可以辅助换行。更强大的工具正则表达式Regex对于有规律可循的复杂文本正则表达式是神器。例如游戏中的道具描述可能是“colorgreen10 Attack/color”。我们只想翻译“10 Attack”而不想动HTML标签。可以在手动翻译文件中这样写r:color[^]([^])/colorcolor$1这条规则会匹配颜色标签内的内容$1捕获组并保留原标签结构。XUAT支持两种正则标准正则r:开头直接匹配并替换整个文本。分割器正则sr:开头先将文本按规则分割成多个部分分别翻译后再组合。这对于翻译“[STR5] 锋利的铁剑”这类组合文本非常有用。使用正则的注意事项正则表达式虽然强大但滥用会严重拖慢游戏性能。务必确保你的正则表达式是精确且高效的避免使用.*?这种过于宽泛的匹配。最好将正则规则放在独立的手动翻译文件中而不是自动生成的文件里。4.2 UI适配字体、大小与布局翻译后文本长度变化是本地化的经典难题。英文单词通常比中文长但日文假名可能比中文短。XUAT提供了多种方案来应对UI布局错乱。字体回退与替换游戏原版字体可能不包含中文字符导致翻译后显示为方框□□□。TextMeshPro (TMP)在配置中设置FallbackFontTextMeshPro为包含中文字符的TMP字体资产名。你可以从网上下载一些社区制作的中文TMP字体AssetBundle放入游戏根目录并在此处指定文件名不含扩展名。[Behaviour] FallbackFontTextMeshProSourceHanSansCN SDFUGUI使用OverrideFont配置项指向一个系统字体如Microsoft YaHei UI或自定义字体资源。自动与手动UI重设大小EnableUIResizingTrue这是基础开关允许插件尝试自动调整文本框的溢出模式以显示更长的文本。ForceUIResizingTrue强制对所有文本组件应用重设大小逻辑适用于那些自动检测不成功的组件。手动精确控制对于特定位置的UI元素自动调整可能不完美。你可以创建resizer.txt文件来精确控制。例如你发现某个对话框的标题字体太大可以这样写UI/MessagePanel/TitleTextChangeFontSizeByPercentage(0.8)这条规则会将TitleText路径下文本的字体大小调整为原来的80%。如何获取这个路径你需要开启EnableTextPathLoggingTrue然后在游戏中查看控制台输出找到对应文本组件的完整路径。4.3 贴图翻译替换游戏内图片资源这是XUAT最强大的功能之一可以直接替换游戏内的UI图片比如将日文的“はい”、“いいえ”按钮图换成中文的“是”、“否”。启用贴图翻译在配置文件中开启相关选项。[Texture] EnableTextureTranslationTrue EnableTextureDumpingTrue ; 首次使用时开启用于导出游戏原始贴图 TextureDirectoryTranslation\Texture TextureHashGenerationStrategyFromImageName ; 推荐使用性能最好导出贴图启动游戏进入各个界面。XUAT会将检测到的贴图文件以原文件名 [哈希值].png的格式导出到BepInEx\Translation\zh-CN\Texture\目录下。哈希值用于唯一标识这张图片。编辑与替换用图片编辑软件如Photoshop, GIMP甚至画图工具打开导出的PNG文件将上面的外文文字修改为中文。保存时务必保留原文件名和哈希值不变。例如不要将button_yes [ABCD1234].png另存为button_yes_cn.png。关闭导出享受成果编辑完成后将配置中的EnableTextureDumping设为False以防止插件重复导出已修改的图片。重启游戏修改后的中文图片就应该显示出来了。贴图翻译的坑性能影响EnableTextureScanOnSceneLoad和EnableTextureDumping会显著增加场景加载时间和内存占用仅在需要导出图片时开启日常使用务必关闭。哈希策略FromImageName依赖游戏资源内部名称大多数情况够用且高效。如果遇到图片无法替换或替换错误可以尝试FromImageData基于图片内容生成哈希但这会极大增加CPU开销不推荐在最终发布的翻译包中使用。永远不要分发带有EnableTextureDumpingTrue配置的Mod这会导致所有使用者的游戏不断导出贴图产生大量垃圾文件。5. 开发者视角扩展与集成对于Mod开发者或高级用户XUAT提供了丰富的API允许你深度集成或扩展其功能。5.1 为其他Mod提供翻译支持如果你的Mod有自己的UI界面你可以为其创建专属的翻译文件避免与游戏本体或其他Mod的翻译冲突。在Translation\zh-CN\Text\目录下创建Plugins文件夹。在Plugins内为你Mod的DLL文件不含扩展名创建一个同名文件夹。例如你的Mod是MyAwesomeMod.dll就创建MyAwesomeMod文件夹。在该文件夹内创建普通的翻译文本文件如UI.txt格式同样是“原文译文”。如果需要你可以在翻译文件中加入#enable fallback指令。这允许当插件专用翻译文件中找不到对应条目时回退到全局的自动或手动翻译中查找。5.2 实现自定义翻译端点如果你有私有的翻译API或想集成新的翻译服务可以实现ITranslateEndpoint接口。创建类库项目新建一个.NET Framework 3.5或.NET Standard目标改为net35的类库项目。引用与继承引用XUAT开发者包中的XUnity.AutoTranslator.Plugin.Core.dll。创建一个类继承自HttpEndpoint基类对于HTTP API或直接实现ITranslateEndpoint接口。核心方法Id和FriendlyName返回你翻译端的唯一标识和显示名称。Initialize在这里读取你的API密钥等配置并进行初始化检查。OnCreateRequest构建发送给翻译API的HTTP请求。OnExtractTranslation从API响应中解析出翻译文本。编译与部署将编译好的DLL放入游戏的BepInEx\plugins\XUnity.AutoTranslator\Translators\目录下。在XUAT配置文件中将Endpoint设置为你的Id即可。一个简单的示例调用一个假设的JSON APIpublic class MyTranslatorEndpoint : HttpEndpoint { public override string Id MyTranslator; public override string FriendlyName 我的私有翻译; private string _apiKey; public override void Initialize(IInitializationContext context) { _apiKey context.GetOrCreateSetting(MyTranslator, ApiKey, ); if (string.IsNullOrEmpty(_apiKey)) throw new Exception(请配置ApiKey。); } public override void OnCreateRequest(IHttpRequestCreationContext context) { // 构建请求 var request new XUnityWebRequest(https://api.mytrans.com/translate); request.Method POST; request.Headers[HttpRequestHeader.ContentType] application/json; var postData ${{\text\: \{context.UntranslatedText}\, \target_lang\: \{context.DestinationLanguage}\, \api_key\: \{_apiKey}\}}; request.UploadData System.Text.Encoding.UTF8.GetBytes(postData); context.Complete(request); } public override void OnExtractTranslation(IHttpTranslationExtractionContext context) { var json context.Response.Data; // 简单解析JSON这里需要根据实际API响应格式调整 var parsed SimpleJson.DeserializeObjectDictionarystring, object(json); if (parsed.TryGetValue(translated_text, out object translated)) { context.Complete(translated.ToString()); } else { context.Fail(无法从响应中解析翻译文本。); } } }5.3 使用Resource Redirector APIResource Redirector的API允许你在资源加载层面做更多事情比如修改模型、替换音频等。其核心是注册钩子Hook到资源加载的生命周期中。示例修改所有加载的TextAsset文本资源public class MyResourceMod : BaseUnityPlugin { void Awake() { // 注册资源加载后的钩子 ResourceRedirection.RegisterResourceLoadedHook( HookBehaviour.OneCallbackPerResourceLoaded, 100, // 优先级 OnResourceLoaded); } private void OnResourceLoaded(ResourceLoadedContext context) { // 只处理TextAsset类型的资源 if (context.Asset is TextAsset textAsset) { string originalPath context.Parameters.Path; // 例如我们想修改某个特定的配置文件 if (originalPath.EndsWith(game_config.xml)) { string originalText textAsset.text; // 对文本进行一些修改... string modifiedText originalText.Replace(DifficultyHard, DifficultyEasy); // 创建一个新的TextAsset替换原资源 TextAsset newAsset new TextAsset(modifiedText); context.Asset newAsset; context.Complete(); // 告知重定向器处理完成 } } } }这个例子展示了如何将一个游戏配置文件中的“Hard”难度替换为“Easy”。Resource Redirector的能力非常底层给予了Mod开发者极大的自由度。6. 常见问题排查与性能优化指南即使配置正确在实际使用中也可能遇到各种问题。这里汇总了一些常见故障及其解决方法。6.1 翻译不生效或显示异常现象可能原因解决方案游戏内文字毫无变化1. 插件未正确加载。2. 游戏使用IL2CPP编译且兼容性不佳。3. 文本渲染方式特殊如自定义Shader。1. 检查BepInEx\logs\LogOutput.log查看XUAT相关日志是否正常加载。2. 尝试使用XUnity.AutoTranslator.IL2CPP.BruteForceFix辅助插件如果游戏是IL2CPP。3. 尝试在配置中开启EnableSpriteRendererHookingTrue和TextGetterCompatibilityModeTrue。部分文字显示为方框□游戏字体缺少目标语言的字符集。1. 对于TextMeshPro配置FallbackFontTextMeshPro指向一个中文字体。2. 对于UGUI配置OverrideFont。3. 检查字体文件是否确实包含所需字符。翻译后文字重叠、溢出或显示不全翻译后文本长度超出UI控件边界。1. 开启EnableUIResizingTrue。2. 对于特定UI使用resizer.txt手动调整字体大小或行间距。3. 调整ForceSplitTextAfterCharacters值强制长文本换行。在线翻译速度极慢或失败1. 网络连接问题。2. 翻译API达到调用限额或被限制。3. 配置的Endpoint不正确。1. 检查网络尝试切换翻译服务如从GoogleTranslate换到BaiduTranslate。2. 如果使用免费API确认是否超过配额。DeepL免费版很容易触发限制。3. 确认Endpoint配置项拼写正确且必要的API密钥已填写。游戏崩溃或闪退1. 与其他Mod冲突。2. 钩取了不兼容的游戏方法。1. 尝试禁用其他Mod单独测试XUAT。2. 在配置中尝试设置ForceMonoModHooksTrue如果使用的是BepInEx 5.x完整包。3. 查看崩溃日志BepInEx\logs\寻找错误堆栈信息。6.2 性能优化配置XUAT在默认配置下对性能影响微乎其微。但在某些老旧电脑或大型游戏中仍可进行优化关闭日志输出将[Debug]下的EnableLog和EnableConsole设为False可以减少磁盘I/O和日志输出开销。谨慎使用贴图翻译如前所述EnableTextureDumping、EnableTextureScanOnSceneLoad、TextureHashGenerationStrategyFromImageData都会带来性能损失。日常游玩时确保它们处于关闭状态。限制翻译字符长度MaxCharactersPerTranslation默认为1000。对于游戏来说超过1000字符的文本块非常罕见且翻译API可能拒接。可以适当调低此值如400避免处理极长的无用文本如调试信息。启用批处理EnableBatchingTrue默认。这会将多个短文本合并成一个请求发送给翻译API减少网络请求次数。管理翻译文件定期清理_AutoGeneratedTranslations.txt将确认无误的翻译移入手动文件。过大的翻译缓存文件在加载时会略微增加游戏启动时间。6.3 翻译质量提升技巧机器翻译终究不如人工。以下技巧可以显著提升最终呈现的翻译质量善用_Substitutions.txt文件这是替换规则文件用于在翻译前修正原文。比如游戏里角色名“サクラ”被机器翻译成“樱花”但你希望保留音译“樱”。你可以添加规则サクラ樱这样任何包含“サクラ”的文本在发送给翻译API前都会先被替换成“樱”从而避免错误的意译。这对于专有名词、技能名、地名等固定词汇非常有效。手动翻译精校这是获得高质量翻译的唯一途径。游玩过程中随时按AltR可以重载翻译文件。你可以一边玩一边用文本编辑器打开_AutoGeneratedTranslations.txt或你自己的手动翻译文件修改不满意的翻译保存后按AltR即时生效。利用翻译作用域对于多合一游戏或包含多个可执行文件的游戏可以使用#set exe指令来限定翻译文件只在特定游戏下生效避免翻译冲突。社区协作许多热门游戏都有玩家维护的翻译项目。在GitHub、GitLab或专门的游戏Mod网站上搜索“游戏名 XUnity Auto Translator 汉化”很可能找到别人已经精心翻译好的文件包直接使用可以省去大量工作。XUnity Auto Translator是一个将“玩外语游戏”从“痛苦的学习”转变为“愉悦的体验”的强大工具。它的天花板很高你可以只把它当作一个简单的实时翻译器也可以深入挖掘打造一个完美的、包含图片替换和深度定制的本地化版本。关键在于理解其工作原理并耐心地进行配置和调试。希望这篇深度解析与实战指南能帮助你彻底驾驭这个工具无障碍地享受全世界优秀的游戏作品。