Unity で UI を開発していると、TextMeshPro のフォントを後から変更したくなることがあります。
特に大量のプレハブを使っているプロジェクトでは、手作業での変更はとても大変です。
今回は、すべてのプレハブに含まれる TextMeshPro コンポーネントのフォントを一括で置換する Unity エディタ拡張ツールを紹介します。

ツールの概要
このエディタ拡張の機能は以下の通りです:
- 指定した
TMP_FontAssetに一括置換 Assetsフォルダ内のすべてのプレハブを対象に検索- 差し替えが必要なプレハブだけ保存
- 処理完了後にダイアログで結果を通知
使い方
- Unity メニューから
Tools > TextMeshPro Replace Fontを選択 - 差し替えたいフォントアセットをインスペクターで指定
Replace Fonts in All Prefabsボタンをクリック- 自動的にすべてのプレハブがスキャン・修正され、結果がダイアログで表示されます

コード全文
以下がツールのソースコードです。
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 のレイアウトが崩れる場合もあるので、適用後は確認を忘れずに!
まとめ
このような小さなエディタ拡張を作るだけでも、プロジェクトの保守性や効率がぐっと上がります。
フォントの統一やデザイン変更が頻繁にあるプロジェクトでは、ぜひ活用してみてください!