三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

XUnity.AutoTranslator:Unity游戏实时翻译插件部署与高级配置指南

XUnity.AutoTranslator:Unity游戏实时翻译插件部署与高级配置指南

1. 项目概述与核心价值

如果你是一名热爱探索各种独立游戏、视觉小说或日系RPG的玩家,肯定遇到过语言不通的困扰。游戏本身质量上乘,但苦于没有官方中文,只能对着满屏的日文或英文干瞪眼,或者依赖社区大佬们不定时发布的汉化补丁。而汉化补丁的发布往往滞后于游戏版本更新,一旦游戏更新,补丁失效,存档可能损坏,体验瞬间归零。有没有一种方法,能让我们在游戏发布的第一时间,甚至是在游戏过程中,就实时看到中文翻译呢?

XUnity.AutoTranslator(以下简称XUAT)就是为了解决这个痛点而生的神器。它不是一个简单的文本替换工具,而是一个运行在游戏进程内的、高度可配置的自动翻译插件。其核心原理是“钩子”(Hooking)技术,在游戏运行时拦截所有文本渲染的调用,将获取到的原始文本(如日文)发送至你配置的在线翻译服务(如谷歌翻译、百度翻译等),然后将返回的译文实时替换到游戏界面上。整个过程对游戏本身几乎无感,你看到的就是即时翻译后的中文内容。

它的强大之处在于其“无侵入性”和“高度自动化”。你不需要解包游戏资源,不需要修改游戏代码,只需要将插件文件放入游戏目录,进行简单配置,就能让游戏“开口说中文”。这对于大量没有官方中文、但文本量巨大的日系ADV(冒险游戏)、RPG或独立游戏来说,无疑是福音。无论是Steam上的小众佳作,还是一些特定平台的游戏,只要它是基于Unity引擎开发的,XUAT就有很大概率能够胜任翻译工作。

当然,自动翻译的质量无法与专业人工精翻相比,尤其在处理文学性、双关语或特定文化梗时可能会词不达意。但对于理解游戏基本剧情、菜单选项和系统说明来说,它提供的帮助是决定性的。它让你从“完全看不懂”进阶到“能看懂大意”,极大地降低了语言门槛。更重要的是,它赋予了玩家主动权,你再也不用苦苦等待某个特定游戏的汉化组更新了。

2. 插件部署与环境准备

2.1 核心组件与依赖关系

XUAT并非一个孤立的DLL文件,它依赖于一个名为BepInEx的Unity游戏模组框架。你可以把BepInEx理解为在Unity游戏内部运行的一个“微型的、安全的操作系统”,它为各种插件(Mod)提供了加载、管理和运行的基础环境。XUAT则是运行在这个环境上的一个高级应用程序。

因此,部署XUAT的第一步,是为目标游戏安装BepInEx。这个过程通常被称为“给游戏打Mod框架”。幸运的是,对于绝大多数Unity游戏,这个过程已经高度标准化。你需要找到与游戏版本(特别是其使用的Unity版本和运行环境,如Mono或IL2CPP)相匹配的BepInEx版本。通常,在游戏的社区或Mod站(如Nexus Mods、GitHub Releases)上,都能找到玩家打包好的、针对特定游戏的BepInEx整合包。

注意:务必确认BepInEx的版本与游戏兼容。使用错误版本的BepInEx可能导致游戏无法启动。一个简单的判断方法是,查看游戏根目录下是否存在UnityPlayer.dllGameAssembly.dll(后者是IL2CPP编译的标识)。IL2CPP游戏需要专门适配的BepInEx版本。

2.2 安装步骤详解

假设我们已经为游戏MyUnityGame成功安装好了BepInEx。安装后的游戏目录结构通常如下:

MyUnityGame/ ├── MyUnityGame.exe ├── UnityPlayer.dll ├── BepInEx/ │ ├── core/ │ ├── plugins/ │ └── config/ └── (其他游戏文件)

