Closed1

TextMeshProで多言語対応

0y00y0

https://blog.kyubuns.dev/entry/2021/02/06/001609

記事のポイント

フォントアセットの3層構成

記事では、1つのフォントファイルから3種類のFontAssetを作成する方法を提案

Baseフォントアセット

  • Extended ASCIIなど、基本的な文字を収録
  • サイズは512×512のテクスチャを使用し、Render ModeはSDFAA、Atlas Population ModeはStaticに設定

Languageフォントアセット(各言語別)

  • 例えば日本語の場合は、基本的な日本語と常用漢字を収録
  • 2048×2048のテクスチャで生成し、こちらもStaticモード
  • 他の言語は適切な文字リストがあれば同様に作成

Dynamicフォントアセット

  • Dynamicモードで作成し、ランタイム時にBaseやLanguageに含まれていない文字を自動的にテクスチャへ追加
  • 1024×1024のテクスチャに設定し、Multi Atlas Texturesを有効にすることで、必要に応じて追加のアトラスが生成されるようにする

これらを組み合わせることで、全体として約5.25MB前後のメモリ使用量となり、各用途に応じた最適なフォント表示を実現する

フォントフォールバックの設定

エディタ上での設定

  • BaseフォントアセットのFont Fallbackとして、Languageフォントアセット(例:日本語用)とDynamicフォントアセットをあらかじめ設定しておくことで、基本的な文字表示はカバー
  • しかし、この状態で全てのフォントが常にメモリに乗るため、多言語対応の場合はメモリ使用量が増大するリスクがある

ランタイムでのフォールバック設定

  • そのため、Addressablesを利用して各FontAsset(Base、Language、Dynamic)を個別に読み込み、現在の言語設定に応じて必要なフォールバックのみをBaseフォントアセットに設定
  • 実際に使用するフォントだけがメモリにロードされ、不要なFontAssetの読み込みを避けることが可能

具体的には、次の手順で処理

  1. Addressablesから「Hoge Base」を読み込み
  2. ゲームの言語設定に基づき、「Hoge Language ja」などの該当FontAssetをAddressablesから読み込み、BaseのfallbackFontAssetTableに追加
  3. 同様に、DynamicフォントアセットもAddressablesから読み込み、Baseのfallbackに追加

これにより、例えば日本語環境では「Hoge Language ja」とDynamicのみがフォールバックとして設定され、他言語のFontAssetは読み込まれず、メモリ使用量の最適化が可能

Addressablesの役割と利用理由

この記事では、Addressablesは単にDynamicフォントのテクスチャをクリアするためだけでなく、ランタイムで必要なFontAssetのみを効率的にロードし、Font Fallbackを動的に設定するために利用

メモリ効率の向上

  • エディタ上では全てのFontAssetを設定していると、不要なアセットまでメモリに乗ってしまう
  • ランタイムでAddressablesを使い、使用言語に合わせたFontAssetのみを読み込むことで、メモリ使用量を抑えられる

動的な更新と管理

  • Dynamicフォントはランタイム中に文字が追加されテクスチャが更新されるため、これをクリアする処理(ClearFontAssetData()の呼び出し)もAddressables経由で取得した参照を使って行う
  • これにより、バージョン管理で差分が発生する問題や不要な文字データの蓄積を防ぐ
このスクラップは5ヶ月前にクローズされました