今回はTextmeshフォントを作っていきます。
必要な物
〇新しい文字テクスチャ画像 (日本語テクスチャ)
〇その文字情報ファイルMonoBehaviourのDumpファイル (日本語Dump)
〇書き換えたい元のテクスチャ画像(名前だけでもOK) (元テクスチャ)
〇書き換えたいフォントのMonoBehaviourのDumpファイル (元Dump)
最初のUnityで作ってください。
書き換えたいフォントのMonoBehaviourを抽出します。
UABEAで抽出する時は、メインフォルダから抽出するようにしてください。関連ファイルも一緒に読み込まれていますので、対象ファイルだけを他にコピーしたもので抽出するとうまくいかないかもしれません。
(どのフォントがどこで使われているかの探し方は、他の方の記事を見てください。)
今回書き換える Suzerainの対象ファイル
メインのフォント:Rubik-Regular SDF
PathID:20863
テクスチャファイル:Rubik-Regular SDF Atlas.tex(Rubik-Regular SDF Atlas.tex.dds)
PathID:516
Suzerainのフォントは、globalgamemanagers.assets内にありました。
多くの場合は、resources.assets にあります。
単言語の物は、ここら辺がややこしいです。テキストもまとまっておらず散らばってるし…
UnityEXを使用して、Rubik-Regular SDF Atlas.tex.ddsを抽出します。
新しく作った日本語テクスチャファイルをRubik-Regular SDF Atlas.tex.dds(元テクスチャ)にリネームして上書きし、globalgamemanagers.assetsにリパックします。 UnityEXの仕事はこれで終わりです。
次に、Rubik-Regular SDFのMonoBehaviourファイルをExport Dumpで出力します。
(場所はUnityEXの検索を使う方が簡単かも。UABEAには検索機能が不十分なようです。PathIDで探すか、ソートして探しています。)
手順
1) 日本語Dumpから必要な部分を切り出し。
2) 元Dumpから不要な部分を削除。
3) 元Dumpに必要な修正をかける
4) 元Dumpに1)で切り出した日本語Dumpをマージ
5) UABEAで書き戻し。
-----------------------
1) 日本語Dumpから必要な部分を切り出し。
23行目の 1 string m_FamilyName = "M Plus 1"
から
1 Array m_AtlasTextures (1 items)の直前までを抜き出します。
09/16補足:
22行目の 0 int m_FaceIndex = 0は混じるとエラーが出ます。(オリジナルもにあれば入れてください。)入れないようにしてください。
あと、20行の 0 int m_AtlasPopulationMode = 0も、1の場合まず0にしてダイナミックフォントを禁止にしておいた方が良いでしょう。(1にすると、テクスチャが上手に反映されないかもしれません。)
これを別ファイルにでも保存しておくといいでしょう。(使いまわしができます。)
9/6補足 上記の4241のPathIDをオリジナルの物にして後ろ全てを日本語版を使っても行けるようです。
-----------------------
2) 元Dumpから不要な部分を削除
これは1)の逆で元Dumpから
0 FaceInfo m_FaceInfo の次の行
から
1 Array m_AtlasTextures (1 items)の直前までをカットします。
-----------------------
3) 元Dumpに必要な修正をかける
元Dumpから
0 PPtr<Texture2D> atlas
のテキストを探します。
その前後の
AtlasWidthとAtlasHeightをテクスチャ画像の大きさに合わせます。
今回の場合2048x2048なので全て2048になります。
(実際に使われるのは後ろの方だけのようです。2215-2216行)
-----------------------
4) 元Dumpに1)で切り出した日本語Dumpをマージ
2)でカットした部分に1)で抜き出したものを挿入します。
0 FaceInfo m_FaceInfo と
1 Array m_AtlasTextures (1 items)
の間に入ります。
この時、空行が出来ないように注してください。空行があるとリパック時にエラーが出ます。
5) UABEAでglobalgamemanagers.assetsを読み込んで、
書き戻したいファイルを指定して(今回は20863)
Import Dumpを押して、新しく出来上がったMonoBehaviourDumpをリパックします。
マージしたDumpファイルのファイル名は何でも良いようです。
リパックしたらUABEAのファイル名の横に*がでます。
File-Saveからファイルをセーブしてください。
元のファイル(globalgamemanagers.assets)に直には書き戻せませんので名前を変えるか、他の場所に保存してください。
UABEAが複数の関連ファイルを読み込んでいて、関連ファイルを書き換えている場合は、2つ以上のファイルに渡って書き出す場合もありますので注意してください。(globalgamemanagers.assetsとsharedassets0.resourceの2つに書き出しなどもありました。)
UABEAを終了して、出来上がった新しいglobalgamemanagers.assetsを元のファイルに上書きします。
(UABEAを終了しないとロックがかかり上書きできません。)
これで起動してエラーが出なければいけてんじゃない?
まだ、私も手探りで、今回初めて成功したばかりなので、あくまで参考としてお使いください。
補足:他のフォントでもこのテクスチャ画像を使いたい場合
各フォントにテクスチャを用意したいところですが、面倒なのと、容量がでかくなるのでできれば一つで済ませたい!
そういう場合のやり方です。
文字フォントが登録されてない場合、他のフォントファイルを探しに行くと言う、FallBack機能があります。
それの使い方です。
UABEAで他のフォントファイル(MonoBehaviour)をDump抽出します。
1 Array m_FallbackFontAssetTable (1 items) を探し
0 int size = 1
[0]
0 PPtr<TMP_FontAsset> m_FallbackFontAssetTable
0 int m_FileID = 0
0 SInt64 m_PathID = 20863 (ここに読み込んでほしいフォントファイル(MonoBehaviour)を指定)
となるように追記します。
もし関連ファイルを書き換えている場合、UABEAのFileIDが0以外になっていますので、その数字に合わせてみてください。
(補足:UABEA上で1だったので合わせたのに0で正解だったこともあります。トライ&エラーでお願いします。)
これで文字がなかった場合、PathIDで登録してあるフォントファイルを探しに行ってくれます。
0 int size = を増やせば2つ以上のフォントファイルも登録可能です。
最後に:
XUnity.AutoTranslator 便利だわー
単言語のソフトなど、NEW GAMEなどUIなどが、いくつものLevel ファイルにテキストがばらけてたりするから、そういうやつはこいつにお任せすることが出来る。
DOSBOXにこういう機能が欲しいなとずっと思ってたんだよね。