テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】TextMeshProにFont FallbackとDynamic SDF Systemが追加、日本語が使いやすくなった。

f:id:tsubaki_t1:20190202060611j:plain

Unity 2018.3(TextMeshPro1.4)からFont FallbackDynamic SDF Systemが追加され、柔軟なSDFの利用が可能になりました。

結論

以下のような使い分けが可能になります。

  • 第一水準漢字でよく使う文字を通常のSDFを事前に生成
  • 使用頻度が低い文字や絵文字、キャラクター名等を必要に応じて追加取得(Font Fallback)
  • ユーザーが入力する特殊文字等を動的にSDFを生成(Dynamic SDF System)

f:id:tsubaki_t1:20190202044951j:plain

TextMesh Proでダイナミックにフォントを取得して使用する

TextMeshProはSDFベースのズームしても滑れかなフォントを実現していますが、事前にテキストのベイクが必要という問題を抱えていました。これは英語圏のような文字数が非常に少ない文化圏ではそれ程問題にはならなかったと思いますが、日本語や中国語といった文字数が多い文化圏では大きな問題でした。

例えば、登録文字数を多く表示しようと思ったらテクスチャのサイズの問題から荒いフォントを使う必要がありましたし、登録文字数を減らせば全ての文字が表示出来ません。これはフォントに使用できるテクスチャが一種類だったという事が要因として挙げられます。

これの対策として、フォントを複数のアセットに分散し管理できるFont Fallbackと、動的にフォントを取得してSDFとして使用できるDynamic SDF Systemが追加されたみたいです。

Font Fallback

Font Fallbackは、単純に言えばFontAssetに含まれない文字を別のFontAssetから取得するシステムです。フォントに含まれない文字列を取得する際、フォールバック先に登録しているフォントを探して表示します。

例えば下のように「カタカナ・ひらがな」しか表示出来ないFontAssetで漢字を表示しようとしたとき、今までは□が表示されていました。フォントフォールバックを使うと、漢字を持つフォントを登録していれば漢字を使えるようになります

f:id:tsubaki_t1:20190202041824j:plain
Font Fallback

使い方は単純で、FontAssetのフォールバックに他のフォントを登録するだけです。

  1. Window>TextMeshPro>FontAssetCreatorFontFontAssetを作成(カタカナ、漢字)
  2. 「漢字」のFontAssetを選択
  3. InspectorでFontAssetFallback font asset「カタカナ」のFontAssetを登録

f:id:tsubaki_t1:20190202043252j:plain
Font Fallbackの登録

なお、1.4 Preview現在はuGUI向けTextMeshProだとレイアウトが崩れます。そのため、今回は3D Text向けのTextMeshProを使用しています。

Dynamic SDF System

Dynamic SDF Systemは、SDF AAでフォントテクスチャの生成が超高速になった事で現実的になった機能です。実行時にフォント(otf等)から文字を取得し、ゲームで使用できるようにします。概ねUnity標準のDynamic Fontに近い使い勝手で文字を使用することが出来るのが魅力です。

使い方は大体こんな感じになります。

  1. Window>TextMeshPro>FontAssetCreatorFontFontAssetを作成
  2. FontAssetを選択
  3. Generation Settingsの項目を埋める
    • Source Font Fileに、フォントファイル(otf等)を指定
    • Atlas Population ModelDynamicに変更
    • Atlas Render ModeSDF AA
    • Sample Point Sizeは60前後にしておく
      (文字の解像度に依存、大きいとフォントがすぐ一杯になる)
    • Atlas WidethAtlas Heightは少し大きめにする
      (文字を表示出来る量に依存、小さいとすぐ一杯になる)
  4. Applyを押す

うまく動かない時は、 Atlas Population Modelをstatic/dynamicで切り替えたり、Sample Point Sizeを変更したりすると、直る事があります。

なお、1.4previewの現状、リセット機構が含まれておらず使用している文字数が一杯になると、文字が追加出来なくなります。
一応これの対処法も書いておくと、FontAssetのResetを行うかTMP_FontAsset.ClearFontAssetData()を呼ぶ必要があります。ただClearFontAssetDataは「Function might be changed to Internal and only used in tests」とされており、将来的に呼べなくなるらしいです。

多分UnityビルトインのFontSystemのように、内部で管理する形に移行すると思われます。

f:id:tsubaki_t1:20190202050847j:plain
TMP_FontAssetのリセット

gist.github.com

関連

TextMesh Proとは何ぞや?のアウトライン

http://inter-high-blog.unity3d.jp/2017/08/18/textmeshpro/

tsubakit1.hateblo.jp

www.youtube.com