主要參考了雨松MoMo的Unity3D拓展編輯器系列
編輯器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編輯器教程:點選這裡