Unity製ゲームの有志翻訳情報・リンク集・忘備録
↓Unreal Engine版
まず最初に断っておきたいのは私は有志翻訳を初めて3日目くらいの、特に技術系の知識のない人間だということです。ここに集められた知識は未来のアップデート、あるいは改善を待つ偏った知識です。
それでもここに情報を残すのは私が有志翻訳をノリで初めるにあたって、散在する情報を集めるのに本当に苦労したからです。知識を求めてこの文章に辿り着いたあなたは時空上のズレはあるものの過去の私と部分的であれ重なっているわけだ。
この文章は特に「Unity製のゲームを翻訳しようと調べたけど、テキストデータを特定する箇所で躓いてしまった人」に有用であると考えられます。なぜなら私がそうだったから。
分からないことがあればTwitterのDMででも聞いてください。答えられるのかどうかはわかりませんが。もっと洗練された方法があるという人も連絡ください。
ゲームエンジンの確認
最初に翻訳したいゲームがUnityで作られているのか、ということを確認したい。ここでUnreal Engine製だったりするとこれ以降の説明はすべて意味をなさなくなってしまう。
UnityやUnreal Engineの場合ゲーム起動時にロゴがでかでかと出てくるが、分からなかった場合はSteamDBを活用するとよい。App Info欄のDetected Technologiesに大抵は載っている。新しい作品の場合は空欄の場合もある。
テキストデータを探す
ゲームを翻訳するためにはテキストデータを抽出する必要があります。
具体的には上ページの「Unityのアセットをアンパックしてテキストデータを取り出す」という項目を見るとよい。特に
resources.assets
sharedassets0
level0
sharedassets0、level0に無い場合数字の少ないファイルから探していく
という部分が重要だ。
ファイルの特定
また
「AssetStudioをつかってUnityの「.assets」拡張子のファイルを読み込む」
という文言は「.assets拡張子のすべてのファイルを一気に読み込む」と解釈してよい。そこからどの.assetsファイルに目当てのファイルがあるのか、という事は次の手順で確認することができる。(もっと簡単な方法がある場合は教えて欲しい)
1,UABEを使用してAssetStudioと同じように「.assets拡張子のすべてのファイルを一気に読み込む」。違うのは読み込んだ後に左上の「Assets」にチェックをつけること。
2,右の画面でAssetStudioで見つけた目的のファイル(テキストや画像データ)を選び、右の画面にある「ExportRaw」を押す。すると保存画面に目的のデータが含まれるファイル名(画像だと青色で「sharedassets37.assets」)が表示され、目的のデータが含まれるファイル名が特定できる。
この「AssetStudio」と「UABE」という2つのツールには、それぞれ得意な分野がある。「AssetStudio」はファイルのプレビューを視覚的に表示して目的のデータの名前を特定するのに役立つ。「UABE」は前述のとおり目的のデータ名を元に目的のデータが含まれるファイル名(場所)を特定することができる。
assets.ファイルに目的のデータがなかった場合
私が『That Which Gave Chase』を翻訳しようとしたとき、.assetsファイルにテキストデータは存在しなかった(多分)。そこで次のページを参考にCheat Engineを使ってテキスト探しを試みた。
ここで「上と下を見て、だいたい想像がつくのではないでしょうか?上がテキストの保存場所で、下が、それを抜き出した表示ルーチンのデータ領域です。これで上のデータを抜き出せばよい事にになります。」と言われているが、これを翻訳すると
「Bytes欄に書かれた16進数の文字列(リンク先の画像で言えばE8 87 120100)をメモして、.assetsファイル以外の目的のデータがありそうなファイル(.dllファイル、特にassembly-csharp.dllが可能性が高いらしい。)をバイナリエディタで開き、メモした文字列と照らし合わせる。同じ文字列があればそこに目的のデータがある可能性が高いことが分かる」となると思われる。
これは認識が違ったようなので線を引いておきます。正しい認識が分かる方はご教授ください。
assets.ファイルに目的のデータがなかった場合(2)
ゲーム内のテキストを16進数に変換*して、FavBinEditについてくる「FavBinGrep」を使ってフォルダー全体を検索することでテキストデータのあるファイル名を特定することができる。
*「We should keep moving.」なら「57652073686F756C64206B656570206D6F76696E672E」。変換サイトなどを使って変換できる。また検索の方法を「文字列」にすればテキストのまま検索できます。
私の場合ここまでやってバイナリエディタでは、プレビューが文字化けしてしまって先には進めなかった。その時にいただいた情報をここに貼っておきます。
.dllの編集について
バイナリからテキストを抽出するプログラムの提供
テキストデータの編集
テキストデータを特定できたら次はその編集です。ここでは以下の2つのステップを経ることで外国語のテキストを日本語でゲーム内に表示できることを確認することができます。
1.テキストデータの書き換え
2.テキストデータの日本語での書き換え
テキストデータの書き換え
場所とファイルを特定したテキストデータをオリジナルと同じ言語(英語なら英語)で書き換えます。特定したデータの拡張子にもよりますが、たいていの場合メモ帳などでは編集できないため、バイナリエディタを用いて編集します。(私はFavBinEditなどを使っています)
バイナリエディタの検索機能を使って変更したい文字列を探します。ここではゲームに変更が反映されたことを確認しやすくするため、ゲームを起動してすぐに確認できる文章を選びましょう。
変更する文章を見つけたらエディタの置換機能を使って文章を変更しましょう。例えば「We should keep moving.」(16進数変換したもの「57 65 20 73 68 6f 75 6C 64 20 6B 65 65 70 20 6D 6F 76 69 6E 67 2E」)を「Ew should keep moving.」(45 77 20 73 68 6F 75 6C 64 20 6B 65 65 70 20 6D 6F 76 69 6E 67 2E)に変更し、ゲーム内で反映されているかを確認します。
反映されていることが確認出来たら次はWe(5765)をYou(596f75)に変更してみましょう。クラッシュしました。これは本来4文字だったWeをYouという6文字で上書きしてしまったためです。基本的には文字数はそろえるようにしましょう。
テキストデータの日本語での書き換え
それでは英語(原語)での書き換えができたところで本命の日本語での書き換えを行ってみましょう。
「We should keep moving.」(「57 65 20 73 68 6f 75 6C 64 20 6B 65 65 70 20 6D 6F 76 69 6E 67 2E」)を「先を急ごう」(90 E6 82 F0 8B 7D 82 B2 82 A4 00 00 00 00 00 00 00 00 00 00 00 00)に変更してみます。
00の部分は原語の文字数と合わせるための空白を表現するものです。文字数を変更する文章と同じ量にする、というのは基本的なルールとして覚えておきましょう。
起動してみました。文章が何も表示されませんでした。これはゲームが使用しているフォントが日本語に対応していないためです。
これに対処することは私の現在の知識では無理でした。開発者に連絡を取って日本語に対応したフォントをプロジェクトファイルを通して追加してもらう、というのが現実的な解決方法と考えられます。
テキストデータの日本語での書き換えの可能性
翻訳したい作品の対応言語を見て中国語があれば、そのフォントを流用して日本語を表示できる可能性があります。また複数の言語に対応している場合も他言語への土壌が整えられている可能性もあります。一つの指標としてご活用ください。逆に言えば単言語のみ対応で、使っているフォントが日本語に対応していない場合は結構絶望的です。
フォントデータの探し方
フォントデータの探し方はテキストデータの探し方と同じですが一応書いておきます。AssetStudioでフォルダーごと読み込み(Dataフォルダを読み込めば間違いなさそう)フィルター機能を使って、Fontを選ぶと出てきます。
テキストデータが見つからなかった場合
XUnity Auto Translatorを使った日本語化
正直に言うとこれが一番技術がいらない方法だと思います。まず次のリンクの目次の最初の項目から、「テクスチャフォントを作り方(原文ママ)」の項目を読んでXUnity Auto Translatorを導入する。
XUnity Auto Translatorは本来Unity製のゲームをリアルタイムに機械翻訳するツールだ。しかし、そこでゲームプレイに伴って機械翻訳されて、生成される「_AutoGeneratedTranslations.txt」の中身をメモ帳などで編集し、共有することで有志翻訳をとりあえずは成立させることができる。
しかし、この方法には明確な欠点がある。それはゲームに表示されたテキストしか翻訳できないため、構造上翻訳漏れを完全に防ぐことができないという点だ。だがテキストデータが見つからないならしょうがない。短く分岐の少ない作品ならこの方法をとることもそんなに悪くないように思う。
また既存の対応フォントはシンプルでそっけない。数種類の代替フォントを用意してくれている方がいる。上のリンクにフォントの作り方も載っているのでそれを実践するのもアリ。
使用されているUnityのバージョンが古い場合
前述したリンクの「対象のUnity製ゲームが古くBepInExが使えない場合」の項目だけでは、個人的にはつまづいてしまった。以下のリンクの「インストール」の項目を参考にすると正常に動作した。
DeepLが動かない場合
DeepLが上手く動かない場合は以下のリンクにある方法をとると解決することができる。
テキストデータではなく画像データだった場合
テキストデータが見つからなかった場合、そもそもゲームに表示される文字が画像データの場合がある。
この場合「AssetStudio」で画像データとその場所を特定することは簡単だ。問題は画像データをエクスポートする方法だ。それは以下に詳しい。
エクスポートした画像データをGimpなりフォトショで日本語化した後は、元の画像データを編集したデータに上書きするインポート作業だ。上のリンクにもその方法はあるが、個人的には下のリンクも有用だった。
最後に
これで日本語化の環境づくりは終了です。上手くいかなかった場合はいろいろ試してみましょう。個人的にはバイナリを一括検索できる「FavbinGrep」というツールにはずっとお世話になっていました。
それでもダメな場合は「日本語化作業者互助会」に参加して質問してみるのもいいと思います。自分の場合はここに質問しまくって、ありがたいアドバイスをたくさんいただきました。ただし質問するときは自分の環境や、試したことなど細かく書くようにしましょう。自分にDMを送るのもありです。答えられる範囲でお答えします。
以上です。情報が集まり次第更新します。
2024/03/26
テキストの探し方を追記。
2024/03/27
ゲームエンジンの確認・テキストの編集方法について追記。