Unity 2018.3(TextMeshPro1.4)からFont FallbackとDynamic SDF Systemが追加され、柔軟なSDFの利用が可能になりました。
結論
以下のような使い分けが可能になります。
- 第一水準漢字でよく使う文字を通常のSDFを事前に生成
- 使用頻度が低い文字や絵文字、キャラクター名等を必要に応じて追加取得(Font Fallback)
- ユーザーが入力する特殊文字等を動的にSDFを生成(Dynamic SDF System)
TextMesh Proでダイナミックにフォントを取得して使用する
TextMeshProはSDFベースのズームしても滑れかなフォントを実現していますが、事前にテキストのベイクが必要という問題を抱えていました。これは英語圏のような文字数が非常に少ない文化圏ではそれ程問題にはならなかったと思いますが、日本語や中国語といった文字数が多い文化圏では大きな問題でした。
例えば、登録文字数を多く表示しようと思ったらテクスチャのサイズの問題から荒いフォントを使う必要がありましたし、登録文字数を減らせば全ての文字が表示出来ません。これはフォントに使用できるテクスチャが一種類だったという事が要因として挙げられます。
これの対策として、フォントを複数のアセットに分散し管理できるFont Fallbackと、動的にフォントを取得してSDFとして使用できるDynamic SDF Systemが追加されたみたいです。
Font Fallback
Font Fallbackは、単純に言えばFontAssetに含まれない文字を別のFontAssetから取得するシステムです。フォントに含まれない文字列を取得する際、フォールバック先に登録しているフォントを探して表示します。
例えば下のように「カタカナ・ひらがな」しか表示出来ないFontAssetで漢字を表示しようとしたとき、今までは□が表示されていました。フォントフォールバックを使うと、漢字を持つフォントを登録していれば漢字を使えるようになります。
使い方は単純で、FontAssetのフォールバックに他のフォントを登録するだけです。
Window>TextMeshPro>FontAssetCreator
でFontFontAsset
を作成(カタカナ、漢字)「漢字」のFontAsset
を選択- Inspectorで
FontAsset
のFallback font asset
に「カタカナ」のFontAsset
を登録
なお、1.4 Preview
現在はuGUI向けTextMeshProだとレイアウトが崩れます。そのため、今回は3D Text向けのTextMeshProを使用しています。
Dynamic SDF System
Dynamic SDF Systemは、SDF AAでフォントテクスチャの生成が超高速になった事で現実的になった機能です。実行時にフォント(otf等)から文字を取得し、ゲームで使用できるようにします。概ねUnity標準のDynamic Fontに近い使い勝手で文字を使用することが出来るのが魅力です。
使い方は大体こんな感じになります。
Window>TextMeshPro>FontAssetCreator
でFontFontAsset
を作成FontAsset
を選択Generation Settings
の項目を埋めるSource Font File
に、フォントファイル(otf等)を指定Atlas Population Model
をDynamic
に変更Atlas Render Mode
はSDF AA
Sample Point Size
は60前後にしておく
(文字の解像度に依存、大きいとフォントがすぐ一杯になる)Atlas Wideth
、Atlas Height
は少し大きめにする
(文字を表示出来る量に依存、小さいとすぐ一杯になる)
- Applyを押す
うまく動かない時は、 Atlas Population Model
をstatic/dynamicで切り替えたり、Sample Point Size
を変更したりすると、直る事があります。
Text Mesh Pro 1.4のDynamic SDF Systemで日本語フォントを使う手順 pic.twitter.com/NaJCbzxDmV
— 椿 (@tsubaki_t1) 2019年2月1日
なお、1.4previewの現状、リセット機構が含まれておらず使用している文字数が一杯になると、文字が追加出来なくなります。
一応これの対処法も書いておくと、FontAssetのResetを行うかTMP_FontAsset.ClearFontAssetData()
を呼ぶ必要があります。ただClearFontAssetData
は「Function might be changed to Internal and only used in tests」とされており、将来的に呼べなくなるらしいです。
多分UnityビルトインのFontSystemのように、内部で管理する形に移行すると思われます。
関連
TextMesh Proとは何ぞや?のアウトライン