Unityゲーム、簡易TexMmeshPro置き換え方

最近のゲームはほとんどでTextMeshProが使われています。
XUnity.AutoTranslatorが使えれば、なんとかなることもありますが、好きなフォントを入れたい場合にかなり苦労します。

今までは、awgs Foundryさんのこのページの方法でやっていましたが、

より簡単な方法を見つけましたのでシェアします。
これは比較的新しいバージョンのTextMeshProを対象としています。
(まだ、いくつか成功しただけなので、上手くいかないバージョンもあります。その場合は相談してください。)

必要なもの


日本語フォント(TTFフォント)
UABEAvalonia

今回はサンプルとしてSuzerainVer3を使用します。

まずフォントを探しましょう。


これには慣れが必要ですが、だいたいがresources.assetsかsharedassets0.assetsに入っています。
SuzerainVer3ではresources.asetsにありました。
これをUEBEAで開いて、Typeでソート
書き換えたいフォントを探します。
今回のサンプルではNotoSerifSC-Regular(中国語)が第1選択外国語だったのでこれを選びました。

余談:フォントにはフォールバック機能(1番目のフォントで探してなかったら2番めのフォントを探す…)が付いている場合があります。その場合、中国語が日本語より上だと、翻訳で中国語が表示されることになります。
Suzerainは中国語、韓国語、日本語の順でした。

フォントを見つけたら、そのFileID、PathIDをチェックします。
サンプルはFileID=0,PathID=296です 

次にNameでソートします。
それから、上のVier-GotoAssetをクリックし(またはCtrl+G)
先ほど調べたFileID,PathIDを入れてOKを押します。

必要なファルの取得

これで書き換えたいフォントに関するファイルがまとまって表示されます。
サンプルの場合、下記のファイルが見つかります。
NotoSerifSC-Regular :font
NotoSerifSC-Regular SDF :MonoBehaviour
NotoSerifSC-Regular SDF Atlas :Texture2D
NotoSerifSC-Regular SDF Atlas 1:Texture2D
NotoSerifSC-Regular SDF Atlas 2:Texture2D
NotoSerifSC-Regular SDF Atlas 3:Texture2D
NotoSerifSC-Regular SDF Atlas 4:Texture2D
NotoSerifSC-Regular SDF Material

多くの場合は、まだTexture2Dファイルは1つが多いのではないでしょうか

Fontファイルは、右のPlugin - Exprort .ttf/.otfでTTFフォントファイルを出力します。

MonoBehaviourファイルは、Export Dumpでテキストファイルを出力します。

Texture2DファイルはPlugin - Exprort textureでPNGフィルで出力します。

Materialファイルは出力不要です。

これで下準備完了です。

各ファイルの書き換え

やっていることの内容をまず説明します。
最近のTextMeshProにはダイナミックフォントと言って、登録されていないフォントをTTFファイルから探し出してきてフォントを作成すると言う機能があります。今回の方法はそれを利用します。

TTFファイルの入れ替え
日本語フォントのフォント名を、ExportしたTTF(OTF)ファイル名にリネームします。
サンプルでは、NotoSerifSC-Regular-resources.assets-296.otfが出力されたので、置き換える日本語フォント、ZenOldMincho-Regular.ttfをNotoSerifSC-Regular-resources.assets-296.ttfにリネームしました。
これをPlugin-Import .ttf/.otfでインポートします。
インポートされると、Modifiedに*が付きます(これはほかも同じです)

PNGファイルの書き換え


PNGファイルを画僧編集ソフトで開き、入っている画像を全部消して上書き保存します。(要は空の画像にします)
Texure2Dファイルが1ファイルの場合は、漢字を書き込むスペースが足りなくなるはずなので、画像サイズは、1024*1024、2048*2048、4096*4096にしておくのが良いでしょう。
画像の編集が終わったら、Plugin-Edit Texture-OKから、
Load-で編集したPNGをファイルを選択して-OKです。
これで画像ファイルのModifiedに*がつくはずです。

MonoBehaviourファイルの編集

ここからが一番難しい場所です。
MonoBehaviourファイルをExport Dumpするとテキストファイルに変換されます。
これをテキストエディタで開きます。

0 int m_AtlasPopulationMode を探して1にします。
これによりダイナミックフォントを使うことができるようになります。



0 Glyph m_GlyphTableを検索します。

その下に
1 Array Array (222 items)
0 int size = 222

と続きます(この222はフォント画像の数です)
この222を1に変更し、0 int size = 1
画像の63行目の[1]から[221]までの内容を削除します。

この後に続く、
0 TMP_Character m_CharacterTableの項目も、0 int size = 1と変更してから、先のものと同様に削除します。
その後、 1つ目の0 unsigned int m_Unicode が 32となっていると思いますのでこれを31としておきます。(32はスペースの文字コード、これを使用しない31に変更しておく)

下記が修正後の写真です。

解説:(知っておくと良いが知らなくても行けるだろう)
Glyph m_GlyphTableは、文字の画像がテクスチャーのどこに描かれているかを記すものです。[0]のデータは画像番号1( 0 unsigned int m_Index = 1)で、画像がテクスチャファイルのどこに描かれているかを示します。

TMP_Character m_CharacterTableは、どの文字コードが上記で作った画像を使っているかを指定しています。
サンプルでは、文字コード31(本来は32のスペース)はの[0]、1番目( 0 unsigned int m_Index = 1)の画像を使っていることを示しています。

次に、
0 GlyphRect m_FreeGlyphRectsを検索します。

解説:これはテクスチャファイルのどこに空きがあるかを示しています。この空きを参照して、ダイナミックフォントを作成していきます。

これも上の2つと同様に0 int size = 1と変更してから、1つを残して全部を消します。
そして、1つ目にフリースペースを
0 int m_X = 0 
0 int m_Y = 0
0 int m_Width = 512
0 int m_Width = 512

X、Yは0、Width、WidthはPNGファイルの書き換えで、書き込んだPNGの画像サイズに変更します。
サンプルが512だったのでここでは512となっています。

次に
AtlasWidthを検索します。
何箇所かみつかります。
0 int m_AtlasWidth = 512
0 int m_AtlasHeight = 512
の値を書き込んだPNGの画像サイズとあわせてください。
おそらく、 0 PPtr<$Texture2D> atlasの項目のものだけでOKだと思います。不安なので、私は全部変更しています。


これで必要な変更はすべて完了です。
Inport Dumpで編集したテクストファイルを読み込んでください。

全ファイルの変更が終わったら、
Asse Infoの方で、FILE-Saveで保存してから、

UABEAの方でもFile-Saveして完了です。

これで日本語が上手く表示されていればOKです。
いくつかは表示されるが、□も混ざる場合はTexture(PNG)の画像サイズを大きくしてあげてください。
中国語など変な文字が入る場合は、先に読み込まれているフォントがあるはずです、そちらを改造する必要があります。




いいなと思ったら応援しよう!