やっと、来ました!
メニュー画面 |
オプション画面 |
漢字が正しく改行されるかの確認 |
■フォントの座標情報の差し替え(失敗編)
前回までの解析結果を元に Pillars of Eternity 2(PoE2)のアセットファイル(resources.assets)に、フォントテクスチャと座標情報をインポートします。ツールは UnityEX を使用します。インポートするファイルは、2回目で作成したアセットファイルからエクスポートしたファイルを使用します。
Assetファイルのフォルダー構成
Unity_Assets_Files └─resources │└resources_00010.-2 ---> フォントの座標情報 └─Textures └─res_resources └ NANUMMYEONGJO SDF Atlas.tex.dds ---> フォントテクスチャ
自作したフォントの座標情報のファイル名は、元々「sharedassets0_00001.114」でしたが、PoE2 のファイル名に合わせ「resources_00010.-2」に変更しました。これで、 PoE2 にインポートしたのですが、英数字しか表示されず、日本語は全く表示されませんでした。しかし、英数字の字体が変更されていたのでフォントテクスチャは上手くインポートできたと考えられます。
この後、かなり試行錯誤したのですが全く前進しませんでした。そこで、バイナリエディタを使用してフォントの座標情報を解析することにしました。
■座標情報の解析
1.情報収集
以前に読んだ、kengo700さんの「2Dアクションゲーム『Hollow Knight』」の解析記事をもう一度読み直し、この情報と AssetBundleExtractor (UABE) の「View Data」の情報を元に解析を進めることにします。
「2Dアクションゲーム『Hollow Knight』の日本語化のための試行錯誤メモ - kengo700のダイアリー」
http://kengo700.hatenadiary.com/entry/hollowknight-localization-01
2.解析の結果
解析した結果は Gist に纏めました。
「韓国語版のフォントの座標情報を調査した時の資料です。」
https://gist.github.com/synctam/c9e7a32164b26ae89107f89599e458f3
フォント情報ファイルの中身は大まかに分けて、次の3パートに分かれています。
- フォントの各種設定情報の先頭部分(ヘッダー部)
- 各文字の座標情報(座標部)
- フォントの各種設定情報の末尾部分(フッター部)
バイナリーエディタで見てみると、様々なIDがありこのIDがPoE2の物と自作のもので異なっていることに気づきました。
例:以下抜粋
offset size description --------- ---- ------------------------------------ 0000:0000 (04) 00000000(0) GameObject.FileID 0000:0014 (08) 7D070000(1917) Script.PathID
おそらく、FileID や PathID を変更してはいけないのだと思います。これらのIDはヘッダー部とフッター部に存在し、座標部にはありません。そこで、座標部のみを自作フォントの物と差し替えることができれば良いと考えました。
座標部のみを差し替える、変換ツールを作成したところ日本語が表示できました。
3.課題
とりあえず、座標部を差し替えることで日本語の表示に成功しましたが、ヘッダー部やフッター部にある様々なフォントの設定情報をどの様にするかを決定しなければなりません。今後は各設定情報を反映し表示のテストを進めていくことになると思います。
それと、まだ先の話ですが、今までの日本語化MODはファイルをコピーするだけで日本語化できましたが、今後は日本語フォントの導入も必須になります。なるべく日本語化が簡単に行えるような工夫が必要かもしれません。
■まとめ
- フォントの作成は Unity の TextMesh Pro を使用すれば良い。
- フォントの座標情報はそのままでは使用できない。変換ツールが必要。
- 作成した Asset の確認は AssetBundleExtractor (UABE) の「View Data」機能が役に立つ。
- 画像関連の Asset の調査には、画像をすぐ表示できる「AssetStudio」が便利。
今回の解析では、kengo700さんの解析情報がとても役に立ちました。バイナリー解析の場合は最初の取っ掛かりを見つけるまでがとても時間と根気がいるものです。幸いなことに、今回はすでに基本部分が解析済みで情報が公開されていたため、その情報を元に詳細を詰めていくだけで良く、とてもスムーズに解析が進みました。
貴重な情報の公開やコメント頂いた方に感謝致します。
では・・・
参考資料
「2Dアクションゲーム『Hollow Knight』の日本語化のための試行錯誤メモ - kengo700のダイアリー」
http://kengo700.hatenadiary.com/entry/hollowknight-localization-01
「韓国語版のフォントの座標情報を調査した時の資料です。」
https://gist.github.com/synctam/c9e7a32164b26ae89107f89599e458f3
Assets中のデータはバイナリを見て解析する必要は無いですよ。
返信削除処理本体はManagedフォルダにある.Netで作られたDLLでAssetsのデータは処理クラスがシリアライズされた物ですので、データ構造はILSpyとかを使ってクラスのデータ定義から拾うだけで済みます。
※Unityのクラスの構造は拾えないのでググって補完を・・・
それとMonoBehaviorは開発側によって組み込まれる処理の継承元となるクラスで、Unityは組み込まれる処理クラス数分だけMonoScriptを作成し、これをMonoBehaviorから参照させる事でデータと処理を関連付けています。
そして、このクラス参照(正確にはUnityのクラスとそれらを継承するクラスへの参照)に用いられているのがPPtr構造体で、FileId(参照元Assetsのヘッダにある外部参照されるAssets一覧の索引(1オリジンで0は同Assets)とPathId(参照先Assetsでのデータの管理番号)から他のクラスを特定する仕組みになっています。
以上、長々と失礼しました。
おっしゃる通り、Assetsデータの処理クラスを見つけることができました。これで、自作した物との違いがより明確に判断できるようになりました。後はデシリアライズができれば、製品のアップデート時の対応もすばやく行えると思います。
削除後半の、MonoBehaviorについては勉強不足のため理解できていません。しかし、「PPtr構造体」などのキーワードをいただきましたので、次のステップに進む時に調べてみたいと思います。
ありがとうございました。