UnityでTextMeshProのアセットバンドルをAddressableアセットシステムできちんと管理する方法です。
- はじめに
- StaticフォントをAddressableに登録する
- シェーダを別アセットバンドルに切り出す
- DynamicフォントをAddressableに登録する
- フォントを別アセットバンドルに切り出す
- アドレスを振る単位まとめ
- 関連
Unity 2022.3.28f1
TextMesh Pro 3.0.6
はじめに
TextMeshProを使うと、フォントファイルの他に、フォントアセット、シェーダなど関連するアセットが生成されます。
また、ダイナミックフォントにするかどうかによっても挙動が変わります。
Addressableアセットシステムを使ってこれらをロードする場合、依存関係を理解して適切にアドレスを割り振る必要があります。
本記事ではこの方法についてまとめます。
なお、TextMeshProやAddressableアセットシステムの基礎知識については本記事では扱わないので、適宜他の記事を参照してください。
記事中で使用しているAddressableのAnalyzeツールについては以下にまとめていますので適宜参照してください。
StaticフォントをAddressableに登録する
それでは挙動を理解するために、まずStaticフォントをAddressableに登録してみます。
以下のように Atlas Population Mode を Static にした Font Asset を作成します。
これを Addressable に適当なアドレスで登録します。
Addressables Analyzer で依存関係を見てみます。
すると、暗黙的な依存としてシェーダが含まれることがわかりました。
シェーダを別アセットバンドルに切り出す
シェーダは多くの Font Asset で共通して使われることが考えられるため、別のアドレスを割り振ってアセットバンドルを切り分けます。
TextMesh Proでは Assets/TextMesh Pro/Shaders にシェーダがすべて入っているので、このフォルダごと Addressable に登録します。
これでシェーダが別のアセットバンドルに切り出されました。
使うシェーダだけアセットバンドルにしたり、全部個別にアドレスを振ってもいいのですが、管理するコストを考えると上記のような感じでいいでしょう。
DynamicフォントをAddressableに登録する
さて次に、Atlas Population Mode を Dynamic にした Font Asset を作成します。
これを Addressable に登録して、同様に依存関係を分析します。
すると、フォントファイル(ttf)が暗黙的な依存関係として含まれていることを確認できます。 DynamicフォントはStaticフォントと違って動的にフォントを参照してアトラスを生成するためです。
フォントを別アセットバンドルに切り出す
Dynamicフォントにフォントファイルが含まれるのは、リソース設計的に意図したものであればこのままでも問題ありません。
しかしフォントファイルは容量が大きいので、他のフォントアセットから同じフォントが参照された時に重複して含まれてしまうリスクを考えるとシェーダと同様に切り出しておいた方が良さそうです。
アセットバンドルを切り出すことで、容量が大きくなりがちなフォントファイルを事前にダウンロードやロードするといったこともできます。
そこで以下のように Bundle Mode を Pack Separately に設定した Fonts グループを作り、ここにフォントファイルを入れることにしました。
これでフォントファイルが別アセットバンドルとして切り出されました。
アドレスを振る単位まとめ
ここまでの挙動を振り返ると、アプリごとのリソース設計にはよりますが、以下のようにアドレスを振っておけば大体問題は起こらなそうです。
- シェーダ(Assets/TextMesh Pro/Shaders)はフォルダにアドレスを付与
- フォントファイルは個別にアドレスを付与& Pack Separately でアセットバンドルを分ける
- ただし Static フォントからしか参照されないフォントファイルは不要
- フォントアセットは適切な粒度にまとめる
- シェーダやフォントファイルから分離されていればフォントアセット同士はそれなりにまとめてもOK
- Fallbackでフォントアセット同士の依存関係がある場合にはそれに注意しつつ設計する