TextMeshProのフォールバック


投稿日:2024年1月16日 | 最終更新日:2024年3月29日

概要

フォールバックとは「あるフォントアセットで対応していない文字があった場合に、別のフォントアセットやスプライトアセットから文字データ(グリフ)やスプライトを探してきて使用する」という仕組みのことです。
基本的には1つのフォントでカバーできない文字を表示できるようにして文字化けを避けるための仕組みです。
応用として、次のような使い方できます。
・大量の文字を使用する場合、一つのフォントアセットに収まりきらないものを複数のフォントアセットに分割する。
・特殊文字などを収録しているフォントファイルの文字を追加する。
・フォールバックにダイナミックフォントを設定することで、例外的な文字の表示を極力カバーする。

フォールバックチェーン

フォールバックは基本的にはフォントアセットのFallbak Font Assets に設定します。

ほかにもスプライトアセットやプロジェクト設定など複数箇所で設定可能です。
そのため、どの順番でフォールバックを検索するかの優先順があります。
以下はその一覧です。

優先順 フォントアセット
1 テキストコンポーネントのFontAssetに設定されている、基本となるフォントアセット
2 フォントアセットのFallbak Font Assets
3 テキストコンポーネントのExtra SettingsのSpriteAssetに設定されているスプライトアセット
4 プロジェクト設定のFallback Font Assets
5 プロジェクト設定のDefault Sprite Assetに設定されているスプライトアセット
6 プロジェクト設定のDefault Font Asset
7 最終的にどのフォールバックフォントにも対応文字が見つからなかった場合は、
プロジェクト設定のMissing character unicodeで設定されたunicodeの文字を表示します

リストで設定されたものはその順番通りに検索されます。
また、フォールバックの検索は基本的には再起的に行われます。
たとえばフォールバックで設定されたフォントアセットにも、さらにフォールバック用のフォントアセットが設定されていた場合には、さかのぼってそのフォントアセットを検索していきます。
既に検索したフォントアセットはそれ以上検索しないので、フォールバック設定が循環参照になっていても、無限ループに陥るといったことはないようです。

これら一連のフォールバックの連鎖を「フォールバックチェーン」と呼びます。

サブメッシュ

TextMeshProは、フォールバックを使って文字を表示するときサブメッシュと呼ばれる子GameObjectを自動生成します。

サブメッシュは、TMP SubMeshUI [フォント名] などの名前がついています。
これはシーンには保存されない特殊なGameObjectで、ユーザー側で編集等をする必要はありません。

サブメッシュを使うと、ドローコールが増えるため若干の負荷にはなりますが、そこまで気にする必要はないようです。
参考:TextMesh Pro - Mix Fonts together - Unity Forum

サブメッシュのマテリアル

フォントのマテリアルは、フォントアセットごとに異なるものが必要になります。
フォールバックを使った場合も同様で、自動生成されたサブメッシュごとにメインのフォントマテリアルとは異なるマテリアルが割り当てられます。

プロジェクト設定の「Match Material Preset」がオンの場合、メインのフォントマテリアルの設定をコピーしてサブメッシュのフォントアセットに合わせたものが自動生成されて使用されます。
(オフにすると設定はコピーされず、各フォールバックフォントのデフォルトのフォントマテリアルのままになります)

アウトラインの太さなどは「マテリアルの設定値」と「PaddingとPointSizeの比率」によって決まるため、メインとなるフォントアセットとフォールバックのフォントアセットの「PaddingとPointSizeの比率」を統一するようにしましょう。
フォールバックでコピーしたマテリアルを使う際に、「PaddingとPointSizeの比率」も一致させないと、アウトラインの太さがフォールバックによってバラバラになってしまうためです。
さらにいえば、可能ならばLineMetrixも一致させたほうが良いでしょう。

参考:Feature Request - BLineetter Fallback system for missing characters - Unity Forum