Unity編輯器——Inspector 面板擴充套件
目錄
將EditorGUI 擴充套件在 Inspector 面板上
將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()方法傳入視窗的顯示區域。