主要参考了雨松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编辑器教程:点击这里