【Unity】TextMeshProのアセットバンドルをAddressableアセットシステムできちんと管理する

UnityでTextMeshProのアセットバンドルをAddressableアセットシステムできちんと管理する方法です。

Unity 2022.3.28f1
TextMesh Pro 3.0.6

はじめに

TextMeshProを使うと、フォントファイルの他に、フォントアセット、シェーダなど関連するアセットが生成されます。
また、ダイナミックフォントにするかどうかによっても挙動が変わります。

Addressableアセットシステムを使ってこれらをロードする場合、依存関係を理解して適切にアドレスを割り振る必要があります。
本記事ではこの方法についてまとめます。

なお、TextMeshProやAddressableアセットシステムの基礎知識については本記事では扱わないので、適宜他の記事を参照してください。

記事中で使用しているAddressableのAnalyzeツールについては以下にまとめていますので適宜参照してください。

light11.hatenadiary.com

StaticフォントをAddressableに登録する

それでは挙動を理解するために、まずStaticフォントをAddressableに登録してみます。
以下のように Atlas Population Mode を Static にした Font Asset を作成します。

Font Asset

これを Addressable に適当なアドレスで登録します。

Addressableに登録

Addressables Analyzer で依存関係を見てみます。

依存関係

すると、暗黙的な依存としてシェーダが含まれることがわかりました。

シェーダを別アセットバンドルに切り出す

シェーダは多くの Font Asset で共通して使われることが考えられるため、別のアドレスを割り振ってアセットバンドルを切り分けます。

TextMesh Proでは Assets/TextMesh Pro/Shaders にシェーダがすべて入っているので、このフォルダごと Addressable に登録します。

フォルダごと登録

これでシェーダが別のアセットバンドルに切り出されました。

別アセットバンドルに

使うシェーダだけアセットバンドルにしたり、全部個別にアドレスを振ってもいいのですが、管理するコストを考えると上記のような感じでいいでしょう。

DynamicフォントをAddressableに登録する

さて次に、Atlas Population Mode を Dynamic にした Font Asset を作成します。

Dynamicなフォントアセット

これを Addressable に登録して、同様に依存関係を分析します。

依存関係を分析

すると、フォントファイル(ttf)が暗黙的な依存関係として含まれていることを確認できます。   DynamicフォントはStaticフォントと違って動的にフォントを参照してアトラスを生成するためです。

フォントを別アセットバンドルに切り出す

Dynamicフォントにフォントファイルが含まれるのは、リソース設計的に意図したものであればこのままでも問題ありません。
しかしフォントファイルは容量が大きいので、他のフォントアセットから同じフォントが参照された時に重複して含まれてしまうリスクを考えるとシェーダと同様に切り出しておいた方が良さそうです。

アセットバンドルを切り出すことで、容量が大きくなりがちなフォントファイルを事前にダウンロードやロードするといったこともできます。

そこで以下のように Bundle Mode を Pack Separately に設定した Fonts グループを作り、ここにフォントファイルを入れることにしました。

別グループに切り分け

これでフォントファイルが別アセットバンドルとして切り出されました。

別アセットバンドルに

アドレスを振る単位まとめ

ここまでの挙動を振り返ると、アプリごとのリソース設計にはよりますが、以下のようにアドレスを振っておけば大体問題は起こらなそうです。

  • シェーダ(Assets/TextMesh Pro/Shaders)はフォルダにアドレスを付与
  • フォントファイルは個別にアドレスを付与& Pack Separately でアセットバンドルを分ける
    • ただし Static フォントからしか参照されないフォントファイルは不要
  • フォントアセットは適切な粒度にまとめる
    • シェーダやフォントファイルから分離されていればフォントアセット同士はそれなりにまとめてもOK
    • Fallbackでフォントアセット同士の依存関係がある場合にはそれに注意しつつ設計する

関連

light11.hatenadiary.com