个人学习笔记,如有错误、疑问,欢迎留言。
声明:本文不得以任何形式进行转载。
前言:编辑器开发的一大重要工作内容便是开发一些工具用于提高策划、程序、美术的工作效率,那么有时候开发的工具比较复杂(比如关卡编辑器、地图编辑器等),需要自定义一个可视化界面便于操作。Unity也提供了相应的接口,用于开发者自定义界面,这个接口便是EditorWindow
。
下面直接附上代码:
using UnityEngine;
using UnityEditor; //引用UnityEditor
public class TestWindow: EditorWindow //继承自EditorWindow
{
[MenuItem("Tools/Test Window", false, -1)]
static void Init()
{
EditorWindow.GetWindow(typeof(TestWindow));
}
void OnGUI()
{
//在OnGUI里面实现自定义界面的绘制
}
}
我们来看一下EditorWindow.GetWindow()
方法的定义:
public static EditorWindow GetWindow(Type t, bool utility= false, string title= null, bool focus= true);
这个方法的作用是:返回当前屏幕上第一个t
类型的EditorWindow
,如果没有,则创建
并显示新窗口,然后返回其实例。
当然,也可以使用EditorWindow.CreateWindow()
方法创建窗口(不建议使用):
EditorWindow.CreateWindow<StageEditorTest>(); //不建议使用
EditorWindow.CreateWindow()
方法会直接创建窗口,如果使用这种方式,那么可以创建多个同样的窗口在屏幕上,所以不建议使用。
注意事项:
1、脚本需引用命名空间UnityEditor
2、自定义界面的类继承自EditorWindow
3、在OnGUI
里面实现你自己的界面的绘制
在上面代码中,还可以用一个实例,把创建的对象存起来,在界面销毁时,把实例也销毁掉,如下所示:
using UnityEngine;
using UnityEditor; //引用UnityEditor
public class TestWindow: EditorWindow //继承自EditorWindow
{
static TestWindow instance;//创建一个实例
[MenuItem("Tools/Test Window", false, -1)]
static void Init()
{
instance = (TestWindow)GetWindow(typeof(TestWindow)); //需要强制类型转换一下
instance.position = new Rect(400, 200, 1300, 700); //Rect参数:[x, y, 宽度, 高度]
instance.titleContent = new GUIContent("这是一个新的窗口"); //窗口标题;
}
void OnGUI()
{
//在OnGUI里面实现自定义界面的绘制
}
void OnDestory()
{
instance = null; //界面销毁时,重置实例
}
}
可以通过修改窗口的position
和titleContent
属性来设置窗口的位置、大小以及标题。
void Awake(); //在界面打开时调用
void OnGUI(); //在onGUI内部实现自己的GUI
void OnFocus(); //界面获得焦点时调用
void OnLostFocus(); //界面失去焦点时调用
void OnHierarchyChange(); //当层级面板(即Hierarchy界面)发生改变时调用
void OnProjectChange(); //当Project界面发生改变时调用
void OnSelectionChange(); //当前选中的对象发生改变时调用
void Update(); //界面弹出时每帧调用
void OnDestroy(); //界面销毁时调用
注意事项:
1、失去焦点:界面被选中时,用户又选择了其他界面
2、得到焦点:界面重新被选中
3、OnGUI
每一秒会执行很多次(类似Update
),所以某些逻辑不能在OnGUI
中实现(比如向List添加元素)
在自定义的界面中,需要各种各样的组件,比如:标签、开关、开关组、按钮、各种输入框以及各种布局组件等,日常使用的接口便是下面这四个:
GUI、GUILayout
EditorGUI、EditorGUILayout
GUILayout
和EditorGUILayout
是自动布局
的,而GUI
与EditorGUI
不是自动布局的,通过传入一个Rect
参数来手动控制它的位置与高度宽度,所以一般情况下都是使用GUILayout
和EditorGUILayout
。
下面附上官方API文档:
UnityEditor.EditorWindow - Unity 脚本 API (unity3d.com)
UnityEditor.EditorGUILayout - Unity 脚本 API (unity3d.com)
UnityEditor.GUILayout - Unity 脚本 API (unity3d.com)