XUAT的安装,本质上就是将下载的插件包解压,并将其中的核心文件放置到正确的目录。

  1. 获取插件:从XUAT的GitHub Releases页面下载最新的XUnity.AutoTranslator-BepInEx-{VERSION}.zip文件。请务必选择带BepInEx标签的版本,这是为BepInEx环境预编译的。
  2. 解压与放置:将ZIP文件解压,你会看到类似以下结构的文件夹:
    XUnity.AutoTranslator-BepInEx-5.4.21/ ├── BepInEx/ │ └── plugins/ │ └── XUnity.AutoTranslator/ │ ├── AutoTranslatorConfig.ini │ ├── XUnity.AutoTranslator.dll │ ├── XUnity.Common.dll │ └── XUnity.ResourceRedirector.dll └── (可能还有其他说明文件)
  3. 合并目录:将解压出的BepInEx文件夹整体复制到你的游戏根目录(即MyUnityGame/下)。如果系统提示有重复文件,选择合并即可。最终,XUnity.AutoTranslator文件夹应该位于MyUnityGame/BepInEx/plugins/之下。
  4. 首次运行:启动游戏。如果一切正常,游戏会照常运行。首次运行XUAT时,它会在BepInEx/plugins/XUnity.AutoTranslator/目录下生成完整的配置文件和一个名为Translation的文件夹。此时,插件已加载,但尚未激活任何翻译服务。

2.3 基础配置与翻译服务选择

安装完成后,我们需要进行最关键的一步:配置翻译引擎。所有配置都集中在AutoTranslatorConfig.ini文件中。用任何文本编辑器(如Notepad++、VS Code)打开它。

找到[General]章节下的LanguageEndpoint配置项:

[General] ; 目标语言,例如简体中文 Language=zh-CN ; 翻译服务端点,例如谷歌翻译 Endpoint=GoogleTranslate
  • Language:设置为你希望翻译成的语言代码。例如,zh-CN(简体中文)、zh-TW(繁体中文)、en(英文)、ja(日文)等。这个列表取决于你后续配置的翻译服务所支持的语言。
  • Endpoint:这是核心,指定使用哪个翻译服务。XUAT内置了多个“端点”(Endpoint),每个对应一个翻译API。初始状态下,Endpoint=是空的,意味着翻译功能未启用。你需要将其设置为一个有效的端点名。

XUAT内置的免费公共端点主要有:

  • GoogleTranslate: 谷歌翻译的公共网页端接口。无需API密钥,但稳定性取决于网络环境,且有频率限制。
  • BaiduTranslate: 百度翻译的公共接口。同样无需密钥,在国内网络环境下通常更稳定。
  • YandexTranslate: 俄罗斯Yandex的翻译服务。
  • PapagoTranslate: 韩国Naver的Papago翻译。

此外,它还支持需要API密钥的“合法”端点,如GoogleTranslateLegitimate,BaiduTranslate,DeepLLegitimate等。这些服务需要你在对应官网注册并获取API Key,配置在INI文件相应的章节中,通常翻译质量和限额会更好。

对于绝大多数用户,我建议从GoogleTranslateBaiduTranslate开始。以配置百度翻译为例:

  1. Endpoint设置为BaiduTranslate
  2. 由于是公共端点,通常无需配置[Baidu]章节下的BaiduAppIdBaiduAppSecret(留空即可)。插件会使用内置的公共应用ID和密钥,但有每日限额。

配置完成后,保存INI文件,重新启动游戏。此时,当你进入游戏,看到任何文本时,可以尝试按下默认的翻译热键ALT+T。如果配置正确,游戏中的文本应该会从原文变为中文。第一次翻译某句文本时,会有短暂的网络请求延迟,翻译结果会被插件缓存到本地文件Translation\zh-CN\Text\_AutoGeneratedTranslations.txt中。下次再遇到相同句子,就会直接读取缓存,实现瞬间翻译。

3. 核心功能深度解析与高级配置

3.1 翻译流程与文本处理机制

XUAT的翻译并非简单的“见字翻字”。为了应对游戏引擎中文本呈现的复杂性,它实现了一套精巧的文本查找和预处理机制。理解这个过程,有助于你排查一些翻译不生效或翻译错误的问题。

