LoginSignup
8

More than 3 years have passed since last update.

TextMeshPro 1.4.0 のダイナミックフォント(Dynamic SDF System)使ってみたけど、元の static に戻したお話。

Last updated at Posted at 2019-03-25

半分は使い方間違えてたんですけど、同じような誰かが見るかもしれないしそのまま。

期待してた感じとはちょっと違う。

期待

UI.Text のダイナミックフォントみたいな感じ。
(もうstaticは用意しない。dynamicが良くしてくれる)

実際

  1. JIS第1水準とか常用漢字とかを、今まで通りstaticで作る。
  2. ユーザー入力文字用に、staticなやつのフォールバックにdynamicなのを登録する。

って感じになりそう。

環境

  • バージョン Unity 2018.3.8f1, TMP 1.4.0
  • プラットフォーム エディタ上, WebGL

1.4.0 にアップデートしたら既存のフォントでワーニング出た。

The character used for Ellipsis is not available in font asset [フォント名].
UnityEngine.Debug:LogWarning(Object, Object)
TMPro.TMP_Text:GetSpecialCharacters(TMP_FontAsset) (at Library/PackageCache/com.unity.textmeshpro@1.4.0/Scripts/Runtime/TMP_Text.cs:5463)
TMPro.TextMeshProUGUI:LoadFontAsset() (at Library/PackageCache/com.unity.textmeshpro@1.4.0/Scripts/Runtime/TMPro_UGUI_Private.cs:561)
TMPro.TextMeshProUGUI:Awake() (at Library/PackageCache/com.unity.textmeshpro@1.4.0/Scripts/Runtime/TMPro_UGUI_Private.cs:117)
UnityEngine.Object:Instantiate(GameObject, Transform)

フォントに三点リーダー(U+2026)を追加したらワーニング消える。

使ってみる

【Unity】TextMeshProにFont FallbackとDynamic SDF Systemが追加、日本語が使いやすくなった。 - テラシュールブログ

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

え!そうなんだ!
と思ってとりあえず、期待な感じで

  1. もうstaticは用意しない。dynamicに変更する。

実行時に追加される処理が意外と時間かかるな。重いな。シーンのローディング長くなる...

TextMesh Pro - Version 1.4.0 Preview 3 with Dynamic SDF for Unity 2018.3 now available! - Unity Forum

ご覧のとおり、この方法では1回の呼び出しで2.3MBのヒープメモリを消費します。IuputFieldに中国語の単語を入力しようとすると、メモリが非常に速く増加します。

~~中国語もそんな感じらしい(?)~~ (使い方間違えていたので)
そこで、オススメされていた使い方が、

私の推薦はあなたの主要なフォント資産(あなたのタイトル、メニュー、uiなどに見いだされるものであるプロジェクトの既知の文字/グリフを含む)以前と同じように事前に準備し、静的にします。
それからユーザー入力と他のすべての潜在的な文字を処理するために、あなたの主要な静的フォント資産に動的なフォールバックを割り当てて、他のすべての(未知の/まだプロジェクトの一部ではない)文字をキャッチします。
...
静的フォント資産を準備/使用せずにすべての文字を処理するために動的システムに頼ることはできますが、それがこれらのリソースを管理するための最善策ではないと思います。

  1. プロジェクトで使う文字を、今まで通りstaticで作る。
  2. ユーザー入力文字用に、staticなやつのフォールバックにdynamicなのを登録する。

という使い方。

プロジェクトで使う文字列挙するの絶対面倒・・・。
→ JIS第1水準とか常用漢字とかを、今まで通りstaticで作ろ。

もしくは、エディタ上で最初に実行する時(まだないフォントが追加される時)
は多少重くても良いから、

  1. プロジェクトで使う文字を、dynamicで随時追加する。

という方法も考えつくけど、
文字が追加されるとSDFファイルが更新されるので、複数人でUI触ってるとすぐコンフリクトしそう。
じゃあコンフリクト対策で、コミットしないか相手か自分の更新を破棄すると、動的追加が実行時に処理されて重いのが気になる。最初に戻る。

なんで重いのかな。何か使い方間違ってるのかな???

追記:使い方間違ってました
重い原因は、Atlas Render Mode 変えてなかったからでした。
SDF AAにしたら早くなった。すごい。

じゃあ最初の、
1. もうstaticは用意しない。dynamicに変更する。

で良いのか?でも
文字が追加されるとSDFファイルが更新されるのが、頻繁だと困るなっていう部分は残ってる。

結果的に

  1. JIS第1水準とか常用漢字とかを、今まで通りstaticで作る。
  2. ユーザー入力文字用に、staticなやつのフォールバックにdynamicなのを登録する。

2. それをdynamicにする。(ユーザー入力文字用+そのほか文字用)
↑staticをdynamicに変更するだけだと、staticで用意した文字が消えちゃう。

になるんでしょうか。しばらく様子みます。

参考
【Unity】TextMeshProにFont FallbackとDynamic SDF Systemが追加、日本語が使いやすくなった。 - テラシュールブログ
TextMesh Pro - Version 1.4.0 Preview 3 with Dynamic SDF for Unity 2018.3 now available! - Unity Forum

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8