编辑器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编辑器教程:点击这里