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上の文字が欠落することがあります。
AIに相談したところ、Editor Font を差し替えることで回避可能とのことでした。
※スクリプト内 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 を選択してください。
リフレクションが使われていて多少香ばしいですが、目的は果たせました。



