TextMeshProのフォントアセットの作成


投稿日:2024年1月10日 | 最終更新日:2024年4月4日

概要

TextMeshProで文字を表示するには、フォントファイルをそのまま使うのではなく、TextMeshPro用のフォントアセットを作成してそれを使用する必要があります。
フォントアセットには、通常のStaticフォントに加えて、Dymaicフォント、DymaicOSフォントの三種類があります。

Staticフォントアセット

通常のフォントアセットです。あらかじめUnityエディタ上でフォントデータをテクスチャに描きこむなどして作成します。
文字を書きこんだテクスチャは「Font Atlas」(アトラス画像)として、フォントアセットのサブアセットになります。
Static(静的)なフォントデータであり、事前に作成した文字以外は扱うことができません。

Font Asset Creator

Staticフォントの作成には、「Window > TextMesh Pro」の Font Asset Creatorから、ツールウィンドウを開いて行います。

設定項目 サブ項目 詳細
Source Font File 使用するフォントファイルを設定してください
ここで設定したフォントはエディタ上でのみ参照されます。プロジェクトのビルドには含まれません。
Sampling Point Size テクスチャに描きこむ際に使用するフォントサイズの設定です。
大きいほど高精細にテキストが表示できますが、描きこむテクスチャサイズも増えてしまいます。
Auto Sizing 設定されたテクスチャサイズに収まる範囲で可能な限り、大きなフォントサイズを自動的に探して設定します。
負荷が高いので、最適なサイズを見積もるのに使用してください
Custom Size フォントサイズを直接設定します。
Padding SDF画像のグラデーションの大きさ。
アウトラインやシャドウ、ベベル効果の太さに関わります。
Sampling Point Sizeの10%以上が推奨。
詳細は、「Paddingの与える影響」も確認してください。
Packing Method テクスチャに描きこむ際の文字の並べ方を指定します
Optimum 最適
可能なかぎり隙間なく文字を並べます。処理が重く大きな負荷がかかります。
例として7000文字→4096x4096だと数十分かかることがあります
Fast 高速で文字を並べます。
例として7000文字→4096x4096でも1分ほど
Atlas Resolution 作成するフォントテクスチャのサイズ。幅と高さのサイズをピクセル単位で設定します。
アルファベットのみの場合は512x512でも十分なことが多いですが、
日本語のように扱う文字が多い場合は4096x4096など大きな値が必要になります。
最大設定値は8192ですが、対象プラットフォームを考慮する必要があります。
たとえば、Androidの一部の端末は4096までしかサポートしていないため
その対応を想定するなら4096以下にする必要があります。
(厳密にはさらに古い端末では2048以下が必須だったするのですが、現在はほとんど使われてないと思います。
最新情報を探したのですが不明でした。参考リンク ) 
Character Set フォントアセットに収録する文字の設定
ASCII ASCII文字を使用
Extended ASCII 拡張ASCII文字を使用
ASCII Lowercase ASCII文字の小文字のみ使用
ASCII Uppercase ASCII文字の大文字のみ使用
Numbers + Symbols  ASCII文字の数字とシンボルのみ使用
Custom Range 使用する文字のunicodeの範囲を、10進数で指定します
ハイフンを使用して、 範囲の最初と最後の値を区切ります。
値と範囲を区切るにはカンマを使用します
(例)32-126,160,8230
Unicode Range (Hex) 同様に使用する文字のunicodeの範囲を、16進数で指定します
(例)20-7E,A0,2026
Custom Characters 設定された文字を使用します。
間にスペースや区切り文字を入れずに、文字を直接入力します。
(例) abc123*#%)。
Characters from File 指定したテキストファイル内の文字を使用します。
コラム:文字コレクションも参考にしてください。
Render Mode 使用するレンダリング モードを指定します
高速に作成したいときは「SDFAA」を使用。
小さな文字を表示するなら「SDF32」
大きな文字を表示するなら「SDF16」を使用するのがよいでしょう。
Get Kerning Pairs フォントからカーニングデータを読み込んで設定する場合は、このオプションを有効にします。

Font Assetの作成

FontAssetCreatorの「Generate Font Atlas」をクリックすると、設定項目に従ってフォントアセットの作成が開始されます。
日本語フォントなど文字数が多いフォントを使おうとすると設定の仕方が難しいので、コラム:TextMeshProで日本語や多言語対応したフォントアセットを作るを参考にしてください。

フォントアセットの作成には数分~数十分、場合によっては数時間と長時間かかります。
また、一度に扱う文字数が多い場合は作成中にかなりPCのメモリを使います。
低スペックなPCの場合は、なるべく他のアプリケーションを終了させるなどしてメモリに余裕を持たせておきましょう。
以下、フォントアセット作成の流れです。

