尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Unity游戏实时翻译插件XUnity.AutoTranslator:从原理到实战全解析

Unity游戏实时翻译插件XUnity.AutoTranslator:从原理到实战全解析 1. 项目概述与核心价值如果你是一位热爱探索全球独立游戏或日系RPG的玩家肯定遇到过语言不通的尴尬。面对满屏的异国文字即使游戏本身再精彩体验也会大打折扣。手动截图、切出游戏查翻译软件那沉浸感早就碎了一地。今天要聊的XUnity.AutoTranslator就是专门为解决这个痛点而生的神器。它是一个功能强大的Unity游戏实时翻译插件能够在你游戏的过程中自动将屏幕上的文本比如对话、菜单、物品描述翻译成你指定的语言并且几乎不打断你的游戏流程。简单来说它的工作原理就像给你的游戏装了一个“同声传译”。插件会“监听”游戏内所有文本的显示调用当检测到需要翻译的文本时它会先在本地的翻译文件中查找是否有预设的翻译如果没有就会调用你配置好的在线翻译服务如Google Translate、DeepL等进行实时翻译并将结果缓存下来下次再遇到相同的文本就直接使用缓存既快又省流量。更厉害的是它不仅能处理文字还能通过资源重定向功能替换游戏内的图片比如带文字的UI图实现真正意义上的“全界面汉化”。对于玩家而言这意味着可以无障碍畅玩大量没有官方中文的佳作。对于Mod作者或汉化组它提供了一个高效、可扩展的框架来制作和分发翻译补丁。这个项目在Github上由bbepis维护更新活跃社区支持良好是Unity游戏翻译领域事实上的标准解决方案之一。2. 核心工作机制与架构拆解要玩转XUnity.AutoTranslator不能只停留在“安装即用”的层面理解其内部机制能帮你更好地排查问题和进行高级定制。它的核心架构可以拆解为几个关键部分。2.1 文本钩取与替换流程这是插件最核心的功能。Unity游戏在屏幕上显示文字最终都会调用诸如TextMeshPro的text属性Setter或是UGUI的Text.text属性。XUnity.AutoTranslator利用Harmony一个.NET运行时补丁库或MonoMod运行时钩子在这些关键方法被调用前进行拦截。拦截到原始文本后插件会启动一个复杂的查询流程文本规范化首先对原始文本进行处理比如去除首尾空格、处理内部换行符周围的空白字符。这是因为游戏引擎在不同上下文如对话历史记录和实时对话框中可能会对同一个句子添加不同的格式符号规范化能确保“同じ文章”和“同じ文章\n”被识别为同一个待翻译条目。多级缓存查询插件会按照预设的优先级进行查找手动翻译文件优先在Translation/{Lang}/Text/目录下的.txt文件中查找精确匹配或正则表达式匹配。自动生成缓存接着查找_AutoGeneratedTranslations.txt文件这里面是之前在线翻译并缓存下来的结果。在线翻译服务如果以上都没找到且你配置了在线端点Endpoint插件就会将文本发送给相应的翻译API。文本替换与UI适配获取到翻译文本后插件会将其设置回游戏的Text组件。这里涉及一个常见问题翻译后的文本长度很可能超过原文导致显示不全或换行混乱。为此插件内置了UI自动调整功能需在配置中开启EnableUIResizing它会尝试修改Text组件的HorizontalOverflow和VerticalOverflow属性或者调整FontSize来适应新文本。实操心得文本钩取的稳定性高度依赖于游戏使用的UI框架和Unity版本。对于使用旧版NGUI或IMGUI的游戏可能需要开启IgnoreWhitespaceInNGUI或EnableIMGUI等特定选项。如果遇到某些文本不翻译可以尝试在配置中开启EnableLog和EnableConsole查看插件是否成功钩取到了该文本组件。2.2 资源重定向机制这是实现图片翻译和深度Mod的基础。Unity游戏的大部分资源图片、音频、文本资产等都是通过Resources.Load或AssetBundle.LoadAsset这类API加载的。XUnity.AutoTranslator集成了一个独立的库XUnity.ResourceRedirector它可以拦截这些加载调用。当游戏尝试加载一个资源时Resource Redirector会先检查在配置的PreferredStoragePath例如Translation/zh-CN/RedirectedResources目录下是否存在同名或同哈希值的替代资源。如果存在则加载你提供的这个资源文件而不是游戏原始包内的文件。这就实现了不修改游戏原始文件的前提下替换游戏内的贴图、字体甚至脚本。对于图片翻译插件会计算游戏内纹理Texture的哈希值根据TextureHashGenerationStrategy配置可能基于图片名或图片数据并将带哈希值的文件名如ui_icon [ABCD1234].png输出到TextureDirectory。你只需要用修图软件打开这个图片把上面的外文改成中文再保存回原路径游戏下次运行时就会自动加载你修改后的版本。2.3 配置系统与热键插件的所有行为都由一个Config.ini文件控制。这个文件结构清晰分为[General]、[Behaviour]、[Texture]等多个区块每个区块下又有数十个细分配置项。初次使用可能会觉得眼花缭乱但绝大多数情况下你只需要关注几个关键配置Language目标翻译语言如zh-CN简体中文。Endpoint在线翻译服务例如GoogleTranslate免费但可能不稳定、BaiduTranslate需要AppID和密钥、DeepL质量高但收费。EnableUIResizing是否启用UI自动重设大小解决文字显示不全问题。MaxCharactersPerTranslation单次翻译的最大字符数防止翻译长文本时超时或出错建议不要超过400。插件还提供了一系列实用的热键让你能在游戏中动态控制Alt 0打开翻译端点选择窗口快速切换翻译服务或关闭自动翻译。Alt T全局切换翻译功能的开启/关闭。Alt R强制重新加载所有翻译文件在你手动修改了翻译文本后立即生效。Ctrl Alt Numpad7在控制台打印当前加载的游戏场景ID用于高级的翻译范围限定Scoping。3. 从零开始完整安装与配置指南理论讲完我们进入实战环节。假设我们要为一款名为MyUnityGame.exe的独立游戏安装汉化补丁。3.1 环境准备与插件安装首先你需要确定游戏使用的Mod加载器。XUnity.AutoTranslator支持三种主流框架BepInEx 5/6目前最主流的选择适用于大多数基于Unity的游戏特别是Steam上的独立游戏。你需要先安装BepInEx。IPA主要用于日本地区的音游或特定类型的游戏。ReiPatcher较老的注入工具现在用的不多了。这里以最常用的BepInEx 5为例安装BepInEx从BepInEx的GitHub Releases页面下载对应版本通常是一个压缩包。将其解压到游戏根目录即MyUnityGame.exe所在的文件夹。运行一次游戏如果成功会生成BepInEx文件夹及其子目录。安装XUnity.AutoTranslator从项目的Release页面下载XUnity.AutoTranslator-BepInEx-{VERSION}.zip。解压后你会看到plugins和patchers等文件夹。将plugins文件夹下的XUnity.AutoTranslator整个文件夹复制到游戏目录的BepInEx\plugins下。如果压缩包内有patchers文件夹也一并复制到BepInEx目录下。安装翻译端点可选如果你打算使用在线翻译需要确保对应端点的DLL存在。通常基础包会包含GoogleTranslate等免费端点。如果你想使用BaiduTranslate或DeepL需要从Release页面下载XUnity.AutoTranslator-Translators-{VERSION}.zip解压后将里面的DLL文件放到BepInEx\plugins\XUnity.AutoTranslator\Translators目录下。完成后的目录结构应类似游戏根目录/ ├── MyUnityGame.exe ├── BepInEx/ │ ├── core/ │ ├── plugins/ │ │ └── XUnity.AutoTranslator/ │ │ ├── Config.ini │ │ ├── Translation/ │ │ ├── Translators/ (可选存放百度、DeepL等端点DLL) │ │ └── XUnity.AutoTranslator.dll │ └── patchers/ (可能包含XUnity.AutoTranslator的补丁器)3.2 核心配置文件详解首次运行游戏后插件会在BepInEx\plugins\XUnity.AutoTranslator下生成默认的Config.ini。用记事本或VS Code等文本编辑器打开它我们来修改关键配置。基础设置 ([General]区块)[General] Languagezh-CN EndpointGoogleTranslate ; 在线翻译服务可选GoogleTranslate, BingTranslate, BaiduTranslate, DeepL等 ; 如果留空或设为空字符串则只使用本地翻译文件不进行在线翻译将Language设为zh-CN这是我们需要的简体中文。Endpoint先设为GoogleTranslate这是最方便的无门槛选择。行为设置 ([Behaviour]区块)[Behaviour] EnableTranslationTrue EnableUIResizingTrue ForceUIResizingFalse MaxCharactersPerTranslation400 EnableBatchingTrue EnableTextPathLoggingFalse ; 调试时开启会输出所有文本组件的路径EnableUIResizingTrue强烈建议开启让插件自动调整文本框大小以适应翻译文本。MaxCharactersPerTranslation400这是安全值防止超长文本如一整本书被发送到翻译API导致请求失败或被封禁。绝对不要为了翻译长文本而将此值改得过大特别是准备分享配置时。EnableBatchingTrue开启请求合并将多个短句合并成一个请求发送能显著减少API调用次数。在线翻译服务配置如果你使用GoogleTranslate通常无需额外配置。但如果遇到连接问题在某些地区可能需要配置代理或备用地址这涉及到[Google]区块的ServiceUrl普通用户不建议修改。如果你想使用百度翻译需要先申请API登录百度翻译开放平台创建通用翻译服务获取AppID和密钥。在Config.ini中配置[General] EndpointBaiduTranslate [Baidu] BaiduAppId你的AppID BaiduAppSecret你的密钥百度翻译有免费额度对于个人玩家完全够用且在国内访问速度稳定。文件与目录设置 ([Files]区块)[Files] DirectoryTranslation\{Lang}\Text OutputFileTranslation\{Lang}\Text\_AutoGeneratedTranslations.txt SubstitutionFileTranslation\{Lang}\Text\_Substitutions.txt PreprocessorsFileTranslation\{Lang}\Text\_Preprocessors.txt PostprocessorsFileTranslation\{Lang}\Text\_Postprocessors.txt这部分定义了翻译文件的存储路径。{Lang}是占位符会自动替换为[General]里设置的Language值。翻译文件都会放在Translation\zh-CN\Text这个文件夹里。OutputFile是插件自动生成和读取翻译缓存的地方。3.3 首次运行与初步测试配置完成后启动游戏。如果一切正常游戏画面应该没有明显变化但你可以尝试触发一些游戏内文本比如打开菜单、开始新游戏看到对话。测试热键在游戏中按下Alt0屏幕左上角应该会出现一个小的下拉菜单显示当前使用的翻译端点如GoogleTranslate。你可以在这里切换或关闭翻译。观察生成文件玩几分钟后退出游戏。检查BepInEx\plugins\XUnity.AutoTranslator\Translation\zh-CN\Text目录应该会生成一个_AutoGeneratedTranslations.txt文件。用记事本打开你会看到类似这样的内容Welcome to the village!欢迎来到村庄 Press [Enter] to continue.按[Enter]继续。这证明插件已经成功抓取文本并调用在线翻译服务完成了初次翻译和缓存。注意事项首次运行时由于需要向在线翻译API发送请求并等待返回游戏可能会有轻微的卡顿这是正常的。后续再遇到相同文本时会直接读取本地缓存速度极快。如果游戏完全没有反应请检查BepInEx的日志文件位于BepInEx\LogOutput.log查看是否有加载错误。4. 高级功能与深度定制实战基础翻译跑通后你可以通过以下高级功能来优化翻译体验甚至制作可分发的汉化补丁。4.1 手动翻译与词条管理自动翻译的质量尤其是对于游戏专有名词、技能名、角色名往往不尽如人意。这时就需要手动干预。直接修改缓存文件打开_AutoGeneratedTranslations.txt找到翻译错误的句子。例如自动翻译可能把技能名“Fireball”译成“火球”但游戏内语境可能是“炎爆术”。你可以直接修改等号右边的部分Fireball炎爆术保存文件回到游戏按AltR热键重载翻译对应的文本就会立即更新。创建独立翻译文件不建议直接在_AutoGeneratedTranslations.txt里进行大量修改因为这个文件会被插件不断追加新内容。更好的做法是新建一个.txt文件比如Manual_Translations.txt放在同一个Text文件夹下。将你需要修正的词条剪切过去。插件会读取该目录下所有.txt文件并且手动文件的优先级高于自动生成的文件。这样即使自动文件更新也不会覆盖你的精心修正。使用替换规则 (_Substitutions.txt)对于经常被误翻译的固定词组或名字可以使用替换文件。例如角色名“John”可能被翻译成“约翰”但你希望保留原文。在_Substitutions.txt中写入John{{A}}这样插件在翻译前会先将文本中的“John”替换为参数{{A}}生成翻译条目{{A}}约翰。但更妙的是你可以在手动翻译文件中直接写{{A}}John这样所有包含“John”的句子这个名字都会保持原样而句子的其他部分正常翻译。注意替换规则不支持正则表达式且对性能有轻微影响应谨慎使用。4.2 正则表达式与文本拆分游戏有时会将多个文本拼接后显示例如“01 Iron Sword”。如果只翻译了“Iron Sword铁剑”那么“01 Iron Sword”是无法匹配的。这时就需要用到拆分器正则表达式 (Splitter Regex)。在任意翻译文件除了以_开头的自动文件中你可以这样写sr:^([0-9]{2}) ([\S\s])$$1 $2sr:表示这是一个拆分器正则。^([0-9]{2}) ([\S\s])$是正则表达式匹配以两位数字开头后跟空格再跟任意字符的文本。括号()表示捕获组。$1 $2是替换模式$1代表第一个捕获组两位数字$2代表第二个捕获组后面的文本。插件会先将“01 Iron Sword”拆分成“01”和“Iron Sword”然后分别去翻译词典中查找。由于“Iron Sword”有对应的翻译“铁剑”所以最终组合成“01 铁剑”。更复杂的例子用于处理带属性加成的装备描述sr:^\[(?stat[\w\s])(?num_i[\\-]{1}[0-9])?\](?after[\s\S])?$[${stat}${num_i}]${after}这里使用了命名捕获组(?name...)。num_i后面的_i表示这个捕获组的内容数字部分将不会被尝试翻译ifor ignore而是原样传递。这对于处理游戏内的公式、代码片段非常有用。实操心得正则表达式功能强大但复杂滥用会导致性能下降和难以维护。建议只在确实需要处理模式化文本时使用并且尽量让表达式精确匹配目标文本避免过于宽泛的匹配。4.3 字体替换与UI修复翻译成中文等非拉丁语系语言后游戏自带的字体可能缺少相应字符导致显示为方框□□□。这就需要替换字体。获取字体文件你需要一个包含目标语言字符的字体文件且最好是.ttf或.otf格式。网上有许多游戏汉化常用的字体包如“思源黑体”、“方正准圆”等。务必注意字体版权用于个人学习研究通常问题不大但分发汉化补丁时需谨慎。创建字体AssetBundleUnity游戏使用的字体通常是特殊的TMP_FontAsset或Font资产不能直接使用.ttf文件。你需要使用与游戏相同版本的Unity Editor将字体文件导入创建TMP_FontAsset然后将其打包成AssetBundle。这是一个相对专业的步骤需要一定的Unity操作知识。社区有热心网友分享了一些预制的字体AssetBundle可以在相关论坛或Discord频道寻找。配置字体覆盖将制作好的字体AssetBundle文件例如chinese_font.bundle放入游戏根目录。然后在Config.ini中配置[Behaviour] OverrideFontTextMeshProchinese_font如果游戏使用UGUI则配置OverrideFont。插件会尝试加载名为chinese_font的AssetBundle并使用其中的字体资源。如果不想折腾AssetBundle对于TextMeshPro 3.2.0的游戏可以尝试直接使用系统字体[Behaviour] FallbackFontTextMeshProMicrosoft YaHei这会将“微软雅黑”添加为后备字体当游戏默认字体缺少字符时会尝试使用它。4.4 图片翻译纹理替换对于嵌入在UI图片中的文字文本翻译插件无能为力。这时就需要用到纹理替换功能。启用并配置在Config.ini中开启相关功能。[Texture] EnableTextureTranslationTrue EnableTextureDumpingTrue ; 首次使用时开启用于导出图片 TextureDirectoryTranslation\Texture TextureHashGenerationStrategyFromImageName CacheTexturesInMemoryTrue导出游戏图片以这个配置启动游戏并浏览你需要翻译的UI部分主菜单、物品栏等。插件会将游戏加载的纹理图片导出到Translation\Texture目录下文件名类似btn_start [A1B2C3D4].png。哈希值[A1B2C3D4]用于唯一标识这张图片。编辑图片用Photoshop、GIMP或任何你熟悉的图片编辑软件打开导出的PNG文件将上面的外文修改为中文。关键一步保存时务必保留原始的文件名和哈希值部分。你可以修改“btn_start”这个前缀但[A1B2C3D4]必须原封不动。关闭导出享受成果编辑完所有需要的图片后将配置中的EnableTextureDumping改回False以防止插件不断导出新图片影响性能。重新启动游戏修改后的图片就应该被加载并显示了。重要警告EnableTextureDumping、EnableTextureToggling、LoadUnmodifiedTextures、DetectDuplicateTextureNames这几个选项会显著影响性能且可能导致视觉错误。在制作完汉化补丁准备分发时必须确保它们都是False。分发时也只应包含你修改过的图片文件。5. 疑难杂症排查与性能优化即使按照教程操作也难免会遇到各种问题。下面是一些常见问题的排查思路和解决方案。5.1 常见问题速查表问题现象可能原因解决方案游戏启动崩溃或报错1. BepInEx版本与游戏不兼容。2. XUnity.AutoTranslator版本与游戏或BepInEx不兼容。3. 缺少必要的依赖库如VC运行库。1. 尝试更换BepInEx版本如从v5换到v6或反之。2. 尝试使用插件更旧或更新的版本。3. 安装最新的Visual C Redistributable。检查BepInEx\LogOutput.log看具体错误。游戏运行正常但没有任何文本被翻译1. 翻译功能未启用EnableTranslationFalse。2. 在线端点配置错误或无法连接。3. 游戏使用的UI框架特殊未被钩取。1. 检查Config.ini确保EnableTranslationTrue。2. 按Alt0检查端点是否选中。尝试切换为GoogleTranslate最通用。检查网络连接。3. 尝试开启EnableIMGUITrue对旧式GUI或EnableSpriteRendererHookingTrue对Sprite文本。开启EnableLog查看控制台输出。翻译出现但显示为方框□□游戏字体缺少目标语言字符集。配置字体覆盖OverrideFontTextMeshPro或FallbackFontTextMeshPro具体方法见4.3节。翻译文本显示不全被截断翻译后文本长度超过原文本框区域。确保EnableUIResizingTrue。如果无效可能需要手动编写resizer.txt文件来调整特定UI元素的字体大小或溢出模式。在线翻译速度慢游戏卡顿1. 网络延迟高。2.MaxCharactersPerTranslation设置过大翻译长文本超时。3. 未开启请求合并。1. 考虑使用本地翻译文件或更换更快的翻译源如国内用百度。2. 将该值设为400或更低。3. 确保EnableBatchingTrue。修改了手动翻译文件但游戏内未生效1. 文件编码不是UTF-8 without BOM。2. 文件未放在正确的Translation\{Lang}\Text目录下。3. 未按AltR重载翻译。1. 使用Notepad、VS Code等编辑器确保以UTF-8无BOM格式保存。2. 检查路径是否正确{Lang}是否与配置一致。3. 游戏中按AltR。图片替换功能不工作1. 未开启EnableTextureTranslation。2. 图片哈希生成策略不匹配。3. 编辑后的图片哈希值改变。1. 检查配置。2. 尝试将TextureHashGenerationStrategy从FromImageName改为FromImageData性能有代价。3.绝对不要用Windows画图等会修改图片数据的软件保存建议用GIMP或Photoshop导出时选择“存储为”并确保不重新压缩。5.2 性能优化与配置建议为了让翻译插件运行得更流畅特别是在配置较低的电脑上可以调整以下配置关闭调试日志在正常使用后确保以下选项为False它们会向控制台输出大量信息影响性能。[Debug] EnableConsoleFalse EnableLogFalse [Behaviour] EnableTextPathLoggingFalse合理使用缓存在线翻译的文本会自动存入_AutoGeneratedTranslations.txt。一个成熟的汉化补丁应该包含一个尽可能完整的该文件这样用户安装后绝大部分文本都无需再请求在线翻译速度极快且稳定。这也是汉化组分发补丁的标准做法。纹理内存管理如果你使用了图片翻译确保CacheTexturesInMemoryTrue这会将替换的纹理常驻内存避免重复加载造成的卡顿。当然这会增加内存占用如果内存紧张可以设为False。限制翻译范围如果只为特定场景或界面制作翻译可以使用翻译范围限定Scoping。在翻译文件中使用#set level 场景ID指令或通过#set exe 游戏exe名来限定翻译生效的范围。这可以减少插件需要处理的文本量提升性能。警惕正则表达式在翻译文件中大量使用复杂正则表达式尤其是sr:拆分器会显著增加文本匹配时的CPU开销。只在必要时使用并确保表达式尽可能高效。5.3 为IL2CPP编译的游戏提供支持越来越多的Unity游戏使用IL2CPP后端进行编译以获得更好的性能和安全性。XUnity.AutoTranslator对IL2CPP的支持是实验性的可能存在一些问题文本钩取不完整某些动态生成的文本可能无法被捕获。社区提供了一个辅助插件AutoTranslator.IL2CPP.BruteForceFix可以尝试强制刷新文本组件来缓解此问题。部分功能缺失TextGetterCompatibilityMode、IMGUI翻译等功能在IL2CPP下可能不可用。安装更复杂对于IL2CPP游戏BepInEx的安装通常需要额外的winhttp.dll代理或Doorstop配置具体请参考BepInEx官方文档针对IL2CPP的安装指南。如果你的目标游戏是IL2CPP编译的需要有更多耐心进行测试和调试并密切关注插件更新日志中对IL2CPP的改进。6. 制作与分发可复用的汉化补丁当你为自己喜爱的游戏完成了一套满意的翻译后可能会想分享给其他玩家。制作一个“傻瓜包”式的汉化补丁能让更多人受益。清理工作目录删除Translation\zh-CN\Text\_AutoGeneratedTranslations.txt文件中所有未翻译的、错误的或低质量的条目只保留你确认过、修改好的翻译。删除Translation\Texture目录下所有你未曾修改过的原始图片导出文件。只保留你真正汉化过的图片。再次检查Config.ini确保所有调试选项如EnableTextureDumpingEnableLog和可能带来性能问题的选项如MaxCharactersPerTranslation超过400都已关闭或设置为安全值。提供一个清晰的README.txt说明补丁适用的游戏版本、安装方法通常是覆盖BepInEx\plugins\XUnity.AutoTranslator目录、以及如何配置如果需要用户自己填API密钥。结构化你的翻译文件不要把所有翻译都堆在_AutoGeneratedTranslations.txt里。可以按功能模块拆分Translation/zh-CN/Text/ ├── 01_系统菜单.txt ├── 02_物品与技能.txt ├── 03_主线剧情.txt ├── 04_支线对话.txt └── _AutoGeneratedTranslations.txt (仅作为备用缓存)这样结构清晰也方便其他贡献者协作。测试与兼容性在你的补丁发布前务必在纯净的游戏环境下删除旧的翻译文件测试安装流程。确保补丁不会导致游戏崩溃并且所有预期的翻译都已生效。如果游戏更新了你可能需要检查新的文本内容并更新翻译文件。尊重版权与开源协议XUnity.AutoTranslator本身是开源项目。你制作的翻译文件文本和图片是你的劳动成果但分发时请尊重原游戏开发者的版权。通常非官方的翻译补丁遵循“不包含游戏本体仅为学习交流”的原则进行分享。从我个人的经验来看XUnity.AutoTranslator的强大之处在于它建立了一个标准化的、非侵入式的游戏文本修改框架。它不仅仅是一个“翻译器”更是一个通用的“游戏文本Hook与替换平台”。理解了它的运作机制你甚至可以用它来做一些更有趣的事情比如统一游戏内的术语翻译风格或者为Mod作者提供插件界面的多语言支持。这个工具真正把选择权交还给了玩家和社区让语言不再成为体验优秀作品的障碍。
返回列表