Neon Abyss

Neon Abyss

Nedostatek hodnocení
TextMesh Proを使用したUnity製ゲームのフォントの差し替え方法について
Vytvořil: penta0
このガイドではTextMesh Proを使用したUnity製ゲームの日本語が□に文字化けする現象の修正を目的として、Neon Abyssを例にしてフォントを差し替える方法を説明する。
2
   
Ocenit
Přidat do oblíbených
Oblíbeno
Odebrat z oblíbených
始めに
このガイドは ここ [awgsfoundry.com]を参考にして作成した。

Unity製ゲームを日本語にしてプレイしていると良く文字が□になっているのを見かけるが、これはゲーム内のフォントに該当文字が含まれていないためである。
しかし製作者に報告しても修正してくれるとは限らないし、修正してくれても別の文字がまだ化けていたりする事も有る。
母語でない文字の対応は難しいだろうからまぁ仕方がない。
日本語テキストを用意してくれるだけでもありがたいのだ。
とは言え文字化けしていてはまともにプレイできない…

結局のところ期待した通りにはなかなかならないし、いちいち他人とやり取りするのも面倒だ。
もう自力でフォントを差し替えてしまおう。

これはそんな事を考えてしまった人に向けたガイドだ。
ただこの作業は複雑で手間がかかるので全くお勧めはしない。

以下は注意事項である。
  • このガイドではツールのインストール方法や基本的な使用方法などの細かい部分は説明しない。
    その辺は自分で補ってほしい。
  • 特に断りがない限りファイルパスが書かれていたらそのルートはゲームのインストールフォルダになる。
  • このガイドは必要最低限の知識だけ仕入れて書いているので間違いがあるかもしれない。
    特にUnityとか全く調べずに済ましているので眉に唾を付けながら読んで欲しい。
日本語が□に文字化けする原因
Unity製ゲームを日本語にしてプレイしていると下の画像の様に文字が□になっている事がある。


これはゲーム内のフォントアセットに該当文字が含まれていない事が原因の場合がある。
以下で詳しく説明する。

Neon Abyssは下の画像の様に文字をTextMesh Proというオブジェクトにテキストを張り付ける機能を使って表示している。


そして張り付けるテキストはttfなどのフォントファイルから抽出したフォントアセットより表示している。

フォントアセットは下の様な文字を集めたフォントアトラスという画像ファイルと、フォントの大きさなどの設定値や或る文字がこの画像のどの座標に位置しているかを示したグリフテーブルが書かれているテキストファイルからなる。


このフォントアトラスにはフォントアセット作成時に指定した文字しか含まれていないため、この中に存在しない文字を表示しようとすると文字の代わりに□が出力されてしまうのだ。

つまり□に文字化けするのは日本語テキストを受領した後にそのテキストに含まれる全文字をリストアップしてフォントアセットを再作成するという手順を抜かしているのが原因らしい。

そんなに複雑な工程でもなさそうなのに何故やらないのだろうか?

以下では開発者の代わりに日本語テキストを構成する全文字を含んだテキストアセットを作成して差し替える方法を説明する。
使用するツール等の説明
  • AssetStudio [github.com]
    いちいちファイルを抽出して中身を確認するのは面倒なのでAssetStudioのプレビュー画面で確認する。
    なおこのツールでは作成したファイルのインポートはできない。
  • UABEAvalonia [github.com]
    通称UABEA。
    アセットファイルの抽出とインポートに使用する。
  • Il2CppDumper [github.com]
    アセットファイルの抽出に必要なDLLの作成に使用する。
    ゲームのフォルダに
    "\NeonAbyss_Data\Managed"
    の様にManagedフォルダとその中身のDLLが元々存在するゲームの場合は必要ない。
    つまりNeon Abyssの場合には必要ないので詳しくは説明しない。
    試してもいないが以下の手順で使用するらしい。
    1. Il2CppDumper.exeを実行する。
    2. 最初に開いたダイアログで"\GameAssembly.dll"を選択する。
    3. 2番目に開いたダイアログで"\ゲームのプロジェクト名_Data\il2cpp_data\Metadata\global-metadata.dat"を選択する。
    4. Il2CppDumperのあるフォルダにDummyDllフォルダが作成されるのでManagedにリネームする。
    5. 作成したManagedフォルダを"\ゲームのプロジェクト名_Data\"に移動する。
  • Unity Hub [unity.com]
    差し替えるフォントファイルの作成に使用する。
  • 適当なテキストエディタ
  • 適当な日本語フォント
    なんでもいいと思うがとりあえず モリサワのBIZ UD明朝 [github.com]で説明する。
    このフォントを選んだ理由は収録文字数の多さとライセンスが緩い"SIL Open Font License, Version 1.1"であるため安心して使えるという2点である。
調査
ここではフォント差し替えに必要な各種情報を調査する。

開発したUnityのバージョン
どのlevelでもいいのだが、例えば"\NeonAbyss_Data\level0"をテキストエディタで開くと、下の様にゲームを開発したUnityのバージョンらしき文字列が見つかる。