パッキング処理


最初はテクスチャ内にグリフ(文字画像)をどのように並べるかを計算するパッキング処理が行われます。
「Paking Method」が「Fast」の場合は1万文字ほどでも1分ほどで終わりますが、「Optimum」の場合は数十分かかります。
「AutoSize」を使っている場合は、サイズ変えてパッキングを繰り返し適切なサイズを検索するので、さらに数倍の時間がかかります。
「✖」ボタンを押すことで作成を中断できます。

パッキングのログ出力

パッキングが終わると自動的にログが出力されます。
注* UnityやTextMeshProのバージョンによるかもしれませんが、この段階でのログの表示は不安定で正しく表示されないことがあるようです。
  その場合、テクスチャへの描きこみが終わるまで待つ必要があるようです。

Point SizeとSP/PD Ratio
AutoSizeを使っている場合は、「PointSize」と「SP/PD Ratio」がいくつになったかをチェックしましょう。
「SP/PD Ratio」は、「Sampling Point SizeとPaddingの比率」で、基本的には10%以上が推奨されています。
これはTextMeshProを扱う上で最も扱いを注意すべき数値です。

詳細は、「Paddingの与える影響」を確認してください。

Characters Included
 「収録された文字数」 / 「Character Setで設定した文字数」が出力されます。

Missing characters
 「Character Set」で設定した文字にあって、フォントファイル内になかった文字の数です。
 Adobeの文字コレクションなど、フォントファイルの文字と一致しないものを使っている場合は多くなる可能性があります。

Excluded characters
「Character Set」の文字が多すぎてテクスチャに収まりきらなかった文字の数です。
 0にならない場合は、Atlas Resolutionを大きくするなどするして調整するか、フォールバックによるフォントアセットの分割などを検討してください。

詳細ログ

Missing charactersがある場合などは、さらに詳細な文字の一覧などが出力されます。
対象となる文字数が多いと、この出力処理もかなりの負荷がかかってる模様です。
なるべくMissing charactersを0にするためにも、可能であればフォントファイルから作成した文字コレクションを設定したほうが良いです。
また、ログファイルは「AssetTextMeshPro/Glyph Report.txt」としても出力されています。

テクスチャへの描きこみ


ログ出力のあと、テクスチャへSDF画像を描きこむ処理が自動的に始まります。
文字数が多い場合は終了まで数十分と長時間かかります。
「Excluded characters」が0ではないなどで設定を変えて作り直する必要があるなら、「✖」ボタンを押して作成を中断してしまいましょう。

フォントアセットを保存して完成


書き込みが終わるとフォントアセットの保存が可能になるので、保存して完成となります。
「Save」で上書き保存、「Save As」で新しいフォントアセットとして保存します。
新しく保存する際のファイル名はデフォルトでは「フォント名 SDF」となっているのですが、
「プロジェクト名+フォント名+番号」のように、明確に区別がつくものしたほうが良いです。
例)「ProjectNameNotoSans0 SDF」や「ProjectNameNotoSansMain SDF」
参考:フォントアセットの名前は「フォント名 SDF」のままでつけない

Font Assetの更新

いったん作ったフォントアセットに対して、使用文字を追加したりなどして更新をかけるには、
FontAssetのインスペクターから「Update Atlas Textureを」クリックして、Font Asset Creatorを起動します。

Dynamicフォントアセット

ランタイム(ゲームの実行中)に必要に応じて文字データを作成する形式のフォントアセットです。Unityエディタ上で事前にフォントデータを作成する必要がありません。
Dynamic(動的)なフォントデータであり、フォントファイルに収録されている文字であれば扱えるようになるため、文字数の多い日本語などの表示も柔軟に行えるようになります。

Dynamicフォントアセットの作成

ProjectWindow上でフォントファイルを選択して右クリック、「Create > Text > Font Asset」とするとDynamicyフォントが作成できます。
必要に応じて、インスペクターウィンドウの「GenerationSettings」を調整します。
基本的な概念は、Font Asset Creatorのものと同じです。
値を変更したのちに「Apply」とすると、変更した設定に合わせてFaceInfo (LineMetrics)などが自動更新されます。

