0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Unity] Editor Fontを変更する

0
Last updated at Posted at 2026-07-07

Unity 6.5 (6000.5.0f1)をmacで使用すると、Consoleに

Atlas is full, consider enabling multi-atlas textures in the Font Asset: English - OSX
UnityEditor.GUIView:ProcessEvent (UnityEngine.EntityId,intptr,bool&)

のようなエラーが表示され、InspectorやHierarchy上の文字が欠落することがあります。

スクリーンショット 2026-07-08 7.43.41.png

AIに相談したところ、Editor Font を差し替えることで回避可能とのことでした。

  1. 適当なフォルダの下にEditorフォルダを作り、その中にFontフォルダを作る

  2. Fontフォルダ内に差し替えたいFontを用意する
    スクリーンショット 2026-07-08 7.53.03.png

  3. Editorフォルダ内に下記のスクリプトを用意する
    スクリーンショット 2026-07-08 7.52.44.png

※スクリプト内 Assets/<パス>/Editor/Fonts/<フォント名>.ttf の部分は選択したフォルダやフォントに合わせて変更してください

GlobalFontReplacer.cs
GlobalFontReplacer.cs
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

/// <summary>
/// Unityエディタ全体(Inspectorや各ウィンドウ)のUIフォントを強制的に指定フォントに置き換えるエディタ拡張
/// </summary>
[InitializeOnLoad]
public static class GlobalFontReplacer
{
    // 使用したい日本語フォントのパス(配置場所に合わせて調整してください)
    private const string FontPath = "Assets/Global/Editor/Fonts/WDXLLubrifontJPN-Regular.ttf";

    private static Font editorJpFont;
    private static Font EditorJpFont => editorJpFont ??= AssetDatabase.LoadAssetAtPath<Font>(FontPath);

    static GlobalFontReplacer()
    {
        // エディタ起動時およびコンパイル時に、フォント適用処理を登録する
        EditorApplication.delayCall += TryApplyGlobalFont;
        Selection.selectionChanged += HandleSelectionChanged;
        Editor.finishedDefaultHeaderGUI += HandleFinishedDefaultHeaderGUI;
    }

    private static void HandleSelectionChanged()
    {
        // Inspectorの描画が差し替わるタイミングで再適用する
        EditorApplication.delayCall += TryApplyGlobalFont;
    }

    private static void HandleFinishedDefaultHeaderGUI(Editor editor)
    {
        if (EditorJpFont == null) return;

        // OnGUI内でのみ有効なGUI.skin側にフォントを反映する
        ApplyFontToCurrentGuiSkin(EditorJpFont);
    }

    // メニューバー(Window > Force Apply Global Font)からも手動で再適用できるようにする
    [MenuItem("Window/Force Apply Global Font")]
    public static void TryApplyGlobalFont()
    {
        if (EditorJpFont == null)
        {
            Debug.LogWarning($"[GlobalFontReplacer] フォントが見つかりません: {FontPath}");
            return;
        }

        // 独自のStyleFontDefinitionを作成
        var fontDef = new StyleFontDefinition(FontDefinition.FromFont(EditorJpFont));

        // 1. エディタ全体のルートビジュアル要素(全てのウィンドウの親)にフォントを適用
        var globalRoot = scrolledToRuntimeRoot; // 通常のウィンドウ用
        if (globalRoot != null)
        {
            globalRoot.style.unityFontDefinition = fontDef;
        }

        // 2. 主にインスペクターや、既存のIMGUI/UI Toolkit混在環境のデフォルトスタイルを上書き
        // Unityのインターフェース全体のルートスタイル(TSS)に干渉させます
        var allWindows = Resources.FindObjectsOfTypeAll<EditorWindow>();
        foreach (var window in allWindows)
        {
            if (window.rootVisualElement != null)
            {
                ApplyFontToElementAndChildren(window.rootVisualElement, fontDef);
            }

            window.Repaint();
        }

        // 3. MonoScript/TextAssetなどIMGUIベースInspector向けのスタイルにも適用
        if (AreEditorStylesReady())
        {
            ApplyFontToImGuiStyles(EditorJpFont);
        }
        else
        {
            // 起動直後などEditorStyles未初期化のフレームでは次フレームへ延期
            EditorApplication.delayCall += TryApplyGlobalFont;
        }
    }