この場合だと”2018.4.21f1”らしいので ここ [unity3d.com]からこのバージョンのUnityをインストールしておく。

日本語フォントアセット
AssetStudioを開いて日本語フォントアセットがどこにあるかを調べる。
なお初めてMonoBehaviourを選択した時に"Select Assembly Folder"というダイアログが表示されるので"\NeonAbyss_Data\Managed"を選択する。


ここで選択するフォルダを間違えると下の画像の様に "Error while read type"のエラーが表示されて正常にプレビュー・抽出できなくなる。


調査の結果"\NeonAbyss_Data\resources.assets"の中にある事が確認できた。


…設定ファイルの名前がJP_35px_Windsなのにフォントアトラスの名前がJP_Winds_35px Atlasになっている。
しかし問題があるとは限らないし、例えあったとしても手に負えそうにないのでとりあえず放っておく。

このフォントアセットは"\NeonAbyss_Data\level4"などを開いた時にも見つける事が出来た。

しかしアセットのPathIDも同じで、またAssetStudioで対象のアセットを選択して右クリックすると表示される"Show original file"を選択すると"\NeonAbyss_Data\resources.assets"が表示されるので恐らくlevel4にはresources.assetsのフォントアセットに対する参照があるだけだと思われる。
その為、今回はresources.assetsのみを差し替え対象にする。

更に設定ファイルのcharacterSequenceを見てみると□になっている金貨の”貨”が含まれていないのはJP_35px_SourceHanだけだったのでこのフォントアセットだけを差し替える事にする。
フォントアセットの抽出
最初にUABEAでフォントアセットのMonoBehaviourとMaterialをテキスト化して抽出する。

まずUABEAで"\NeonAbyss_Data\resources.assets"を開く。
この時"\NeonAbyss_Data\Managed"とその中身のDLLが存在しない場合は正常に開けないらしいが、存在するので問題ない。
存在しない場合はIl2CppDumperを使ってManagedフォルダを作成する必要があるらしい。

UABEAで開くとアセットのリストが表示されるので、フォントアセットのMonoBehaviourとMaterialを選択して"Export Dump"を押下するとテキスト化して抽出出来る。


今回は特に使わないがフォントアトラスを選択して"Export Raw"を押下するとデータを加工せずにそのまま抽出出来る。


またフォントアトラスを画像ファイルとして抽出したい場合は"Plugins"を押下する。

その後"Export texture"を選択して"Ok"を押下する。

抽出が終わったらMonoBehaviourから変換したテキストJP_35px_SourceHan-resources.assets-387.txtを開き、"FontAssetCreationSettings"を検索してその下に書かれているpointSize・padding・atlasWidth・atlasHeightを調べておく。

今回は以下の値だった。
  • pointSize = 35
  • padding = 2
  • atlasWidth = 2048
  • atlasHeight = 2048

また、フォントアトラスを選択して"Plugins"を押下した後"Edit texture"を選択してダイアログを開き各種設定値を確認しておく。
差し替え用フォントアセットの作成
まずゲーム開発バージョンのUnityで3Dテンプレートの新しいプロジェクトを作成して開く。


下部の"Project"タブで"Assets"フォルダを開いて使用するフォントファイル(otfまたはttf形式のみ)をドラッグアンドドロップで追加する。


次にゲームの日本語テキストに含まれる全文字のリストファイルを追加したいが、私にはNeon Abyssの日本語テキストがどこにあるのか見つけられなかった。
その為、代わりに ゲームなどで使用する日本語の文字一覧 [gist.github.com]として公開してくれているファイルを使う事にする。
これもAssetsフォルダにドラッグアンドドロップで追加する。


追加したらメニュー -> "Window" -> "TextMeshPro" -> "Import TMP Essential Resources"を選択する。
するとTextMeshProを使用する場合に必須となるファイルがプロジェクトにインポートされる。


次にメニュー -> "Window" -> "TextMeshPro" -> "Font Asset Creator"を選択し、以下の値を入力して"Generate Font Atlas"を押下する。
  • "Source Font File"に使用するフォントファイルを指定する。
  • "Sampling Point Size"に"Custom Size"を指定して調べておいたpointSizeの値である35を入力する。
  • "Padding"に調べておいたpaddingの値である2を入力する。
  • "Atlas Resolution"は今回使用する文字数が多いので調べたatlasWidth・atlasHeightとは違い4096, 4096を指定する。
  • "Character Set"に"Characters from File"を指定する。
  • "Character File"に使用する日本語の文字一覧ファイルを指定する。
  • "Get Kerning Pairs"にチェックを入れる。
  • 他の設定値はデフォルトとする。


この後"Save"を押下してフォントアセットを保存する。


その後"Assets"フォルダの保存されたフォントアセットの右矢印を押して開き、開いて表示された右側のAtlasを選択する。
そして右部の"Inspector"タブで"フォントアセットの抽出"のセクションの"Edit texture"ダイアログで確認した設定値に値を合わせる。
この場合"Filter Model"にPointを指定した。