設定項目 詳細
Source Font File 使用するフォントファイルが設定されています
ここで設定したフォントはプロジェクトのビルドに含まれるため注意(後述)
AtlasPopulationMode フォントアセットのタイプ。基本的には「Dynamic」のまま。
DynamicOSを使う場合はここを「DynamicOS」に変更する。
AtlasRnederMode フォントテクスチャの描きこむ際に使用する描画モード。
高速な「SDFAA」が推奨。
Sampling Point Size フォントテクスチャの描きこむ際に使用するフォントサイズの設定。
Padding Pddingの値。
Sampling Point Sizeの10%以上が推奨。
Atlas Width 作成するフォントテクスチャの幅。
Atlas Height 作成するフォントテクスチャの高さ。
Multi Atlas Texture 作成するテクスチャに文字が入りきらなくなったら新しくテクスチャを追加するようにするか 
Clear Dynamyc Data On Build ビルド時にDynamyc Dataをクリアするかどうか 

Dynamicフォントアセットの注意点

DynamicフォントアセットはランタイムでフォントをSDF形式でテクスチャに焼きこみ、それを利用するため、処理負荷が高いです。
また、利用するフォントファイルもアセットとして組み込まれるという点も重要です。
フォントファイルがアプリサイズを増やし、ランタイム時のメモリを消費するということです。

Dynamicフォントは本当に使用メモリの削減になるのか?

TextMeshProはあらかじめ用意したフォントしか使えないという制約があるため、
日本語や中国語など、文字数が多い言語で使おうとしたときに、フォントアセットが肥大化してしまい、消費メモリが増えてしまうという欠点があります。
それを補うために「よく使う文字に絞ってコンパクトにStaticフォントアセットを用意し、例外的な文字はDynamicフォントでカバーする」というアプローチが考えられます。
こうすれば、最低限のメモリ消費で済むように思えます。
ですが、フォントファイルによるメモリ消費を忘れてはいけません。
フォントファイル自体のファイルサイズや使用メモリはかなり大きいものがあります。
(軽いフォントファイルはそもそも収録している文字数が少ないので、どのみち「例外的な文字を表示する」時には使えません)
さらに、Dynamicフォントを使った場合、「ランタイムで描きこみ可能なテクスチャ(通常のテクスチャよりも消費メモリが倍増する)」がアトラス画像として追加で作成されるため、ここでもメモリ消費が増えます。
もちろんケースバイケースなのですが、中途半端にDynamicフォントを追加するよりも「そのフォントファイルに収録されているすべての文字をStaticフォントアセットに収録する」ほうが、消費メモリが少なくなることも多いようです。

DynamicOSフォントアセット

DynamicOSフォントアセットは、TextMeshPro3.2以降(リリース版はUnity6)から利用可能になったものです。
上記のDynamicフォントアセットは、フォントファイルもビルドに組み込まれ、メモリ負荷も高いという難点がありました。
DynamicOSフォントアセットは、オペレーティングシステム (OS) 上のフォントファイルを扱えるようにして、その欠点を解消したものです。
対象プラットフォームのOSに組み込まれているフォントファイルしか利用できず、エディタ上で動作確認するには対象のフォントファイルをUnityエディタ上にインポートする必要があります。

注~工事中~

DynamicOSフォントアセットは、TextMeshPro3.0(Ugui2.0)がベースのためまだ未検証です。

以下、Unityフォーラムの関連情報を列挙
https://forum.unity.com/threads/textmesh-pro-os-font.1025437/
https://forum.unity.com/threads/how-do-i-use-default-system-font.1262888/
https://forum.unity.com/threads/looking-for-a-system-to-easily-create-dynamic-sdf-fonts-out-of-system-fonts-as-fallback.993049/
https://forum.unity.com/threads/creating-tmp-font-during-build-runtime.1066712/

DynamicOSフォントアセットの作成

ターゲットとなるOSからフォントをプロジェクトにインポートし、それを使ってDynamicフォントアセットを作成し、Atlas Population Mode を「Dynamic OS」に変更することで作成します。

Dynamicフォント、DynamicOSフォントの課題

DynamicフォントもDynamicOSフォントも、先にフォントファイルを設定する必要があります。
設定したフォントファイルにない文字は扱えないため、どんな文字でも表示できるわけではありません。
LegacyTextのように、「文字化けしそうになったら、自動的に対応しているフォントファイルをOSから探してきて使用する」という機能があるとよいのですが、それはまだ難しいようです。
(プログラム拡張して対応可能なのかもしれません)

Font Asset Variant(バリアントの作成)

作成したフォントアセットのFaceInfoなどの一部のパラメーターを書き換えたバリエーションを作成したい場合は、
フォントアセットを選択した状態で右クリックし、「 Create> Text Mesh Pro >Font Asset Variant」でフォントアセットのバリアントが作成できます。
これは、テクスチャアトラス画像などはオリジナルのものと共通に持っているため、余分なリソースの消費を抑えることができます。