当游戏尝试在屏幕上绘制一段文本时,XUAT会拦截这个调用,获取到原始的文本字符串。但在进行字典查询或发送给翻译API之前,插件会对文本进行一系列“标准化”处理,主要是处理空白字符(空格、换行符等)。

游戏中的同一句对话,在不同上下文(如对话历史记录、文本框)中,其字符串形式可能有细微差别,比如开头多一个换行符\n,或者句子中间多了空格。如果严格匹配字符串,我们就需要为“你好”和“\n你好”准备两条翻译记录,这显然不高效。

XUAT的解决方案是进行四次递进式查找:

  1. 原始文本:完全匹配原始字符串。
  2. 去除首尾空白:去掉文本开头和结尾的空格、换行符后匹配。
  3. 规整内部空白:将文本内部连续的空白字符(尤其是包围换行符的空白)标准化后匹配。
  4. 综合处理:同时进行2和3的操作后匹配。

同时,当一条翻译被学习或手动添加后,XUAT会自动为它生成多个“变体”条目存入内部字典,以覆盖上述不同格式的原文。这意味着,你通常只需要在翻译文件中记录最“干净”的文本形式(如“你好”),插件就能自动处理带有额外空白字符的变体(如“\n你好”)。

这个行为由[Behaviour]章节下的CacheWhitespaceDifferences配置控制。默认是False,即插件不会在_AutoGeneratedTranslations.txt文件中为每个空白字符变体都生成一条记录,以保持文件简洁。如果你在手动编辑翻译文件时,发现某个带特殊空格的句子没被翻译,可以临时将此选项设为True,让插件生成所有变体记录以供参考,之后再改回False

3.2 手动翻译与词典管理

自动翻译是基础,但想要获得更好的体验,手动修正和补充词典是必不可少的。XUAT的翻译文件管理系统非常灵活。

所有翻译文件都存放在Translation\{Language}\Text\目录下(例如Translation\zh-CN\Text\)。插件会读取该目录下所有.txt文件(包括ZIP压缩包内的),并将它们合并为一个翻译词典。文件的读取有优先级顺序,后加载的文件会覆盖先加载文件中相同的条目。而自动生成的_AutoGeneratedTranslations.txt文件优先级最低

这为我们管理翻译提供了极大的便利:

  1. 修正自动翻译:自动翻译的句子不通顺?直接打开_AutoGeneratedTranslations.txt,找到对应的行进行修改。例如:
    ; 自动生成的可能不准确 これは剣です=这是一把剑 ; 你可以手动修正为 これは剣です=此乃宝剑
    保存文件后,在游戏中按ALT+R热键即可重载翻译,立即看到效果。
  2. 创建独立词典:不建议直接大量修改_AutoGeneratedTranslations.txt,因为游戏更新或插件重置时它可能被覆盖。更好的做法是新建一个自己的翻译文件,例如MyManualTranslations.txt,放在同一个Text文件夹下。将需要修正或补充的条目从自动生成文件里剪切过来,在这里进行编辑。由于自定义文件优先级更高,你的修正会生效。
  3. 使用正则表达式:对于有规律的文本(如物品名称“力量药水 I”、“力量药水 II”),可以使用正则表达式进行批量翻译。在翻译文件中,以r:开头的行会被识别为正则表达式。
    ; 将“力量药水”后面跟罗马数字的格式统一翻译 r:"^Power Potion ([IVXLCDM]+)$"="力量药水 $1"
    这行规则会将 “Power Potion III” 翻译为 “力量药水 III”。正则表达式功能强大,但需谨慎使用,错误的表达式可能导致性能下降或翻译错乱。
  4. 拆分器正则表达式 (sr:):这是更高级的功能,用于处理游戏将多个文本拼接后显示的情况。例如,游戏可能显示“01 シンプルリング”(01 简单戒指)。如果我们只有“シンプルリング=简单戒指”这条翻译,是无法匹配的。此时可以定义一个拆分器:
    sr:"^([0-9]{2}) ([\S\s]+)$"=$1 $2
    这个sr:规则会将“01 シンプルリング”拆分成“01”和“シンプルリング”两部分。插件会尝试翻译第二部分“シンプルリング”,成功后与第一部分“01”重新组合,得到“01 简单戒指”。