メニュー -> "GameObject" -> "3D Object" -> "Text - TextMeshPro"を選択してテキストオブジェクトを追加する。


そして右部の"Inspector"タブの"Text Mesh Pro (Script)" -> "Main Settings" -> "Font Asset"で先程保存したフォントを指定する。
このようにプロジェクト内で実際にフォントを使う事でアセットがアセットバンドルに組み込まれる。


メニュー -> "File" -> "Build Settings..."を選択する。


そして"build"を押下すると"プロジェクト名_Data"が作成され、その中にフォントアセットを含んだアセットバンドルが保存される。


最後にUABEAで"プロジェクト名_Data\resources.assets"を開き、"フォントアセットの抽出"のセクションを参考にしてMonoBehaviourとMaterialをテキスト化して、フォントアトラスを画像ファイルとしてそれぞれ抽出する。
差し替え用フォントアセットを組み込めるように加工する
まず組み込み用フォントアセットのMonoBehaviourテキストを作る。

ベースになるのは元のフォントアセットなのでこの場合はJP_35px_SourceHan-resources.assets-387.txt(以下元のテキスト)をテキストエディタで開く。

まず"FaceInfo m_FaceInfo"のm_PointSizeの行以下を組み込み用フォントアセットのMonoBehaviourテキスト(以下組み込みテキスト)から元のテキストにコピーアンドペーストで上書きする。


同様に"Array m_GlyphTable"・"Array m_CharacterTable"の全てを組み込みテキストから元のテキストにコピーアンドペーストで上書きする。

次に"Array m_UsedGlyphRects"・Array m_FreeGlyphRects"の全てを組み込みテキストからコピーアンドペーストで上書きするが、"Array m_CharacterTable"と"Array m_UsedGlyphRects"の間にある"Array m_AtlasTextures"・"Array m_AtlasTextureIndex"まで書き換えてしまわぬように注意する。

その次は"int m_AtlasWidth"・"int m_AtlasHeight"、"FontAssetCreationSettings m_CreationSettings"のpointSize・padding・atlasWidth・atlasHeightを組み込みテキストの値に書き換える。
この場合は全て4096になる。



最後に"FontAssetCreationSettings m_CreationSettings"のcharacterSequenceの値を組み込みテキストから元のテキストにコピーアンドペーストで上書きして保存する。


上記の作業が終わったら次は組み込み用フォントアセットのMaterialテキストを作る事になる。
ただ、このMaterialテキストでは"_TextureHeight"と"_TextureWidth"の値を組み込みMaterialテキストの値に書き換える必要があるらしいのだがNeon AbyssのMaterialテキストにはこれらの項目が無いので何もしないことにした。

もし手作業でやるのが面倒ならば これ [github.com]の様なプログラムを調べて使うのもいいかもしれない。
差し替え用フォントアセットを組み込む
まずUABEAで"\NeonAbyss_Data\resources.assets"を開く。

するとアセットのリストが表示されるので、フォントアセットのMonoBehaviourを選択して"Import Dump"を押下し表示されたダイアログで前のセクションで加工したJP_35px_SourceHan-resources.assets-387.txtを選択する。


次はMaterialテキストをインポートするのだが今回は修正していないのでインポートもしない。

その後はUABEAでフォントアトラスを選択し"Plugins"を押下した後"Edit texture"を選択するとダイアログが開く。

ここで"Load"を押下するとまたダイアログが開くので差し替え用フォントアトラスの画像ファイルであるBIZUDMincho-Regular SDF Atlas-sharedassets0.assets-4.pngを選択して"Save"を押下する。


最後にメニュー -> "File" -> "Save"を選択して保存先を指定すれば差し替え済みのresources.assetsが作成される。


なおこの時の保存先は"\NeonAbyss_Data\resources.assets"以外を指定しなければならない。
UABEAが開いているからである。
動作確認
差し替え済みのresources.assetsを"\NeonAbyss_Data\resources.assets"に上書きしてゲームを起動し、何のエラーも起きなければフォントの差し替えは完了である。

そのままゲームを進めて前回文字が□になった所まで進んでみると…



金貨の”貨”が正しく表示されていることが確認できた。
終わりに
今回はUnity製ゲームで文字が□になっているものをフォントの差し替えによって修正する方法を説明した。

しかしこの方法は文字の表示にTextMesh Proを使っているゲームだけに適用できるものであり、同じUnity製ゲームでもフォントファイルをそのまま使って表示しているものには無力である。

日本語フォントについての悩みはまだまだ尽きそうにない…
Počet komentářů: 2
Tottu_1280 9. dub. v 15.26 
日本語にすると漢字が抜けてしまうゲームがあったのですがこちらのガイドを参考にしながら入れ替えたら無事、日本語化成功致しました...!本当にありがとうございます😭
絵藻井 3. lis. 2023 v 2.05 
UnityEXが有料になってUABEAでのフォントの入れ替え方に困っていたのですが、とても参考になりました!