1. 程式人生 > >Unity編輯器——Inspector 面板擴充套件

Unity編輯器——Inspector 面板擴充套件

目錄

將EditorGUI 擴充套件在 Inspector 面板上

EditorWindows 視窗

EditorWindows 下拉選單

預覽視窗

獲取預覽資訊



將EditorGUI 擴充套件在 Inspector 面板上


●  EditorGUI 和 GUI 的用法幾乎完全一致,目前來說前者多用於編輯器開發,後者多用於釋出後除錯編輯器。總之,它們都是起輔助作用的。 EditorGUI 提供的元件非常豐富,常用的繪製元素包括文字、按鈕、圖片和滾動框等。做一個好的編輯器,是離不開 EditorGUI 的。如圖:我們將 EditorGUI 拓展在 Inspector 面板上了,

相關程式碼如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
public class Script_03_23 : MonoBehaviour
{
    public Vector3 scrollPos;
    public int myId;
    public string myName;
    public GameObject prefab;
    public MyEnum myEnum = MyEnum.One;
    public bool toogle1;
    public bool toogle2;
    public enum MyEnum
    {
        One=1,
        Two,
    }

#if UNITY_EDITOR
    [CustomEditor(typeof(Script_03_23))]
    public class ScriptEditor_03_23 : Editor
    {
        private bool m_EnableToogle;
        public override void OnInspectorGUI()
        {
            //獲取指令碼物件
            Script_03_23 script = target as Script_03_23;

            //繪製滾動條
            script.scrollPos =
                EditorGUILayout.BeginScrollView(script.scrollPos, false, true);
            script.myName = EditorGUILayout.TextField("text", script.myName);
            script.myId = EditorGUILayout.IntField("int", script.myId);

            script.prefab = EditorGUILayout.ObjectField("GameObject", script.prefab,
                typeof(GameObject), true) as GameObject;

            //繪製按鈕
            EditorGUILayout.BeginHorizontal();
            GUILayout.Button("1");
            GUILayout.Button("2");
            script.myEnum = (Script_03_23.MyEnum)EditorGUILayout.EnumPopup("MyEnum:",
                script.myEnum);

            EditorGUILayout.EndHorizontal();

            //Toogle 元件
            m_EnableToogle = EditorGUILayout.BeginToggleGroup("EnableToogle",
                m_EnableToogle);
            script.toogle1 = EditorGUILayout.Toggle("toogle1", script.toogle1);
            script.toogle2 = EditorGUILayout.Toggle("toogle2", script.toogle2);
            EditorGUILayout.EndToggleGroup();

            EditorGUILayout.EndScrollView();
        }
    }
}
#endif

EditorGUILayout ——  是EditorGUI 自動 佈局版本。
 EditorGUILayout.BeginScrollView ——  函式原型: public static Vector2 BeginScrollView( Vector2 scrollPosition, bool alwaysShowHorizontal,  bool alwaysShowVertical,  params GUILayoutOption[] options);

scrollPosition引數: 顯式使用的位置

alwaysShowHorizontal —— 表示可選的引數,始終顯示水平滾動條。如果為false或省略,那麼則僅當ScrollView中的內容比ScrollView本身更寬時才會顯示。

alwayShowVertical ——  表示可選的引數,始終顯示垂直滾動條。如果為false或省略,那麼只有當ScrollView中的內容比ScrollView本身高時才會顯示。


EditorWindows 視窗
 