3.3 字体与UI适配问题解决

翻译中最常见也最棘手的问题之一就是字体显示和UI布局。许多游戏的默认字体字库不全,无法显示中文汉字,导致翻译后出现“口口口”的乱码(俗称“豆腐块”)。此外,英文单词通常较短,翻译成中文后文本长度可能增加,导致原有的文本框装不下,文字溢出或重叠。

XUAT提供了多种解决方案:

1. 字体覆盖 (Font Overriding)[Behaviour]章节中,有两个关键配置:

  • OverrideFontTextMeshPro: 为TextMeshPro组件指定一个备用字体AssetBundle的文件名。
  • FallbackFontTextMeshPro: 为TextMeshPro添加一个后备字体,当主字体缺失字符时,会尝试从后备字体中查找。

如何获取中文字体AssetBundle?这是一个技术活。通常需要拥有与游戏相同版本的Unity Editor,创建一个字体Asset,然后将其打包成AssetBundle。社区中也有一些热心玩家分享制作好的通用中文字体AssetBundle(例如在GitHub上搜索“sorrowmoil-MoeFont-for-XUnity.AutoTranslator”)。下载后,将.font.assetbundle文件放入游戏根目录,然后在配置中指定其文件名(不含路径)即可。

2. UI自动重设大小 (UI Auto-Resizing)[Behaviour]下的EnableUIResizing=True(默认)会尝试在翻译文本时,自动调整UI组件(如Unity的UGUI Text或TextMeshPro)的尺寸属性,以容纳更长的文本。它会尝试修改HorizontalOverflowVerticalOverflow等属性。

如果自动调整效果不佳,可以尝试启用ForceUIResizing=True。这会强制对所有文本组件应用重设大小逻辑,但可能破坏某些精心设计的UI布局。

3. 手动UI重设大小规则对于自动调整无法解决的特定UI元素,XUAT支持通过编写resizer.txt规则文件进行精细控制。你需要在Translation\{Lang}\目录下创建以.resizer.txt结尾的文件。

首先,你需要知道要调整的UI元素的完整路径。可以通过开启[Behaviour]下的EnableTextPathLogging=True,然后在游戏中触发该文本的显示,查看BepInEx的控制台日志来获取路径。

例如,日志输出:

[Info] Text path: TitleScreen/Canvas/Panel/StartButton/Text

那么,你可以在UIResizing.txt文件中添加规则:

TitleScreen/Canvas/Panel/StartButton/Text=ChangeFontSizeByPercentage(0.8)

这条规则会将“开始按钮”上文本的字体大小调整为原来的80%。你还可以组合多个命令,如ChangeFontSizeByPercentage(0.8);UGUI_HorizontalOverflow(overflow),意思是缩小字体到80%,并允许水平方向溢出(不换行)。

3.4 资源重定向与贴图翻译

XUAT不仅仅能翻译文本,其内置的Resource Redirector模块赋予了它更强大的能力:重定向游戏加载的任何资源,包括贴图(Texture)。这意味着你可以替换游戏内的图片,例如将日文的UI按钮、图标、标题画面替换为中文版本。

这是一个进阶功能,默认关闭。需要在[Texture]章节进行配置:

[Texture] EnableTextureTranslation=True TextureDirectory=Translation\Texture EnableTextureDumping=True ; 首次使用时开启,用于导出游戏原始贴图 EnableTextureScanOnSceneLoad=True ; 帮助发现更多可替换的贴图
  1. 导出贴图:首次配置并运行游戏后,插件会将游戏加载的贴图文件(通常是PNG格式)导出到Translation\Texture目录。文件名会包含一个基于贴图内容生成的哈希值,如button_icon [A1B2C3D4-E5F6A7B8].png
  2. 编辑贴图:用图像处理软件(如Photoshop、GIMP)打开导出的图片,将上面的日文/英文文字修改为中文。关键一步:保存时必须保持原文件名不变,包括中括号里的哈希值。这个哈希值是插件识别和匹配游戏内原始贴图的唯一依据。
  3. 替换贴图:将修改好的图片放回Translation\Texture目录(或子目录)。重启游戏,插件就会自动加载你修改后的贴图,替换游戏内的原始版本。
  4. 关闭导出:完成所有需要的贴图替换后,务必EnableTextureDumping改回False。否则每次运行游戏,它都会重新导出所有贴图,严重影响性能并产生大量垃圾文件。

