夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

UnityのInspectorウィンドウに表示されるスクリプトのGUIを拡張する

本日はUnity枠です。

Unityではスクリプトを記述した際にSerializefieldやPublicを付けた変数がインスペクターウィンドウにパラメータとして表示されます。

今回はこのGUI表示をカスタマイズしていきます。

〇環境

・Windows11PC

・Unity2022.3.26f1

〇UnityEditor拡張

インスペクターウィンドウに表示されるGUIをカスタマイズすることもUnityエディタ拡張と呼ばれます。

今回は以下のスクリプトを使用します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    [SerializeField] int _number = 0;
    public bool _isWarldSpace = true;
}

デフォルトの場合インスペクターウィンドウには次のように表示されます。

これをカスタマイズするためにはEditorフォルダを作成し、内部に新たなGUI用のスクリプトを作成します。

スクリプトは次のようになります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(Test))]
public class TestGUI : Editor
{

}

CustomEditorアトリビュートを付けることでTestGUIクラスをTest.csに対するエディタをカスタムするためのクラスとして使用します。

これによってインスペクターウィンドウのTest.csの表記がなくなります。

これはカスタムGUIクラスによって上書きされたものの、そのパラメータが定義されていないため何も表示されないのです。

ではGUIを定義します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(Test))]
public class TestGUI : Editor
{
    public override void OnInspectorGUI()
    {
        Test myTarget = (Test)target;  
        myTarget._isWarldSpace = EditorGUILayout.Toggle("Is Warld Space", myTarget._isWarldSpace);
    }
}

ここではTest.csの_isWarldSpaceを定義しています。これによってインスペクターウィンドウ上にGUIが表記されます。

またDrawDefaultInspector()を使用することでカスタム元のTest.csのパラメータが一挙に表示されます。

public class TestGUI : Editor
{
    public override void OnInspectorGUI()
    {
        Test myTarget = (Test)target;  
       // myTarget._isWarldSpace = EditorGUILayout.Toggle("Is Warld Space", myTarget._isWarldSpace);
       DrawDefaultInspector();
    }
}

例えば次のように定義することで

public class TestGUI : Editor
{
    public override void OnInspectorGUI()
    {
        Test myTarget = (Test)target;  
       // myTarget._isWarldSpace = EditorGUILayout.Toggle("Is Warld Space", myTarget._isWarldSpace);
       DrawDefaultInspector();
       DrawDefaultInspector();
    }
}

このように2回にして表記することができます。

特に意味がない実装ではありますが。

用途としてはEnum型やBool値でモード切替などを行う実装において必要な時に必要なパラーメータを表記させ、不要なパラメータを非表示にするといった使用方法があります。

本日はGUIの定義を行いました。本日は以上です。