    private static bool AreEditorStylesReady()
    {
        try
        {
            return EditorStyles.label != null;
        }
        catch
        {
            return false;
        }
    }

    private static void ApplyFontToImGuiStyles(Font font)
    {
        if (font == null) return;

        SetStyleFont(EditorStyles.label, font);
        SetStyleFont(EditorStyles.boldLabel, font);
        SetStyleFont(EditorStyles.miniLabel, font);
        SetStyleFont(EditorStyles.largeLabel, font);
        SetStyleFont(EditorStyles.helpBox, font);
        SetStyleFont(EditorStyles.textField, font);
        SetStyleFont(EditorStyles.textArea, font);
        SetStyleFont(EditorStyles.wordWrappedLabel, font);
        SetStyleFont(EditorStyles.wordWrappedMiniLabel, font);
        SetStyleFont(EditorStyles.centeredGreyMiniLabel, font);
        SetStyleFont(EditorStyles.foldout, font);
        SetStyleFont(EditorStyles.toolbarButton, font);
        SetStyleFont(EditorStyles.miniButton, font);
        SetStyleFont(EditorStyles.miniButtonLeft, font);
        SetStyleFont(EditorStyles.miniButtonMid, font);
        SetStyleFont(EditorStyles.miniButtonRight, font);
    }

    private static void SetStyleFont(GUIStyle style, Font font)
    {
        if (style == null || font == null) return;
        style.font = font;
    }

    private static void ApplyFontToCurrentGuiSkin(Font font)
    {
        if (font == null) return;

        var skin = GUI.skin;
        if (skin == null) return;

        skin.font = font;
        SetStyleFont(skin.label, font);
        SetStyleFont(skin.button, font);
        SetStyleFont(skin.box, font);
        SetStyleFont(skin.textField, font);
        SetStyleFont(skin.textArea, font);
        SetStyleFont(skin.toggle, font);
        SetStyleFont(skin.window, font);

        var scriptText = skin.FindStyle("ScriptText");
        SetStyleFont(scriptText, font);

        var customStyles = skin.customStyles;
        if (customStyles == null) return;

        foreach (var customStyle in customStyles)
        {
            SetStyleFont(customStyle, font);
        }
    }

    /// <summary>
    /// VisualElementとその子要素すべてにフォントを再帰的に適用する(MonoScriptのInspectorなど用)
    /// </summary>
    private static void ApplyFontToElementAndChildren(VisualElement element, StyleFontDefinition fontDef)
    {
        if (element == null) return;

        // フォントを強制適用
        element.style.unityFontDefinition = fontDef;

        // 子要素にもすべて適用(Inspector内部の要素など)
        foreach (var child in element.Children())
        {
            ApplyFontToElementAndChildren(child, fontDef);
        }
    }

    // リフレクションを用いてUnity内部のエディタルート要素を取得
    private static VisualElement scrolledToRuntimeRoot
    {
        get
        {
            var viewType = typeof(EditorWindow).Assembly.GetType("UnityEditor.UIElements.UIElementsEditorWindow") 
                           ?? typeof(EditorWindow).Assembly.GetType("UnityEditor.ContainerWindow");
            if (viewType == null) return null;

            var instances = Resources.FindObjectsOfTypeAll(viewType);
            if (instances.Length > 0 && instances[0] is EditorWindow win)
            {
                // 親の親などを辿って大元のルート(UIElementのメインキャンバス)を取得
                VisualElement parent = win.rootVisualElement;
                while (parent?.parent != null)
                {
                    parent = parent.parent;
                }
                return parent;
            }
            return null;
        }
    }
}

スクリプトを修正してUnityエディターを選択すると、自動的にフォントが更新されます。
更新されない場合はメニューバーから Window/Force Apply Global Font を選択してください。

スクリーンショット 2026-07-08 8.14.05.png

リフレクションが使われていて多少香ばしいですが、目的は果たせました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?