うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】EditorWindow で GUIStyle を使う際の注意

EditorWindowGUIStyle を利用する際に、フィールドの初期値を入れた状態にすると

Unable to use a named GUIStyle without a current skin. Most likely you need to move your GUIStyle initialization code to OnGUI

とエラーが表示されます

これは名前を指定して GUIStyle を利用するなら OnGUI に記述しろというエラーです
※名前を指定せずに自作の GUIStyle を利用する場合は特に気にする必要はありません

using UnityEditor;
using UnityEngine;

public class SampleEditorWindow : EditorWindow
{
    private GUIStyle _style = new GUIStyle("label");
    
    private void OnGUI()
    {
        EditorGUILayout.LabelField("label", _style);
    }
}

対策1 「null チェックを行う」

OnGUI で null チェックをすれば初回描画のタイミングで作成してくれます
しかし GUIStyle が増えてくると管理も面倒になってきます

   private GUIStyle _style;
    private GUIStyle _style2;
    
    private void OnGUI()
    {
        if (_style == null)
            _style = new GUIStyle("label");
        if (_style2 == null)
            _style2 = new GUIStyle("box");

        EditorGUILayout.LabelField("label", _style);
    }   

対策2 「GUIStyle 用の static クラスを用意する」

Unity 内部の Editor コードにもよく利用されている方法です
個人的にはこちらのほうが分かりやすいのでよく利用します

static なクラスは 初めて呼び出しだあったタイミングで、 作成されるため問題無く名前指定して利用することができます

using UnityEditor;
using UnityEngine;

public class SampleEditorWindow : EditorWindow
{
    private static class StyleConstant
    {
        public static GUIStyle Style;
        
        static StyleConstant()
        {
            Style = new GUIStyle("label");
        }
    }
    
    private void OnGUI()
    {
        EditorGUILayout.LabelField("label", StyleConstant.Style);
    }
}