如何将 Unity 游戏翻译成英文(外部化文本)
使用 RuneTranslate 将 Unity 游戏翻译成英文的分步指南:读取 TextAssets、MonoBehaviour 字段和 StreamingAssets,为什么只支持外部化文本,以及标识符防护如何避免你弄坏游戏。
Unity 是越来越多日本独立游戏和视觉小说背后的引擎,也是常见引擎中最难翻译的一个,因为 Unity 没有单一的文本格式。对话可能存在于 TextAsset 数据块、MonoBehaviour 字符串字段、散落的 StreamingAssets 脚本中,或者被直接编译进 C# DLL。本指南将带你用 RuneTranslate 翻译一款 Unity 游戏,同样重要的是,讲清楚让 Unity 与众不同的那一条规则:仅限外部化文本。
先说最大的注意事项:仅限外部化文本
RuneTranslate 翻译存放在数据中的 Unity 文本——引擎在运行时加载的资源文件,包括 MonoBehaviour 组件上的字符串字段(对话、名称、标签)。它不会翻译的,是开发者硬编码进已编译 C# 代码中的文本——Mono 版本中的 Assembly-CSharp.dll,或 IL2CPP 二进制文件。MonoBehaviour 字段在 Mono 和 IL2CPP 两种版本上都能读取:RuneTranslate 从游戏自带的 DLL(Mono)获取它们的类型布局,或者在没有 Managed/ 文件夹时从 IL2CPP 元数据重建。实际情况是:把脚本保存在资源和组件中的游戏翻译效果好;把每一行都编译进代码的游戏只能部分翻译——而你要打开游戏之后才知道自己遇到的是哪一种,这也正是第一步。
你需要准备什么
- Windows 版 RuneTranslate——免费,所有引擎和服务商全部解锁。
- 一个 Unity 游戏文件夹——即包含游戏
.exe和<GameName>_Data/文件夹(其中有globalgamemanagers、resources.assets、data.unity3d和level*文件)的目录。 - 一种目标语言——英文、西班牙文、法文、德文、葡萄牙文、俄文、中文、意大利文、土耳其文、越南文,以及另外 20 多种。
- 一个翻译服务商。免费的 Google Translate 开箱即用;DeepL 有免费额度;OpenAI、Anthropic、本地模型以及任何兼容 OpenAI 的 API 都需要自备密钥。
第 1 步:打开游戏文件夹
启动 RuneTranslate,点击新建项目,把它指向 Unity 游戏目录。引擎检测会查找 _Data/ 文件夹,并将项目识别为 Unity。内置的 UnityPy Python 辅助程序(随安装程序附带)会打开资源文件,并把可读字符串列出到位于 %APPDATA%/RuneTranslate/unity-workspace/<projectId>/ 的每个项目独立工作区中。你的原始游戏文件夹绝不会被修改。Unity 属于尽力而为的引擎——在重新分发之前,请先确认导出的版本能够运行。
第 2 步:字符串是如何提取的
RuneTranslate 会从 Unity 外部化文本的每一处读取内容:
- TextAssets——嵌入在
.assets和 AssetBundles 中的 JSON / CSV / 脚本数据块,由能识别格式的提取器进行切分。 - MonoBehaviour 字符串字段——组件上显示的文本(对话、名称、标签),在 Mono 和 IL2CPP 两种版本上均可(类型信息来自游戏的 DLL,或从 IL2CPP 元数据重建)。
- StreamingAssets——散落的脚本文件(
.json、.txt、.csv、.ks),直接在磁盘上遍历。
Unity 也是过度翻译危害最大的地方,因此 RuneTranslate 为此内置了一道防护。很多 MonoBehaviour 字符串根本不是显示文本——它们是控制标识符和流程操作数:LoadScene 调用按字符串解析的场景名、消息路由键、动画 / 音效剪辑名、Live2D 部件名,以及 Fungus 的 If / SetVariable 逻辑中的比较值(例如像 村落出口 这样的标志)。翻译了这些,游戏就会悄无声息地崩坏——典型症状是没有任何报错、卡在无限的“加载中”画面。RuneTranslate 会自动把它们归类为排除项(以红色显示,仅在你手动选择时才启用),这样编辑器就会突出真正的对话和标签,而让底层机制保持原样。Fungus 的 {$var} 替换以及 {color=...} / TMP <...> 标记会被隐藏在占位符之后,以便在翻译中原样保留。
第 3 步:翻译并校对
选择一个服务商并运行。DeepL 或 LLM 最适合对话;免费的 Google Translate 可以应付菜单和道具名称。先为你的角色阵容和反复出现的术语建立术语表——参见 术语表 101。每一行都会出现在编辑器中、紧挨着原文;可以就地编辑(失焦或按 Ctrl+Enter 时保存),并运行可选的 AI 精修器 进行第二遍校对。免费版 RuneTranslate 的速度被限制为比付费版慢约 3–4 倍——输出质量相同。
第 4 步:导出可游玩的版本
点击导出。RuneTranslate 会复制游戏,然后把翻译好的字符串就地写回资源文件。写回时会运行同一道排除防护,因此旧项目在重新导出时不会意外推送翻译过的场景名或流程操作数。输出是位于你所选位置的完整、可运行的游戏副本——启动 .exe,它就会以你的目标语言运行。
已知限制
- 仅限外部化文本:硬编码进已编译 C# 代码中的字符串(Mono 上的
Assembly-CSharp.dll或 IL2CPP 二进制文件)不会被翻译。而 MonoBehaviour 的数据字段会——在 Mono 和 IL2CPP 两种版本上都是如此。 - 读取 IL2CPP 的 MonoBehaviour 需要一个可解析的
global-metadata.dat;被高度混淆的元数据可能无法重建(尽力而为)。 - 尽力而为:在分享之前,请确认导出的游戏能够启动并正确读取。
- 图像中的文字(logo、手绘 UI、CG 字幕)不会被翻译——超出机器翻译的范围。
为什么这比老办法更轻松
手动翻译 Unity 意味着用 UABE 或 AssetStudio 解包资源,逐一寻找哪些 TextAssets 和 MonoBehaviour 字段装着真正的文本,手动避开那些会让游戏崩溃的标识符字符串,然后在不破坏资源表的前提下重新导入。RuneTranslate 把提取、分类(这样你就不会翻译底层机制)、翻译和就地写回整合进几次点击——而且编辑器全程打开,措辞由你把控。
查看 Unity 引擎页面 了解完整的功能清单,阅读 TyranoBuilder 指南 了解一款基于 HTML 的引擎,或者 下载 RuneTranslate 在真实游戏上试一试。
