Unity自定義編輯器界面(Inspector界面)
在開發(fā)的過(guò)程中,往往會(huì)需要在組件中添加一些按鈕,用于執(zhí)行一些自定義的操作。
例如你有一個(gè)組件A,里面有一個(gè)List<Collider>,你想在這個(gè)List中存放當(dāng)前Scene中所有的碰撞體數(shù)據(jù)。那么你會(huì)在組件A中寫一個(gè)方法Find去遍歷獲取,一種情況你可以運(yùn)行Unity的時(shí)候在Start方法中去執(zhí)行Find方法,如果你想不運(yùn)行Unity的情況下就獲取到,那么可以使用[ExecuteInEditMode]標(biāo)簽,然后依舊在Start方法中執(zhí)行Find方法。再或者就是這篇要介紹的自定義編輯器界面來(lái)處理。
首先我們簡(jiǎn)單的寫個(gè)組件如下:
using UnityEngine;
public class Test : MonoBehaviour
{
public float speed;
public int length;
public void Reset()
{
speed = 0;
length = 0;
}
}
我們?cè)谝粋€(gè)GameObject上添加該組件后,Inspector界面的顯示為

然后我們可以在Editor目錄下建一個(gè)新的cs腳本,用于自定義該組件Inspector界面的顯示,代碼如下:
using UnityEditor;
using UnityEngine;
//添加這個(gè)標(biāo)簽,可以選擇多個(gè)擁有Test組件的GameObject進(jìn)行同時(shí)修改,否則會(huì)提示Multi-object editing not supported
[CanEditMultipleObjects]
//關(guān)聯(lián)對(duì)應(yīng)的MonoBehaviour類
[CustomEditor(typeof(Test))]
public class TestInspector : Editor
{
public override void OnInspectorGUI()
{
Test test = target as Test;
//添加了這句,當(dāng)你選中一個(gè)帶有Test組件的GameObject時(shí),修改了屬性,點(diǎn)擊工具欄Edit,會(huì)顯示Undo RecordTest和Redo RecordTest用于撤銷和重做
//同時(shí)如果是在prefab中,加上這句,在修改了屬性之后prefab會(huì)知道屬性的變化,你可以apply或revert,否則prefab無(wú)法檢測(cè)出。(5.3版本之前使用EditorUtility.SetDirty(test);)
Undo.RecordObject(test, "RecordTest");
//顯示默認(rèn)視圖(即Test的speed和length)
base.OnInspectorGUI();
//在默認(rèn)視圖下方添加一行
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("Button 1"))
{
//點(diǎn)擊按鈕觸發(fā)
Debug.Log("name:" + test.name);
test.speed = 100;
//通知Prefab屬性變化,5.3版本前使用下面這句,之后使用Undo.RecordObject
//EditorUtility.SetDirty(test);
}
if (GUILayout.Button("Button 2"))
{
//targets 表示選中的多個(gè)組件
foreach (Object obj in targets)
{
Debug.Log("name:" + obj.name);
Test item = obj as Test;
item.Reset();
}
}
EditorGUILayout.EndHorizontal();
if (GUI.changed)
{
//如果屬性改變時(shí)調(diào)用
}
}
}
這樣顯示界面就會(huì)變?yōu)?/p>

這樣我們就可以在不運(yùn)行unity的情況下執(zhí)行一些組件方法,方便使用。
一些需要注意的如[CanEditMultipleObjects],Undo.RecordObject,EditorUtility.SetDirty在代碼中注釋了,大家可以自己嘗試看看對(duì)應(yīng)的作用。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#操作mysql數(shù)據(jù)庫(kù)的代碼實(shí)例
這篇文章為大家提供了一個(gè)C#操作mysql數(shù)據(jù)庫(kù)的實(shí)例,大家可以參考使用2013-11-11
C#?form-data上傳圖片流到遠(yuǎn)程服務(wù)器的詳細(xì)代碼
這篇文章主要介紹了C#?form-data上傳圖片流到遠(yuǎn)程服務(wù)器的詳細(xì)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
解決C#中WebBrowser的DocumentCompleted事件不執(zhí)行的實(shí)現(xiàn)方法
本篇文章是對(duì)C#中WebBrowser的DocumentCompleted事件不執(zhí)行解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05