Unity 提供編輯器視窗,開發者可以自由拓展自己的視窗。 Unity 編輯器系統自帶的檢視視窗其實也是用 EditorWindows 實現的。如圖所示,我們來製作一個簡單的編輯視窗,它繪製元素時同樣使用 EditorGUI 程式碼。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class Script_03_24Window : EditorWindow
{

    [MenuItem("Window/Open My Window")]
    static void Init()
    {
        Script_03_24Window window = (Script_03_24Window)EditorWindow.GetWindow(typeof(Script_03_24Window));
        window.Show();
    }

    private Texture m_MyTexture = null;
    private float m_MyFloat = 0.5f;
    void Awake()
    {
        Debug.LogFormat("視窗初始化時呼叫");
        m_MyTexture = AssetDatabase.LoadAssetAtPath<Texture>("Assets/unity1.png");
    }
    void OnGUI()
    {
        GUILayout.Label("Hello World!!", EditorStyles.boldLabel);
        m_MyFloat = EditorGUILayout.Slider("Slider", m_MyFloat, -5, 5);
        GUI.DrawTexture(new Rect(0, 30, 100, 100), m_MyTexture);
    }
    void OnDestroy()
    {
        Debug.LogFormat("視窗銷燬時呼叫");
    }
    void OnFocus()
    {
        Debug.LogFormat("視窗擁有焦點時呼叫");
    }
    void OnHierarchyChange()
    {
        Debug.LogFormat("Hierarchy檢視發生改變時呼叫");
    }
    void OnInspectorUpdate()
    {
        //Debug.LogFormat ("Inspector每幀更新");
    }
    void OnLostFocus()
    {
        Debug.LogFormat("失去焦點");
    }
    void OnProjectChange()
    {
        Debug.LogFormat("Project檢視發生改變時呼叫");
    }
    void OnSelectionChange()
    {
        Debug.LogFormat("Hierarchy或者Project檢視中選擇一個物件時呼叫");
    }
    void Update()
    {
        //Debug.LogFormat ("每幀更新");
    }
}

 


EditorWindows 下拉選單
 


如圖 所示,在 EditorWindows 編輯視窗的右上角,有個下拉選單,我們也可以對該選單中的選項進行拓展,不過這裡需要實現 IHasCustomMenu 介面。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class Script_03_25Window : EditorWindow,IHasCustomMenu
{
    void IHasCustomMenu.AddItemsToMenu(GenericMenu menu)
    {
        menu.AddDisabledItem(new GUIContent("Disable"));
        menu.AddItem(new GUIContent("Test1"), true, () =>
        {
            Debug.Log("Test1");
        });

        menu.AddItem(new GUIContent("Test2"), true, () =>
        {
            Debug.Log("Test2");
        });

        menu.AddSeparator("Test/");
        menu.AddItem(new GUIContent("Test/Tes3"), true, () =>
        {
            Debug.Log("Tes3");
        });
    }
        [MenuItem("Window/TAOTAO My Window")]
    static void Init()
    {
        Script_03_25Window window = (Script_03_25Window)EditorWindow.GetWindow(typeof(Script_03_25Window));
        window.Show();
    }
}

上述程式碼中,我們通過 AddItem()方法來新增列表元素,並且監聽選擇後的事件。


預覽視窗


選擇遊戲物件或者遊戲資源後, Inspector 面板下方將會出現它的預覽視窗,但是有些資源是沒有預覽資訊的,不過我們可以監聽它的視窗方法來重新繪製它,如圖 所示,相關程式碼如下。


 

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

[CustomPreview(typeof(GameObject))]
public class Script_03_26 : ObjectPreview
{

    public override bool HasPreviewGUI()
    {
        return true;
    }
    public override void OnPreviewGUI(Rect r, GUIStyle background)
    {
        GUI.DrawTexture(r, AssetDatabase.LoadAssetAtPath<Texture>("Assets/Unity.png"));
        GUILayout.Label("Hello World!");
    }
}

 


獲取預覽資訊
 


 

有些資源是有預覽資訊的,比如模型資源。在預覽視窗中,我們可以看到它的樣式。如果需要在自定義視窗中顯示它,就需要獲取它的預覽資訊。如圖所示,選擇一個遊戲物件後,會在自定義視窗中顯示它,相關程式碼如下:
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class Script_03_27window : EditorWindow
{
    private GameObject m_MyGo;
    private Editor m_MyEditor;

    [MenuItem("Window/TAOSHUI Open My Window")]
    static void Init()
    {
        Script_03_27window window = (Script_03_27window)EditorWindow.GetWindow(typeof(Script_03_27window));
        window.Show();
    }
     void OnGUI()
    {
        //設定一個遊戲物件
        m_MyGo = (GameObject)EditorGUILayout.ObjectField(m_MyGo, 
            typeof(GameObject), true);
        if(m_MyGo !=null)
        {
            if(m_MyEditor==null)
            {
                //建立Editor 例項
                m_MyEditor = Editor.CreateEditor(m_MyGo);
            }
            //預覽它
            m_MyEditor.OnPreviewGUI(GUILayoutUtility.GetRect(500, 500),
               EditorStyles.whiteLabel );
        }
    }
}

在上述程式碼中,預覽物件首先需要通過 Editor.CreateEditor()拿到它的 Editor 例項物件,接著呼叫 OnPreviewGUI()方法傳入視窗的顯示區域。