重要警告:贴图替换功能对性能有影响,尤其是TextureHashGenerationStrategy=FromImageData(基于图像数据生成哈希)时。除非游戏贴图没有唯一资源名,否则强烈建议使用默认的FromImageName绝对不要在分享你的翻译补丁包时,开启EnableTextureDumpingEnableTextureTogglingLoadUnmodifiedTextures选项。

4. 高级技巧与疑难排错

4.1 翻译服务配置与优化

不同的翻译服务各有优劣,合理配置能极大提升体验。

  • 谷歌翻译 (GoogleTranslate):质量较高,支持语言广。但在某些网络环境下可能不稳定。如果遇到连接问题,可以尝试在[Google]章节下配置ServiceUrl指向一个可用的代理地址(注意:此操作需遵守当地法律法规,仅用于学术交流等合法目的)。
  • 百度翻译 (BaiduTranslate):国内访问速度快且稳定,对中文支持好。如果需要更高配额,可以申请百度翻译开放平台的官方API Key,填入[Baidu]章节的BaiduAppIdBaiduAppSecret
  • 批处理与限流:在[Behaviour]章节,EnableBatching=True可以将多个短句合并成一个请求发送,减少网络开销。MaxCharactersPerTranslation则限制单次翻译的文本长度,避免因翻译超长文本(如一整本书)导致API调用失败或超时。重要:如果你要分发整合了翻译的Mod,请确保此值不超过400,以避免对翻译服务造成过大压力。
  • 减少请求UseStaticTranslations=True会启用一个内置的英日基础词汇对照表,对于一些简单常见的词汇(如“OK”、“Yes”、“No”),会直接使用本地对照,而不发起网络请求,加快翻译速度。

4.2 常见问题与解决方案速查表

在实际使用中,你可能会遇到以下问题。这里提供一个快速排查指南:

问题现象可能原因解决方案
游戏启动崩溃或报错1. BepInEx版本与游戏不兼容。
2. XUAT插件版本与BepInEx或游戏不兼容。
3. 与其他Mod冲突。
1. 确认使用为游戏适配的BepInEx版本。
2. 尝试使用XUAT的旧版本或查看Issues中是否有相同问题。
3. 暂时移除其他Mod,仅保留XUAT测试。
游戏运行正常,但按ALT+T无反应,无翻译1.Endpoint配置为空或错误。
2. 翻译服务网络连接失败。
3. 热键被游戏或其他软件占用。
1. 检查AutoTranslatorConfig.ini[General]->Endpoint是否已设置(如GoogleTranslate)。
2. 尝试切换为BaiduTranslate测试网络。
3. 尝试在游戏中按ALT+0打开翻译器选择窗口,确认有服务被选中。检查游戏是否为全屏独占模式,可能拦截热键。
部分文本翻译了,部分没翻译1. 文本由特殊插件(如IMGUI)渲染,默认未启用。
2. 文本是图片形式(贴图文字)。
3. 文本路径被忽略。
1. 尝试设置[Behaviour]->EnableIMGUI=True
2. 开启贴图翻译功能(见3.4节)。
3. 检查IgnoreTextStartingWith配置,或开启EnableTextPathLogging查看该文本是否被钩住。
翻译后游戏逻辑出错或卡死游戏可能通过检查显示的文本来决定后续行为(较少见)。尝试设置[Behaviour]->TextGetterCompatibilityMode=True。此模式会“欺骗”游戏,让它认为显示的仍是原始文本。
翻译为中文后显示“口口口”游戏字体不支持中文。1. 配置中文字体覆盖(见3.3节)。
2. 对于TextMeshPro,尝试设置FallbackFontTextMeshPro为一个中文字体名称(如系统自带的“SimHei”黑体,但并非所有游戏支持)。
翻译文本溢出文本框或重叠中文文本比原文长。1. 确保EnableUIResizing=True
2. 对于特定UI,编写resizer.txt规则手动调整字体大小或溢出模式(见3.3节)。
3. 尝试调整[Behaviour]->ForceSplitTextAfterCharacters,在指定字符后强制换行。
自动翻译文件 (_AutoGeneratedTranslations.txt) 被重置或覆盖插件版本更新,或配置文件被重置。定期备份你的手动翻译文件(不要放在_AutoGeneratedTranslations.txt里)。将精心修正的翻译放在独立的MyTranslations.txt文件中。这样即使自动文件重置,你的修正依然有效。
IL2CPP游戏翻译不完整或需要手动刷新IL2CPP运行时限制,部分文本钩子不完善。使用社区提供的辅助插件AutoTranslator.IL2CPP.BruteForceFix,它可以强制刷新文本组件。在游戏内尝试按F5或其他自定义热键来触发刷新。

