optimize-text-mesh-pro について
Unity 開発者向けに、TextMeshPro のメモリ、描画、性能、ビルドサイズ、多言語テキストの配置を改善するトラブルシューティングスキルです。症状を分類し、対応する設定方法を案内します。
主な機能
- 01症状に基づくトラブルシューティング
- 02フォントアトラスとフォールバック設定
- 03サンプリング値とフォントスケールの調整
- 04AutoSize と Canvas の性能対策
- 05多言語フォントと配置の案内
- 06マテリアルプリセットの活用
活用シーン
- 01肥大化した TMP アトラスの調査
- 02テキスト更新時の CPU スパイク低減
- 03多言語モバイルビルドの縮小
- 04ラテン文字と CJK の混在表示を調整
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ unity-technologies/ skills --skill optimize-text-mesh-proインストール後、Claude Code で/optimize-text-mesh-proを入力して読み込まれたか確認します。
詳細
TextMeshPro の最適化
トリアージ — まず症状を特定する
ヒントを提供する前に、ユーザーの問題がどのカテゴリに当てはまるかを特定してください。具体的な症状が説明されていない場合は、次のように尋ねてください。「TextMeshPro で メモリ/アトラスの肥大化、視覚品質、CPU/パフォーマンス、ビルドサイズ、ローカライズ/配置のどの問題が発生していますか?」
| 症状 | 参照先 |
|---|---|
| Memory Profiler に大きな TMP アトラス、または複数の TMP アトラスが表示される | フォントスタックと動的フォールバック、Memory Profiler:フォントデータを含める |
| グリフの太さにばらつきがある、輪郭がぼやける、視覚品質に問題がある | パディングとサンプリング比率、フォントアセットのスケール、アトラスのレンダーモード:SDF16 |
| テキスト更新時または Canvas の再構築時に CPU スパイクが発生する | AutoSize、ワールド空間テキストと Canvas テキスト |
| 配布するフォントファイルが原因でビルドサイズが大きすぎる | 動的 OS アトラスの生成 |
| ラテン文字と CJK の混在時に配置がずれる | フォントの正規化 |
| 複数のフォントスタイル(イタリック、アウトライン、グロー)が必要 | マテリアルプリセット |
基本ルール
- メインフォントには、すべてのグリフを含めた静的アセットを使用します。 それ以外は、フォールバックリスト(または TMP Settings)から動的フォールバックを追加します。ピーク時のメモリ使用量を抑えるため、動的アトラスのサイズは 512-1024 にします。
- 動的フォールバックフォントでは
Clear Dynamic Data On Buildを有効にします。 有効にしないと、エディターで生成されたグリフがプレイヤーに含まれます。 - プライマリフォントとフォールバックフォントのパディングとサンプリングポイントサイズの比率を統一します。 比率が異なると、同じ行でグリフの太さにばらつきが生じます。
- ラテン文字のサンプリングポイントサイズは 70-90、CJK は 36-50 にします。 SDF をきれいに表示するには、文字体系ごとに異なるサンプリングサイズが必要です。
- フォントアセットの Scale は 1 にします。 それ以外(例:0.9)では、標準のポイントサイズ計算が崩れます。
- レイアウトが確定したら、実行時の AutoSize を無効にします。 AutoSize はデザイン時に使うものであり、実行中のカウンターには適しません。
- ワールド空間テキストには
TextMeshProUGUIではなくTextMeshProを使用します。 ワールド空間での Canvas のオーバーヘッドは無視できません。 - 頻繁に変更される TMP UI は、再構築のコストを抑えるため、専用の Canvas に配置します。
- 同じフォントのイタリック/太字/アウトライン/グローのバリエーションには、フォントアセットを複製するより TMP のマテリアルプリセットを使用します。
- iOS/Android 向けに多言語ビルドを配布する場合は、システムフォントを利用してビルドサイズを小さくできる
Atlas Population Mode = Dynamic OS(TMP 3.2.0-pre.3 以降)を検討します。
フォントスタックと動的フォールバック
TMP アトラスによるメモリ肥大化が報告された場合は、次のフォントスタックパターンを推奨してください。
Main font asset (static, all required Latin glyphs baked)
-> Fallback 1: Dynamic font (atlas 512 or 1024) for CJK
-> Fallback 2: Dynamic font for symbols / emoji
Clear Dynamic Data On Build を有効にせずに動的フォールバックフォントアセットを配布してはいけません。 この設定がオフの場合、エディターでのテスト中に生成されたすべてのグリフがプレイヤービルドに含まれます。
パディングとサンプリング比率
プライマリフォントとフォールバックフォントの間で線幅やグリフの太さにばらつきがあると報告された場合は、パディングとサンプリングポイントサイズの比率を確認してください。
比率は Padding / SamplingPointSize です。Padding = 9、Sampling Point Size = 90 の場合、比率は 10% です。
- プライマリフォントとフォールバックフォントの比率が異なると、同じ行で線幅にばらつきが生じます。
- 比率を決め(10% が安全な初期値です)、フォントチェーン内のすべてのフォントアセットに適用します。
推奨するサンプリングポイントサイズ:
- ラテン文字:70-90。
- CJK:36-50(CJK グリフは視覚的に密度が高いため、小さめのサンプリングサイズでもきれいな SDF を生成でき、アトラスのメモリを節約できます)。
フォントアセットのスケール
ポイントサイズがデザイン仕様と一致しないと報告された場合は、フォントアセットの Scale 値を確認してください。インポートした TMP フォントアセットの中には、Scale が 1.0 ではなく 0.9 に設定されているものがあります。Scale 値はポイントサイズからピクセルへの計算に関わるため、1 以外の値では標準外のポイントサイズになります。ユーザーには、パディング比率を調整する前に、すべてのフォントアセットの Scale を 1 に設定するよう案内してください。
スプライトアセット
モバイルで TMP スプライトアセットの読み込みが遅いと報告された場合は、元のテクスチャの Texture Type を確認してください。Default(Sprite ではなく)に設定する必要があります。Sprite タイプでは、TMP が使用しない子サブオブジェクトが作成されます。Default にすると、これらを回避できます。
AutoSize
頻繁に変化するテキストフィールド(タイマー、カウンター、チャット、動的なプレイヤー名)で CPU スパイクが発生すると報告された場合は、enableAutoSizing が有効になっているか確認してください。AutoSize は文字列が変わるたびにテキストのサイズを変更するため、CPU スパイクが常時発生します。
次のように案内してください:レイアウトが確定したら、AutoSize を無効にし、選択したポイントサイズをハードコードしてください。ロケールの変更に応じて自動調整が必要な、本当に静的なラベルに限り AutoSize を有効にしてください。
アトラスのレンダーモード:SDF16
ポイントサイズが 72 以上の静的フォントが不鮮明に見えたり、輪郭がぼやけたりする場合は、Atlas Render Mode を SDF16 に切り替えるよう案内してください。大きな字形に対して、アトラスのメモリを多少多く使用する代わりに、より高精度な SDF を使用します。
フォントの正規化
同じ行のラテン文字と CJK テキストがずれて表示されると報告された場合は、次の手順を案内してください。
- Window -> TextMeshPro -> Settings -> Import TMP Example & Extras(プロジェクトごとに一度だけ)。
- ずれているテキストを表示する TextMeshPro オブジェクトに
TMP_TextInfoDebugToolコンポーネントを追加します。 - ShowLines トグルを有効にします。アセンダー、ディセンダー、ベースラインがオーバーレイ表示されます。
- ラテン文字と CJK の文字列を混在させ、線がずれている場合は、揃うまで TMP Font Asset のアセンダー/ディセンダーを調整します。
注意:TMP Examples & Extras のインポートにより、プロジェクトのレイアウトによってはインポートが無限ループすることが確認されています。発生した場合は Unity を終了して再起動してください。2 回目の試行でインポートが完了します。
マテリアルプリセット
同じフォントで複数のスタイル(イタリック、太字、アウトライン、グロー)が必要な場合は、フォントアセットを複製するのではなく、マテリアルプリセットを使うよう案内してください。プリセットは同じフォントテクスチャを共有し、シェーダーパラメーターを上書きします。
作成方法:
- TMP Text GameObject を選択します。
- Inspector で Material セクションを探します。
- Material ヘッダーを右クリック -> Create Material Preset を選択します。
- 新しいマテリアルの名前を変更し、設定を調整します。
- TMP Text コンポーネントで、Material Preset ドロップダウンからプリセットを選択します。
Dynamic OS アトラスの生成(TMP 3.2.0-pre.3)
多言語ビルドをリリースする予定があり、ビルドサイズを懸念している場合は、Atlas Population Mode = Dynamic OS(TMP 3.2.0-pre.3+)の評価を案内してください。
- エディター内:引き続きプロジェクト内のソースフォントを使用します。
- プレイヤービルド内:ソースフォントは含まれません。実行時に Unity が、Family + Style 名が一致するフォントをデバイス上で検索します。
CJK 向けの推奨システムフォント:
| プラットフォーム | 推奨システムフォント |
|---|---|
| Android | NotoSans(中国語、日本語、韓国語の字形を幅広くカバーします)。 |
| iOS | 簡体字/繁体字中国語向けの PingFang。iOS では CJK の各言語に 固有のフォント(中国語、日本語、韓国語で異なるファミリー)を使用します。3 言語すべてに単一の TMP セットアップを使用する場合は、フォールバックチェーンを確認してください。 |
メリット:CJK フォントファイルを同梱しないためビルドサイズが縮小し、システムフォントが OS と共有されるためメモリ使用量も減少します。
Memory Profiler:フォントデータを含める
エディターで Memory Profiler に予想以上に大きなフォントアセットサイズが表示される場合は、.ttf/.ttc のインポート設定で Include Font Data が有効になっているか確認してください。エディターではデフォルトでソースフォントファイルがアセットに含まれますが、デバイス上では(特に Dynamic OS の場合)このコストは発生しません。
エディターのキャプチャをデバイスの状態に合わせるには、フォントファイルのインポート設定で Include Font Data の選択を解除します。すると Memory Profiler に、元のフォントファイルを除いたオーバーヘッドが表示されます。
ワールド空間テキストと Canvas テキスト
ユーザーが TextMeshProUGUI を使用したワールド空間テキスト(ダメージ数値、看板、ホログラムなど)を使っている場合は、TextMeshPro に切り替えるよう案内してください。ワールド空間 Canvas は効率が悪いことで知られています。
TextMeshProUGUI 要素の text が頻繁に変更される場合(タイマー、カウンター、チャットなど)は、独自の Canvas コンポーネントを持つ子 GameObject の下に配置するよう案内してください。Canvas の再構築は Canvas ごとに行われるため、頻繁に変わるフィールドを分離すれば、UI の残りの部分の再構築コストを抑えられます。
よくある落とし穴
ユーザーの設定が以下のいずれかに該当する場合は、指摘してください。
- 静的なメインフォントと動的なフォールバックの組み合わせではなく、すべての言語に対して 1 つの巨大な動的フォントアセットを使っている — 動的アトラスが肥大化します。
- メインフォントとフォールバックでパディング比率が一致していない — 同じ行のテキストが 2 種類のフォントで表示されたように見えます。
- インポート時に継承されたフォントアセットの Scale が 0.9 になっている — ポイントサイズがデザイン仕様と一致しません。
- 動的なカウンターで AutoSize を有効にしたままにしている — 見えにくい CPU スパイクが発生します。
- ワールド空間 Canvas 内でワールド空間の
TextMeshProUGUIを使っている — メリットがないのに再構築が増えます。TextMeshProを使用してください。 - 動的フォールバックフォントで Clear Dynamic Data On Build を忘れている — エディターでテストしたグリフがプレイヤーに含まれます。
- Include Font Data をオンにして Editor で Memory Profiler を取得し、デバイス上のビルドのほうが小さいことに驚く。
- スプライトアセットのソーステクスチャの種類が Sprite に設定されている — 余分な子サブオブジェクトが読み込まれるため、モバイルでの読み込みが遅くなります。
参考資料
- TextMeshPro - アトラスの生成モード(Unity マニュアル):https://docs.unity3d.com/Packages/com.unity.textmeshpro@latest/manual/FontAssets.html