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以上。
- 翻訳プロバイダーを1つ。無料の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やAssetBundleに埋め込まれた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リファイナーを実行して2回目の校正を行います。RuneTranslateの無料枠は有料より約3–4×遅く制限されています——出力品質は同じです。
ステップ4:プレイ可能なビルドをエクスポートする
エクスポートをクリックします。RuneTranslateはゲームをコピーし、翻訳済みの文字列をその場でアセットファイルに書き戻します。同じ除外ガードが書き戻し時にも実行されるため、古いプロジェクトが再エクスポート時に誤って翻訳済みのシーン名やフローのオペランドを送り込むことはありません。出力は、選んだ場所に置かれる完全に実行可能なゲームのコピーです——.exeを起動すれば対象言語でプレイできます。
既知の制限
- 外部化テキストのみ:コンパイル済みのC#コードにハードコードされた文字列(Monoの
Assembly-CSharp.dll、またはIL2CPPバイナリ)は翻訳されません。MonoBehaviourのデータフィールドは翻訳されます——MonoとIL2CPPの両方のビルドで。 - IL2CPPのMonoBehaviour読み取りには解析可能な
global-metadata.datが必要です。強く難読化されたメタデータは再構築できない場合があります(ベストエフォート)。 - ベストエフォート:共有する前に、エクスポートしたゲームが起動し正しく読み込まれることを確認してください。
- 画像内のテキスト(ロゴ、手描きのUI、CGのキャプション)は翻訳されません——機械翻訳の対象外です。
これが従来のやり方より簡単な理由
手作業でのUnity翻訳は、UABEやAssetStudioでアセットを展開し、どのTextAssetsやMonoBehaviourフィールドに本物のテキストが入っているかを探し、ゲームをクラッシュさせる識別子文字列を手作業で避け、それからアセットテーブルを壊さずに再インポートする、という作業でした。RuneTranslateは、抽出、分類(仕掛けを翻訳しないように)、翻訳、その場でのパッチ適用を数クリックにまとめます——エディタが開いたままなので、言い回しはあなたが管理できます。
全機能のリストはUnityエンジンのページを見るで確認し、HTMLベースのエンジンについてはTyranoBuilderガイドを読むか、RuneTranslateをダウンロードして実際のゲームで試してみてください。
RuneTranslate を試してみませんか?
無料プランですべてのエンジンとすべての翻訳プロバイダーが使えます。Supporter(月額 $3)ならフルスピードで翻訳できます。
Windows 版をダウンロード