以下の内容はhttps://hacchi-man.hatenablog.com/entry/2025/05/08/220000より取得しました。


【Unity】TextMeshPro フォントを一括置換するエディタ拡張ツール

Unity で UI を開発していると、TextMeshPro のフォントを後から変更したくなることがあります。
特に大量のプレハブを使っているプロジェクトでは、手作業での変更はとても大変です。

今回は、すべてのプレハブに含まれる TextMeshPro コンポーネントのフォントを一括で置換する Unity エディタ拡張ツールを紹介します。

ツールの概要

このエディタ拡張の機能は以下の通りです:

  • 指定した TMP_FontAsset に一括置換
  • Assets フォルダ内のすべてのプレハブを対象に検索
  • 差し替えが必要なプレハブだけ保存
  • 処理完了後にダイアログで結果を通知

使い方

  1. Unity メニューから Tools > TextMeshPro Replace Font を選択
  2. 差し替えたいフォントアセットをインスペクターで指定
  3. Replace Fonts in All Prefabs ボタンをクリック
  4. 自動的にすべてのプレハブがスキャン・修正され、結果がダイアログで表示されます

コード全文

以下がツールのソースコードです。
Editor フォルダに ReplaceTextMeshProFontsEditor.cs として保存してください。

using UnityEngine;
using UnityEditor;
using TMPro;

public class ReplaceTextMeshProFontsEditor : EditorWindow
{
    [MenuItem("Tools/TextMeshPro Replace Font")]
    public static void ShowWindow()
    {
        var window = GetWindow<ReplaceTextMeshProFontsEditor>(nameof(ReplaceTextMeshProFontsEditor));
        window.Show();
    }
    
    [SerializeField]
    private TMP_FontAsset _replaceFont;

    private void OnGUI()
    {
        GUILayout.Label("Replace TextMeshPro Font in This Project", EditorStyles.largeLabel);

        _replaceFont = (TMP_FontAsset)EditorGUILayout.ObjectField("Replace Font", _replaceFont, typeof(TMP_FontAsset), false);

        using (new EditorGUI.DisabledScope(_replaceFont == null))
        {
            if (GUILayout.Button("Replace Fonts in All Prefabs"))
            {
                ReplaceFontsInAllPrefabs();
            }
        }
    }

    private void ReplaceFontsInAllPrefabs()
    {
        var guids = AssetDatabase.FindAssets("t:Prefab", new[] { "Assets" });

        var replaceCount = 0;

        foreach (string guid in guids)
        {
            var path = AssetDatabase.GUIDToAssetPath(guid);
            var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(path);
            if (prefab == null) 
                continue;

            bool modified = false;

            var instance = (GameObject)PrefabUtility.InstantiatePrefab(prefab);

            var components = instance.GetComponentsInChildren<TMP_Text>(true);
            foreach (var component in components)
            {
                if (component.font == _replaceFont) 
                    continue;
                
                component.font = _replaceFont;
                modified = true;
            }
            
            if (modified)
            {
                PrefabUtility.SaveAsPrefabAsset(instance, path);
                replaceCount++;
            }

            DestroyImmediate(instance);
        }

        if (replaceCount > 0)
            AssetDatabase.SaveAssets();
        
        var message = replaceCount == 0
            ? "Font replacement was not needed."
            : $"Replaced {replaceCount} fonts in prefabs.";

        EditorUtility.DisplayDialog("Complete", message, "OK");
    }
}

⚠ 補足と注意点

このツールはプレハブを対象としています。シーン上のオブジェクトには対応していません。

バージョン管理(Gitなど)を使っている場合、実行前にコミットしておくことをおすすめします。

フォント差し替えにより、UI のレイアウトが崩れる場合もあるので、適用後は確認を忘れずに!

まとめ

このような小さなエディタ拡張を作るだけでも、プロジェクトの保守性や効率がぐっと上がります。

フォントの統一やデザイン変更が頻繁にあるプロジェクトでは、ぜひ活用してみてください!




以上の内容はhttps://hacchi-man.hatenablog.com/entry/2025/05/08/220000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14