[Unity編輯器]自定義編輯器介面
阿新 • • 發佈:2019-02-18
編輯器GUI類
1.GUI、GUILayout
2.EditorGUI、EditorGUILayout
編輯器類(指令碼要放在Assets/Editor資料夾中,要使用UnityEditor的名稱空間):
1.EditorWindow(重點是OnGUI()的編寫)
using UnityEngine; using UnityEditor; public class MyWindow : EditorWindow { string myString = "Hello World"; bool groupEnabled; bool myBool = true; float myFloat = 1.23f; [MenuItem("Window/My Window")] static void Init() { EditorWindow.GetWindow(typeof(MyWindow)); } void OnGUI() { GUILayout.Label("Base Settings", EditorStyles.boldLabel); myString = EditorGUILayout.TextField("Text Field", myString); groupEnabled = EditorGUILayout.BeginToggleGroup("Optional Settings", groupEnabled); myBool = EditorGUILayout.Toggle("Toggle", myBool); myFloat = EditorGUILayout.Slider("Slider", myFloat, -3, 3); EditorGUILayout.EndToggleGroup(); } }
2.Editor(重點是OnInspectorGUI()、OnSceneGUI()的編寫,為特定的指令碼或者物件編寫自定義的介面)
a.OnInspectorGUI()
using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour {
public Rect mRectValue;
public Texture texture;
}
using UnityEditor; using UnityEngine; //自定義Tset指令碼 [CustomEditor(typeof(Test))] //在編輯模式下執行指令碼,這裡用處不大可以刪除。 [ExecuteInEditMode] //請繼承Editor public class MyEditor : Editor { //在這裡方法中就可以繪製面板。 public override void OnInspectorGUI() { //得到Test物件 Test test = (Test)target; //繪製一個視窗 test.mRectValue = EditorGUILayout.RectField("視窗座標", test.mRectValue); //繪製一個貼圖槽 test.texture = EditorGUILayout.ObjectField("增加一個貼圖", test.texture, typeof(Texture), true) as Texture; } }
對比圖如下:
對Inspector檢視下Test指令碼的變數進行自定義
b.OnSceneGUI()
using UnityEditor; using UnityEngine; //自定義Tset指令碼 [CustomEditor(typeof(Test))] //請繼承Editor public class MyEditor2 : Editor { void OnSceneGUI() { //得到test指令碼的物件 Test test = (Test) target; //繪製文字框 Handles.Label(test.transform.position + Vector3.up*2, test.transform.name +" : "+ test.transform.position.ToString() ); //在OnSceneGUI()中只能通過Handles來繪製新檢視,如果你想引入GUI的元素哪麼就需要使用BeginGUI()和EndGUI()組合的使用。 //開始繪製GUI Handles.BeginGUI(); //規定GUI顯示區域 GUILayout.BeginArea(new Rect(100, 100, 100, 100)); //GUI繪製一個按鈕 if(GUILayout.Button("這是一個按鈕!")) { Debug.Log("test"); } //GUI繪製文字框 GUILayout.Label("我在編輯Scene檢視"); GUILayout.EndArea(); Handles.EndGUI(); } }
為物體掛上Test指令碼,執行時,在Hierarchy檢視中選擇該物體即可顯示相關資訊
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1.
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.Linq;
public class AnimClipEventEditor : EditorWindow {
public AnimationClip clip;
[MenuItem("Window/動畫事件編輯器")]
static void Init()
{
GetWindow<AnimClipEventEditor>();
}
void OnGUI()
{
clip = (AnimationClip)EditorGUILayout.ObjectField(clip,typeof(AnimationClip));
if(clip)
{
if(GUILayout.Button("清除所有動畫事件"))
{
AnimationUtility.SetAnimationEvents(clip,null);
}
var events = AnimationUtility.GetAnimationEvents(clip);
for(int i = 0;i < events.Length;i++)
{
if(GUILayout.Button("清除動畫事件" + events[i].functionName))
{
var listEvents = events.ToList();
listEvents.RemoveAt(i);
AnimationUtility.SetAnimationEvents(clip,listEvents.ToArray());
EditorUtility.SetDirty(clip);
}
}
}
}
}
2.
using UnityEngine;
using System.Collections;
public class MyDate : MonoBehaviour {
public Texture texture;
}
using UnityEngine;
using System.Collections;
using UnityEditor;
[CustomEditor(typeof(MyDate))]
public class MyDateEditor : Editor {
public override bool HasPreviewGUI ()
{
return true;
}
public override GUIContent GetPreviewTitle ()
{
return new GUIContent("MyDate");
}
public override void OnPreviewGUI (Rect r, GUIStyle background)
{
MyDate myDate = (MyDate)target;
if(myDate.texture != null)
GUI.Box(r,myDate.texture);
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
實際上,檢視Unity的api,會發現Unity為我們封裝了很多的編輯器類,因此,以上的只是冰上一角而已。
以下是本人發現的一個比較好的Unity編輯器教程:點選這裡