1. 项目概述XUnity.AutoTranslator 是什么如果你是一名喜欢玩各种独立游戏、视觉小说或者日系RPG的玩家肯定遇到过这样的烦恼游戏本身质量很高但偏偏没有官方中文或者官方翻译质量一言难尽。传统的汉化补丁虽然能解决问题但往往需要等待汉化组发布而且一旦游戏更新补丁就可能失效。有没有一种方法能让我们在游戏运行时实时、自动地将游戏内的文本翻译成我们熟悉的语言呢XUnity.AutoTranslator以下简称 XUA就是为解决这个问题而生的神器。它本质上是一个高级的、可高度定制的翻译插件专门为基于 Unity 引擎开发的游戏设计。简单来说它就像给你的游戏安装了一个“同声传译”能够拦截游戏运行时显示的所有文本调用你指定的翻译服务如谷歌翻译、DeepL等进行实时翻译并将结果无缝替换回游戏界面。它的强大之处在于它不修改游戏原始文件而是通过内存注入和资源重定向的技术在游戏运行时动态地“偷梁换柱”因此兼容性极强对游戏更新也不敏感。从技术角度看XUA 不仅仅是一个简单的文本替换工具。它集成了文本钩子Hooking、资源重定向Resource Redirection、翻译聚合、字体替换、UI自适应调整等一整套复杂机制。它支持通过 BepInEx、IPA、ReiPatcher 等多种流行的 Unity 游戏 Mod 框架加载这意味着它对绝大多数使用 Unity 引擎的 PC 游戏都具备潜在的兼容性。无论是 Steam 上的热门作品还是一些小众的独立游戏只要它是 Unity 开发的XUA 就有很大概率能派上用场。这个项目的核心价值在于“自动化”和“可定制化”。对于普通玩家它提供了开箱即用的体验配置好翻译引擎和语言就能立刻享受游戏。对于高级用户和 Mod 开发者它提供了详尽的配置选项和强大的 API允许你进行精细的翻译规则控制、自定义字体、甚至开发自己的翻译后端。它打破了玩家与外语游戏之间的语言壁垒让“生肉”游戏变得“可食用”极大地扩展了玩家的游戏库和体验范围。2. 核心工作机制与架构拆解要理解 XUA 如何工作我们需要深入到它的技术架构层面。它并非一个简单的“翻译器”而是一个运行在游戏进程内、拥有复杂工作流的中间件系统。2.1 文本拦截与钩子Hooking机制这是 XUA 最核心的一步。游戏在屏幕上显示任何文字最终都会调用 Unity 引擎中用于渲染文本的组件如UnityEngine.UI.Text、TextMeshPro等的文本设置方法例如set_text。XUA 利用 Harmony一个.NET运行时补丁库或 MonoMod Runtime Detours在这些关键方法被调用前进行“拦截”Hook。当游戏试图设置一个文本字符串时比如textComponent.text “こんにちは”XUA 的钩子会先一步捕获到这个调用。它拿到原始的、未经翻译的文本“こんにちは”然后暂停游戏原本的设置流程启动自己的翻译流水线。这个过程对游戏本身是透明的游戏引擎并不知道自己设置的文本已经被“调包”了。这里有一个技术细节不同的游戏和 UI 框架如传统的 UGUI、NGUI或更现代的 TextMeshPro调用文本设置的方式可能有细微差别。XUA 的钩子需要足够智能和全面才能覆盖大多数情况。这也是为什么其配置文件中会有EnableSpriteRendererHooking、TextGetterCompatibilityMode等选项用于应对一些特殊或老旧的文本渲染方式。2.2 翻译查询与缓存流水线拦截到文本后XUA 并不会立刻发送给在线翻译服务。那样效率太低且容易因网络问题导致游戏卡顿。它的处理流程是一个精心设计的多级流水线文本预处理首先原始文本会经过一系列预处理。这包括根据配置处理空白字符例如忽略对话文本开头/结尾的空白合并内部换行周围的空白以及应用“替换规则”Substitutions。替换规则文件允许你手动定义一些固定翻译比如将经常被误译的特定角色名或专有名词直接替换掉这能显著提升翻译准确率和一致性。多级缓存查找预处理后的文本会进入一个高效的缓存字典进行查找。这个字典的内容来自几个地方手动翻译文件用户或汉化组预先准备好的、精准的翻译对。自动生成的翻译文件_AutoGeneratedTranslations.txt之前通过在线翻译服务获取并保存下来的结果。内部静态词典插件内置的一些常见词汇对照。 XUA 会进行最多四次查找分别对应原始文本、去除首尾空格、处理内部换行等不同变体以确保最大程度地匹配缓存。如果缓存命中则立即返回结果速度极快。在线翻译请求如果所有缓存都未命中文本才会被送入在线翻译流程。XUA 支持众多翻译后端Endpoint如 Google Translate、Bing Translator、DeepL、Yandex.Translate、百度翻译等。你可以配置 API 密钥对于需要认证的服务也可以使用一些免费的、无需密钥的公共接口但可能有速率限制或稳定性问题。插件会负责构建网络请求、处理响应和错误重试。结果后处理与缓存从在线服务获取到翻译结果后会进行后处理。这可能包括应用“后处理规则”Postprocessors比如调整标点符号格式、修复一些翻译引擎特有的怪癖。处理完成后翻译结果不仅会返回给游戏进行显示还会被自动写入到_AutoGeneratedTranslations.txt文件中。这样下次再遇到相同的句子时就可以直接从缓存读取无需再次联网既加快了速度又减少了对翻译服务的调用。2.3 资源重定向Resource Redirector模块这是 XUA 另一个强大的子系统它相对独立于文本翻译。有些游戏的文本并非动态设置而是直接写在游戏的资源文件如.assets文件、AssetBundle包里。对于这种情况单纯的运行时文本钩子可能无法捕获。资源重定向模块允许 XUA或其他插件在游戏加载资源如图片、文本资源、音频等时进行拦截和替换。例如游戏要加载一张日文的 UI 图片button_jp.png该模块可以将其重定向到你自己准备的、已经汉化好的button_cn.png文件。这对于替换游戏内的图片文字如菜单、图标至关重要。该模块通过钩住 Unity 的Resources.Load和AssetBundle.LoadAsset等核心资源加载 API 来实现。它允许开发者注册前缀Prefix和后缀Postfix回调在资源加载前后进行操作可以读取、修改甚至完全替换即将加载到内存中的资源对象。XUA 自带的TextAssetRedirector就是利用这个功能将游戏内的文本资源文件导出到磁盘允许用户直接修改修改后的版本会在游戏运行时被加载从而实现更彻底的“静态”汉化。2.4 UI 自适应与字体管理直接将英文或日文翻译成中文一个常见的问题是文字长度变化。一个简短的英文单词翻译成中文可能变成两个汉字而一个长句日文翻译成中文后可能变短。这会导致游戏原本的文本框Text Component出现显示不全溢出或留白过多的问题。XUA 提供了多种 UI 自适应方案自动调整通过EnableUIResizing和ForceUIResizing选项插件可以尝试自动修改文本框的“溢出”Overflow处理方式比如将Overflow模式从Truncate截断改为Overflow溢出或者调整Horizontal Overflow和Vertical Overflow设置让长文本能够显示出来。手动字体缩放用户可以创建resizer.txt文件为特定的 UI 元素路径指定缩放命令例如ChangeFontSizeByPercentage(0.8)将字体缩小到 80%。这需要借助其他工具如 Runtime Unity Editor来获取游戏中 UI 元素的完整路径。字体替换许多游戏的默认字体不包含中文字符集导致中文显示为方框□□□。XUA 允许通过OverrideFont或FallbackFontTextMeshPro配置项指定一个包含中文字符的字体文件通常是打包成 AssetBundle 的 TMP 字体资源。插件会在运行时加载并使用这个字体来渲染翻译后的文本。这套组合拳确保了翻译结果不仅在内容上准确在视觉呈现上也能尽可能地融入游戏原版 UI提升整体体验。3. 从零开始安装、配置与基础使用了解了原理我们来看看如何实际使用它。整个过程可以分为安装、基础配置、高级调优三个阶段。3.1 环境准备与插件安装首先你需要确定目标游戏使用的 Mod 框架。目前 XUA 主要支持 BepInEx最通用、IPA主要用于日本发行的游戏和 ReiPatcher较老。以最流行的 BepInEx 5.x 为例安装 BepInEx前往 BepInEx 的 GitHub 发布页下载对应你游戏位数x86 或 x64的版本。通常是一个压缩包将其解压到游戏根目录即包含游戏主.exe文件的文件夹。运行一次游戏BepInEx 会自动完成初始化在游戏目录下生成BepInEx文件夹及其子目录。安装 XUnity.AutoTranslator从 XUA 的 GitHub 发布页下载XUnity.AutoTranslator-BepInEx-{VERSION}.zip。将其解压你会看到BepInEx文件夹。将这个BepInEx文件夹整体拖拽到你的游戏根目录与之前安装的 BepInEx 文件合并。通常XUA 的核心插件文件XUnity.AutoTranslator.dll和资源重定向库XUnity.ResourceRedirector.dll会被放置到BepInEx\plugins目录下。验证安装启动游戏。如果安装成功你通常会在游戏画面的一角看到 XUA 的初始化信息例如 “XUnity Auto Translator initialized”或者按Alt0可以呼出翻译配置窗口。首次运行后在BepInEx\config目录下会生成AutoTranslatorConfig.ini配置文件在BepInEx\translation目录下会生成对应语言如zh-CN的文件夹和_AutoGeneratedTranslations.txt文件。注意有些游戏可能有反修改或反作弊机制可能会阻止 BepInEx 或 Harmony 正常工作。这种情况下需要寻找针对该游戏的特定破解或绕过方法这超出了 XUA 本身的范围。安装前最好在游戏社区或 Mod 站查看是否有其他玩家成功案例。3.2 核心配置文件详解AutoTranslatorConfig.ini是 XUA 的大脑所有行为都由它控制。我们打开它看看几个最关键的配置区块[General]区块 - 基础设置[General] Languagezh-CN FromLanguageja EndpointGoogleTranslateLanguage: 目标语言即你想翻译成的语言。例如zh-CN简体中文、en英文。FromLanguage: 源语言即游戏文本的原始语言。插件会尝试自动检测但手动指定如ja代表日文能提高翻译准确率。Endpoint: 翻译后端。这是最重要的设置之一。GoogleTranslate是默认的免费后端但可能受网络环境影响。其他选项包括BaiduTranslate需要配置 AppID/密钥、DeepLLegitimate需要 API 密钥质量高但收费等。如果留空或设为None则禁用自动翻译仅使用本地翻译文件。[Behaviour]区块 - 插件行为[Behaviour] EnableTranslationTrue EnableIMGUIFalse MaxCharactersPerTranslation150 DelaySeconds0.5EnableTranslation: 总开关。EnableIMGUI: 是否翻译由 IMGUIUnity 旧版即时模式 GUI绘制的界面。许多游戏 Mod 的配置窗口使用 IMGUI开启此项可能会翻译这些 Mod 界面但有时会导致冲突或显示异常默认关闭。MaxCharactersPerTranslation: 单次发送给翻译服务的最大字符数。设置得太高如超过 400可能被翻译服务拒绝或导致超时。建议保持在 150-300 之间。DelaySeconds: 翻译请求之间的延迟秒数用于避免对免费翻译服务请求过快导致 IP 被暂时封锁。对于 DeepL 等付费 API可以设置得更小。[Google]/[Baidu]/[DeepL]等区块 - 翻译服务配置如果你选择了需要认证的翻译后端需要在这里填写相应的 API 密钥。例如使用 DeepL[DeepLLegitimate] ApiKeyyour-deepl-api-key-here FreeFalse你需要去 DeepL 官网注册账号并获取 API 密钥。FreeFalse表示你使用的是 DeepL 的付费 API 套餐拥有更高的速率限制。[Texture]区块 - 图片翻译高级功能这个功能允许替换游戏内的图片资源如带文字的按钮、图标。[Texture] EnableTextureTranslationFalse EnableTextureDumpingFalse TextureDirectoryTranslation\Texture TextureHashGenerationStrategyFromImageNameEnableTextureTranslationTrue会启用图片替换。启用后插件会尝试从TextureDirectory目录加载与游戏内图片哈希值匹配的图片文件来替换原图。EnableTextureDumpingTrue会让插件在运行时将游戏内检测到的所有纹理图片导出到TextureDirectory。这是一个调试功能导出后务必将其改回False否则每次运行游戏都会重新导出严重拖慢性能并占用磁盘空间。TextureHashGenerationStrategy决定如何识别图片。FromImageName是基于游戏内部资源名生成哈希性能最好是分发汉化补丁时的推荐选项。FromImageData是基于图片像素数据生成哈希最准确但性能开销大。3.3 首次运行与基础调优配置完成后启动游戏。进入一个有大量文本的场景如游戏主菜单、对话界面。XUA 会开始工作观察控制台/日志如果通过 BepInEx 的BepInEx_Console启动游戏你可以在控制台看到 XUA 的日志输出。它会显示拦截到的文本、翻译状态缓存命中/在线翻译、以及可能的错误信息。使用热键Alt0: 打开/关闭翻译配置窗口。在这里可以快速切换翻译引擎、目标语言、启用/禁用翻译。AltT: 全局切换翻译功能的开启/关闭。这是最快的“开关”。AltR: 重新加载所有翻译文件。如果你手动修改了_AutoGeneratedTranslations.txt或其他翻译文件按此键无需重启游戏即可生效。检查生成的文件进入BepInEx\translation\zh-CN\Text目录打开_AutoGeneratedTranslations.txt。你会看到类似这样的内容こんにちは你好 開始开始左边是游戏原始文本右边是自动翻译的结果。你可以直接编辑这个文件来修正机器翻译的错误。例如如果“開始”被错误地翻译成了“启动”你可以手动将其改为“开始”。保存文件后在游戏中按AltR重载修改就会立即生效。基础调优技巧解决翻译延迟如果感觉文本出现后有明显的延迟才被翻译可以尝试调小[Behaviour]下的DelaySeconds如从 1.0 改为 0.3但注意不要太小以免触发翻译服务的限流。解决翻译不完整有些游戏文本是逐字或分块显示的。如果发现翻译只覆盖了部分文本可以尝试开启[Behaviour]下的GeneratePartialTranslationsTrue。但注意这可能会在某些游戏中导致文本重复显示需要根据实际情况调整。解决字体显示为方框这是最常见的问题。你需要为游戏提供中文字体。通常的步骤是找到一个支持中文的 TMP 字体 AssetBundle 文件社区有时会分享将其放入游戏根目录然后在配置文件中设置OverrideFontTextMeshPro字体文件名不含路径。更复杂的情况需要自己制作字体 AssetBundle这涉及到使用 Unity Editor 进行导出。4. 高级应用手动翻译、正则表达式与资源替换当自动翻译无法满足需求或者你想要制作一个高质量的、可供分发的汉化补丁时就需要用到 XUA 的高级功能了。4.1 构建高质量的手动翻译库自动生成的翻译文件是起点但最终质量取决于手动修正。一个好的实践是分离自动与手动文件不要直接在_AutoGeneratedTranslations.txt里进行大量修改。因为这个文件每次游戏运行都可能被插件追加新的自动翻译条目你的修改可能会被覆盖或弄乱。正确的做法是将_AutoGeneratedTranslations.txt中翻译质量尚可或需要修正的条目剪切出来粘贴到一个新的.txt文件中例如ManualTranslations.txt并放在同一个Text文件夹内。优先级系统XUA 会读取Text文件夹下所有的.txt文件包括.zip压缩包里的。当同一个原始文本出现在多个文件中时_AutoGeneratedTranslations.txt的优先级最低。这意味着你放在ManualTranslations.txt里的翻译会覆盖自动生成的翻译。你可以创建多个手动翻译文件来分类管理比如Items.txt物品、Dialogue.txt对话、UI.txt界面。翻译作用域Scoping一个翻译可能只在游戏的某个特定场景或由某个特定可执行文件触发时才适用。XUA 支持通过文件内的指令来限定翻译的作用域。#set level 5 ワールドマップ世界地图 #unset level 5上面这段表示“ワールドマップ”翻译成“世界地图”只在地图场景ID 为 5生效。场景 ID 可以通过游戏内按CtrlAltNumPad7热键查看。这能有效避免翻译冲突比如同一个词在不同上下文中含义不同。4.2 使用正则表达式处理复杂文本游戏文本有时并非简单的“原文译文”一一对应。例如一个装备描述可能是“攻击力{value}”其中{value}是一个动态数字。或者游戏会将多个文本片段拼接后再显示。这时就需要正则表达式Regex出场。XUA 支持两种正则表达式用法1. 标准正则翻译r:直接在翻译文件中使用用于匹配带有模式变化的文本。r:^獲得経験値 ([0-9])$获得经验值 $1 r:^(.)の攻撃$$1 的攻击第一行匹配“獲得経験値 100”这样的文本并将其翻译为“获得经验值 100”其中$1代表正则捕获的第一个组即数字部分。 第二行匹配“スライムの攻撃”翻译为“史莱姆 的攻击”。这让你可以用一条规则处理同一模式下的无数种情况。2. 分割器正则sr:用于在翻译前先将复合文本拆分成独立的片段分别翻译后再组合回去。这对于处理游戏将物品名和数量拼接在一起的情况特别有用。# 假设我们有一个基础翻译ポーション药水 ポーション药水 # 然后我们用一个分割器正则来处理“数量 物品名”的格式 sr:^([0-9]) (.)$$1 $2当游戏显示“5 ポーション”时插件会先用分割器正则将其拆成“5”和“ポーション”。然后“ポーション”被翻译成“药水”最后再组合成“5 药水”。这样你只需要定义一次“ポーション药水”就能应对“1 ポーション”、“10 ポーション”等各种情况无需为每个数量都写一条规则。警告正则表达式非常强大但滥用会严重拖慢翻译查找速度。务必确保正则表达式尽可能精确避免使用过于宽泛的匹配模式如.*并尽量将其放在独立的、作用域明确的翻译文件中。4.3 资源重定向实现深度汉化对于嵌入在图片、音频或预制体Prefab中的文字文本钩子无能为力。这时就需要使用资源重定向功能进行“静态替换”。替换图片纹理在配置中启用[Texture]相关功能并设置EnableTextureDumpingTrue。启动游戏遍历所有游戏场景让插件将游戏内的纹理图片导出到Translation\Texture目录。导出的图片文件名会包含哈希值如title_logo [ABCD1234-EF567890].png。关闭EnableTextureDumping。用图像处理软件如 Photoshop、GIMP打开导出的图片将其中的外文文字修改为中文。保存时务必保留原始文件名和哈希值部分。将修改后的图片放回原目录。在配置中开启EnableTextureTranslationTrue。重启游戏修改后的中文图片就会替换游戏原图。替换文本资源TextAsset在配置中启用[ResourceRedirector]下的EnableTextAssetRedirectorTrue和EnableDumpingTrue。启动游戏插件会将游戏加载的文本资源如.json,.txt,.xml等配置文件导出到Translation\{Lang}\RedirectedResources目录。关闭EnableDumping。找到包含需要翻译文字的文本资源文件直接编辑它们。将编辑好的文件放回原路径保持目录结构。重启游戏游戏就会加载你修改后的文本资源。资源重定向是实现完美汉化的终极手段因为它直接修改了游戏加载的原始数据。但操作相对复杂且需要你对游戏的文件结构有一定了解。分发此类汉化补丁时务必只包含你修改过的文件并清晰地说明安装路径。5. 开发者视角扩展插件与二次开发XUA 不仅仅是一个终端用户工具它还是一个强大的开发平台允许 Mod 作者深度集成或扩展其功能。5.1 为其他 Mod 提供插件特定翻译如果你开发了一个为游戏添加新物品、新对话的 Mod你自然希望这些新内容也能被 XUA 翻译。你不需要修改 XUA 本身而是可以利用其“插件特定翻译”功能。创建翻译文件在BepInEx\translation\zh-CN\Text目录下创建一个名为Plugins的文件夹。在这个文件夹内为你 Mod 的 DLL 文件不含.dll扩展名创建一个同名的文件夹。例如如果你的 Mod 是MyAwesomeMod.dll就创建BepInEx\translation\zh-CN\Text\Plugins\MyAwesomeMod\。放置翻译文件将你的 Mod 的翻译文件格式与主翻译文件相同放入这个文件夹。你还可以在文件中添加#enable fallback指令这表示如果在这个插件特定翻译文件中找不到某个词的翻译可以回退到全局的自动或手动翻译中去查找。通过代码注册可选如果你的 Mod 是动态生成文本或者希望将翻译文件打包在 DLL 内你可以通过 XUA 提供的 API 在运行时注册翻译包。// 在你的插件初始化代码中如 Start 方法 using XUnity.AutoTranslator.Plugin.Core; // ... Stream translationStream GetEmbeddedTranslationStream(); // 从程序集资源中获取流 var package new StreamTranslationPackage(translationStream); TranslationRegistry.Default.RegisterPluginSpecificTranslations(typeof(MyPlugin).Assembly, package); TranslationRegistry.Default.EnablePluginTranslationFallback(typeof(MyPlugin).Assembly);这样你的 Mod 就能与 XUA 无缝协作共享翻译生态。5.2 实现自定义翻译端点Endpoint也许你对现有的翻译服务都不满意或者有一个私有的翻译 API。XUA 允许你开发自己的翻译后端。你需要创建一个新的 .NET 类库项目目标框架建议 .NET 3.5 以兼容旧版 Unity引用XUnity.AutoTranslator.Plugin.Core.dll然后实现ITranslateEndpoint接口或继承HttpEndpoint等基类。一个最简单的“反向翻译”示例如下public class ReverseTranslatorEndpoint : ITranslateEndpoint { public string Id ReverseTranslator; // 配置中使用的标识符 public string FriendlyName 文本反转器; // 在UI中显示的名称 public int MaxConcurrency 10; // 最大并发请求数 public int MaxTranslationsPerRequest 1; // 单次请求最大翻译条数 public void Initialize(IInitializationContext context) { // 初始化可以在这里读取配置、验证API密钥等 bool isEnabled context.GetOrCreateSetting(ReverseTranslator, Enabled, true); if (!isEnabled) throw new Exception(此翻译器已被禁用。); } public IEnumerator Translate(ITranslationContext context) { // 模拟一个简单的翻译过程将文本反转 string original context.UntranslatedText; char[] charArray original.ToCharArray(); Array.Reverse(charArray); string reversedText new string(charArray); // 完成翻译 context.Complete(reversedText); yield break; // 因为是同步操作直接返回 } }编译生成的 DLL 文件将其放入游戏目录下的BepInEx\translators文件夹可能需要手动创建。然后在配置文件中将Endpoint设置为ReverseTranslator就可以使用你这个自定义的“翻译器”了。对于需要调用 HTTP API 的翻译服务继承HttpEndpoint基类会更方便它帮你处理了网络请求的异步和证书验证等问题。你只需要重写OnCreateRequest来构建请求和OnExtractTranslation来解析响应即可。5.3 利用资源重定向 API 进行高级 Mod 开发资源重定向器Resource Redirector是一个独立的库其 API 非常强大。你可以利用它做很多事情远不止于翻译模型/贴图替换拦截 3D 模型或贴图的加载替换成自定义的版本。音频替换替换游戏内的音效或背景音乐。动态资源修改在资源加载到内存后实时修改其属性。例如修改某个材质的颜色或者调整某个动画剪辑的速度。基本的使用模式是注册一个钩子Hookpublic class MyResourceMod : BaseUnityPlugin { void Awake() { // 注册一个资源加载后的钩子 ResourceRedirection.RegisterResourceLoadedHook( HookBehaviour.OneCallbackPerResourceLoaded, 100, // 优先级 OnResourceLoaded); } private void OnResourceLoaded(ResourceLoadedContext context) { // 检查加载的资源类型和路径 if (context.Parameters.Type typeof(Texture2D) context.Parameters.Path.Contains(special_icon)) { // 加载我们自己的纹理 Texture2D myTexture LoadMyCustomTexture(); // 替换游戏原本要加载的纹理 context.Asset myTexture; // 告诉重定向器我们已经处理完毕跳过后续的钩子 context.Complete(skipRemainingPostfixes: true); } } private Texture2D LoadMyCustomTexture() { /* ... */ } }这为游戏 Mod 开发打开了新世界的大门允许进行深度、动态的资源定制。6. 实战排坑常见问题与解决方案即使有了完善的文档在实际使用中还是会遇到各种稀奇古怪的问题。下面是我在多年使用和帮助他人过程中总结的一些典型“坑”及其解决方法。6.1 翻译不生效或时有时无这是最普遍的问题。排查步骤应遵循从简到繁检查基础配置确认[General]下的Language和FromLanguage设置正确Endpoint不是空值或None。按Alt0确认翻译功能已启用。查看日志通过 BepInEx 控制台或日志文件查看 XUA 的输出。关键信息包括“Initialized successfully”初始化成功、“Loaded X translations from cache”从缓存加载了多少翻译、“Translating ‘XXX’ via YYY”正在通过 YYY 服务翻译 XXX。如果没有任何日志可能是插件根本没加载成功。检查文本钩子兼容性有些游戏使用非常规的文本渲染方式。尝试在配置文件中将[Behaviour]下的TextGetterCompatibilityMode设为True。这个模式会尝试用另一种方式欺骗游戏使其认为显示的文本是未翻译的对于某些依赖文本内容进行逻辑判断的游戏有效。检查字体问题如果翻译后文本区域变成空白或显示乱码很可能是字体缺失。尝试在游戏中按Alt0打开设置窗口临时切换到一个非常简单的目标语言如英语看英文是否能显示。如果不能基本确定是字体问题。你需要为游戏配置一个支持目标语言字符的 TMP 字体。场景与作用域某些翻译可能只在特定场景生效。使用CtrlAltNumPad7热键查看当前场景 ID并检查你的翻译文件是否使用了#set level指令错误地限制了作用域。6.2 性能问题与游戏卡顿自动翻译是运行时操作处理不当会影响游戏流畅度。优化缓存确保[Behaviour]下的EnableBatching为True默认这会将多个翻译请求合并后发送减少网络请求次数。首次游玩时卡顿是正常的因为所有文本都需要在线翻译并写入缓存。玩过一段时间后缓存文件丰富起来性能会大幅提升。限制翻译长度检查MaxCharactersPerTranslation值过长的文本如整本日记发送到翻译服务会导致响应慢甚至超时。建议设置在 150-300 之间。过长的文本对于游戏体验本身也意义不大可以考虑忽略。关闭调试功能确保[Texture]下的EnableTextureDumping、EnableTextureScanOnSceneLoad、LoadUnmodifiedTextures以及[Debug]下的EnableLog都为False。这些都是开发/调试功能会严重消耗性能。选择低延迟的翻译服务如果使用免费谷歌翻译且网络不佳可以尝试更换为BaiduTranslate或LingoCloud有道智云它们的国内节点通常延迟更低。付费的 DeepL API 速度和稳定性都极佳。6.3 翻译质量不佳与乱码机器翻译毕竟不是人工。善用替换文件Substitutions在_Substitutions.txt文件中你可以定义简单的“查找-替换”规则。例如如果游戏角色名“アリス”总是被翻译成“爱丽丝”但你可能想要“艾莉丝”或者“MP”被翻译成“国会议员”而不是“魔法值”就在这里修正。格式和翻译文件一样アリス艾莉丝MP魔法值。这个文件中的规则会在文本发送给翻译引擎之前应用能从根本上纠正一些系统性误译。后处理Postprocessors对于翻译引擎返回结果的一些通病可以在_Postprocessors.txt中进行修正。例如DeepL 翻译中文时喜欢用“—”作为破折号但游戏字体可能显示不好你可以添加规则将其替换为“-”。或者统一调整标点符号的全角/半角。手动翻译优先对于核心词汇、物品名、技能名、角色名等务必进行精细的手动翻译并放入独立的高优先级手动翻译文件中。这能极大提升整体翻译体验的一致性。处理特殊编码如果翻译后的中文显示为乱码如“浣犲ソ”这通常是编码问题。确保你的翻译文件以UTF-8 with BOM格式保存。大多数现代代码编辑器如 VSCode、Notepad都可以在保存时选择编码格式。6.4 分发汉化补丁的注意事项如果你想将自己精心调校的翻译分享给其他玩家清理自动生成文件绝对不要直接分享包含大量自动生成条目的_AutoGeneratedTranslations.txt文件。里面可能包含你的游戏进度相关的私人文本且未经润色质量参差不齐。只分享你确认过、修改过的手动翻译文件.txt或打包成.zip。禁用危险配置在分享的配置文件中务必确保以下选项为FalseEnableTextureDumpingLoadUnmodifiedTexturesDetectDuplicateTextureNamesOutputUntranslatableText[Debug]下的所有选项 将MaxCharactersPerTranslation设置回默认值如 150不要超过 400。包含字体文件如果你使用了自定义字体需要将字体 AssetBundle 文件一并打包并在说明中清晰指示放置路径和配置方法。测试与说明在不同游戏版本上测试你的补丁。撰写清晰的README.txt说明安装步骤、配置方法、已知问题以及如何反馈错误。XUnity.AutoTranslator 是一个将“不可能”变为“可能”的工具。它从底层解构了 Unity 游戏的文本和资源呈现机制并搭建了一个高度可扩展的翻译框架。从玩家角度它提供了即时消除语言障碍的能力从 Modder 和开发者角度它提供了一个强大的、可用于深度定制游戏内容的平台。掌握它不仅意味着能玩到更多游戏更意味着你拥有了改造游戏、创造个性化体验的钥匙。它的魅力在于你投入的每一分精力去完善翻译、调整 UI最终都会转化为更沉浸、更舒适的游戏时光。