4.3 性能调优与最佳实践

为了让翻译插件运行得更顺畅,特别是在配置较低的电脑上,可以考虑以下优化:

  1. 合理使用缓存:翻译过的句子会被保存在内存和_AutoGeneratedTranslations.txt文件中。随着游戏进程,这个文件会越来越大。定期清理其中无意义或错误的翻译条目(比如单个字符、乱码),可以减少插件加载词典时的内存占用和查找时间。
  2. 关闭调试日志:在[Debug]章节,确保EnableConsole=FalseEnableLog=False,除非你正在排查问题。输出大量日志会严重影响游戏性能。
  3. 谨慎使用贴图翻译:如非必要,不要开启贴图翻译 (EnableTextureTranslation)。如果开启,确保CacheTexturesInMemory=True以用内存换取加载速度,并且绝对不要在分享配置时开启EnableTextureDumping
  4. 场景加载优化:对于大型开放世界游戏,在切换场景时翻译请求可能集中爆发。可以适当增加[Behaviour]章节下的MaxTranslationQueueSize(最大翻译队列大小)和MaxConcurrentTranslations(最大并发翻译数),避免队列堵塞。但注意调得太高可能触发翻译服务的频率限制。
  5. 翻译作用域:如果你只为游戏的某个DLC或特定部分制作翻译,可以使用翻译作用域功能。在翻译文件顶部使用#set level 场景ID#set exe 可执行文件名指令,让特定翻译只在该场景或该可执行文件下生效。这可以减少不必要的词典加载,提升一点点性能。

5. 开发者视角:扩展与集成

XUAT不仅是一个终端用户工具,也为Mod开发者提供了丰富的API,允许其他插件与之交互,甚至扩展其功能。

5.1 为其他Mod提供翻译支持

如果你是一名Unity游戏Mod的开发者,你可以让你Mod的界面文字也能被XUAT翻译。

方法一:自动翻译(针对UGUI/TextMeshPro)只要你的Mod使用Unity标准的TextTextMeshTextMeshPro组件来显示文字,XUAT在默认情况下就会自动钩住并尝试翻译。你几乎不需要做任何事。

方法二:阻止翻译有时你可能不希望自己的Mod界面被翻译(例如,界面本身就是多语言设计的)。有两种方法:

  1. 命名约定:将包含文本组件的GameObject名称中包含字符串XUAIGNORE。XUAT在创建组件时会检查此名称并忽略它。如果命名为XUAIGNORETREE,则会忽略该GameObject及其所有子物体上的文本组件。
  2. API调用(针对IMGUI):如果你的Mod使用IMGUI(OnGUI方法)绘制界面,可以在绘制代码块前后调用以下代码来临时禁用XUAT:
    // 在Start或Awake中查找一次即可 private GameObject _xua; private bool _lookedForXua; void OnGUI() { if(!_lookedForXua) { _lookedForXua = true; _xua = GameObject.Find( "___XUnityAutoTranslator" ); } try { _xua?.SendMessage("DisableAutoTranslator"); // 你的IMGUI绘制代码在这里 GUILayout.Label("My Untranslated Text"); } finally { _xua?.SendMessage("EnableAutoTranslator"); } }

