編集

【Unity6】日本語フォントを入れようとして、ぼやけ・assetの生成失敗・文字化けなど各種問題が発生する時の対処法

Unityのデフォルトのフォントを使っていると、日本語が文字化けします。


これを防ぐには、Google Fontsなどのフォントを予めインストールしておく必要があります。

導入はこちらの手順が詳しいです。

が、いくつか設定ミスをして詰まったので、その解消手順をまとめます。



起こったこと

Font assetがうまく生成されない

Unityのfont asset

問題&原因

Fのマークのファイル(図では上部の81...から始まるファイル)ができて欲しいのに、生成結果が別種のファイル(図ではupdate...から始まるファイル)になって、フォントをセットできない。

→Font Asset Creator(TextMeshPro)を選ぶ。


解説

Font Asset Creator
これ。

TextTextMeshProという2種類があり、後者のFont Asset Creatorを使う必要がある。別種ファイルができたのは、Textの方のFont Asset Creatorを使ってしまったせい。
まぎらわしいので注意。



assetが一瞬で生成されるが、ほとんどの文字が登録されていない

問題&原因

Generate Font Atlasをクリック後、一瞬でフォント生成されるが、ゲーム内で表示しても正しく出ない。

→Characters form fileでなく、Custom Charactersにして、実際に使う文字を全部ペーストして生成する。


解説

Characters form fileを使うと高確率でこの現象が起きたので、(おそらく)生成文字対象がうまく選定されていないのでは、と考えられる。
ASCIIなど、英数字しか生成しないような内部設定になっており、日本語フォントの生成が全部無視され、一瞬で終わっている可能性がある。
なので、文字を全部ペーストするのが確実。


文字がモザイクのかかったようにぼける

TextMeshPro

問題&原因

生成したフォントを反映したら、謎にぼやけてしまう。

Atlas Resolutionの設定値を大きくする(8192など)。



解説

Font Asset Creator

Atlas Resolutionをデフォルトの512x512にして生成していた。これを8192に上げたら、無事にうまくいった。


※ Atlasについて、補足

フォントアセットを作成する際、選択したフォントファイルから必要なすべての**文字の図形データ(グリフ)を抽出する。Atlasとは、Texture atlasの略で、このグリフ一つ一つを、一枚の大きな正方形のAtlasに効率よく並べたもの。テキストを表示する際には、該当の文字部分だけを切り取って表示される仕組みになっている。



生成はできたが謎の文字化けを起こす

TextMeshPro


問題&原因

生成したフォントを反映させると、謎の文字化けを起こす。

Atlasを大きくするか、文字数を減らす。



解説

8192で作ると、あまりにファイルサイズが大きいので、4096に落として生成したらこのようなことになった。
Atlasが小さすぎて収まりきらないことで、文字グリフの割り当てがずれて、グリフテーブルの参照先がおかしくなっているらしい。

今回使った文字データの中には、絶対に使わないだろうという文字も多数含まれていたので、それを大幅に削ることで、4096でもAtlasを正しく生成できた。

動的な入力システムなどがないなら、実際使う文字だけに絞れば、もっと小さなAtlasにし、容量削減できるはず。


※assetのサイズ比較

7267文字 x Atlas 8192 → 生成結果のassetサイズ: 137.8 MB
3795文字 x Atlas 4096 →  生成結果のassetサイズ: 35.4 MB

8192x8192(約 6700万ピクセル) から4096x4096 (約1600万ピクセル) に解像度を落とした結果、データサイズが1/4になった。

どのAtlasを使うのかが大事。
文字数が少ないほど小さなAtlasでパッキングできるので、なるべく文字数を減らすと◎。


文字の周りにうっすらと四角形が出る


問題&原因

フォント生成時、paddingを0にしていた。
paddingを5%にして再生成したら解決。

参考: 【Unity / TextMeshPro】Outlineで透明な背景が出る現象とその対処法【備忘録】


解説


TextMesh Proでは、アウトラインやシャドウなどのエフェクトを描画するために、文字の周囲に余白を確保する必要があり、これが不足していると、エフェクトがFont Atlasの境界で切り取られ、透明な背景が描画される場合があるらしい。




まとめ

Button
無事出てよかったね

も〜〜〜〜大変!!!
行き詰まってこうしてブログにまとめるたびに、経験値が溜まっていく感じがあるのはいつものことですね。

これでもう、Unityの日本語フォント生成には迷わないぞ!!