方法三:插件特定翻译你可以为你的Mod创建独立的翻译文件。在Translation\{Lang}\Text\Plugins\目录下,创建一个以你的Mod的DLL文件名(不含扩展名)命名的文件夹,然后将翻译文件放入其中。你还可以在翻译文件中加入#enable fallback指令,允许在找不到插件特定翻译时,回退到全局的自动或手动翻译。

5.2 实现自定义翻译器

如果内置的翻译服务都不满足你的需求(例如,你想接入某个私有翻译API),你可以利用XUAT提供的接口,开发自己的翻译器。

你需要创建一个新的类库项目(.NET 3.5),引用XUnity.AutoTranslator.Plugin.Core.dll,然后实现ITranslateEndpoint接口或继承HttpEndpoint等基类。核心是完成Initialize(初始化,如读取配置、验证API Key)和Translate(执行翻译请求)两个方法。

一个简单的反向文本翻译器示例:

public class ReverseTranslatorEndpoint : ITranslateEndpoint { public string Id => "ReverseTranslator"; // 配置文件中使用的ID public string FriendlyName => "Text Reverser"; // 在插件选择列表中显示的名称 public int MaxConcurrency => 10; // 最大并发请求数 public int MaxTranslationsPerRequest => 1; // 每个请求最大翻译句子数 public void Initialize( IInitializationContext context ) { // 这里可以读取配置文件中的自定义设置 // context.GetOrCreateSetting("MySection", "MyKey", defaultValue); } public IEnumerator Translate( ITranslationContext context ) { // 这是一个简单的示例:将文本反转 var reversedText = new string( context.UntranslatedText.Reverse().ToArray() ); // 调用Complete表示翻译成功 context.Complete( reversedText ); // 如果是异步操作(如网络请求),这里应该yield return,并在回调中调用Complete return null; } }

编译生成的DLL,将其放入游戏目录的BepInEx/plugins/XUnity.AutoTranslator/Translators/文件夹中。重启游戏后,你就可以在翻译端点列表中找到并选择“Text Reverser”了。

5.3 使用资源重定向器API

Resource Redirector是一个独立但随XUAT分发的强大库。它允许你在游戏加载资源(Assets、AssetBundles、Resources)的瞬间拦截并修改它们。这不仅仅是翻译,你可以替换模型、音效、Shader,甚至动态修改游戏逻辑依赖的数据。

其核心是注册一系列钩子(Hook)回调函数。例如,注册一个资源加载后的钩子:

ResourceRedirection.RegisterResourceLoadedHook( HookBehaviour.OneCallbackPerResourceLoaded, 100, // 优先级 (ResourceLoadedContext context) => { // 检查加载的资源是否是纹理 if (context.Asset is Texture2D texture) { // 获取资源的唯一路径标识 string path = context.Parameters.Path; if (path.Contains("special_icon")) { // 加载我们自己的纹理替换它 Texture2D myTexture = LoadMyTexture(); context.Asset = myTexture; // 替换资源 context.Complete(true); // 完成,跳过其他后续钩子 } } });

这段代码会在游戏每次通过Resources.Load加载资源时被调用。如果加载的资源路径包含“special_icon”,我们就用自己的纹理替换它。这个功能为游戏Mod开发打开了无限可能,从简单的贴图替换到复杂的游戏内容修改都能实现。

XUnity.AutoTranslator从一个简单的文本钩子,成长为一个涵盖实时翻译、资源替换、开发者API的综合性Unity游戏本地化框架。它的强大在于其深度集成和高度可定制性。对于玩家,它是一把打开外语游戏大门的万能钥匙;对于Modder和汉化组,它提供了一个稳定、高效、可编程的本地化底层支持。掌握它的配置和原理,意味着你不仅能“用”,更能“用好”,甚至可以根据自己的需求“改造”它。游戏语言障碍的城墙,正在这样的工具面前逐渐瓦解。

← 返回列表