个人学习笔记,如有错误、疑问、建议,欢迎留言。 声明:本文不得以任何形式进行转载。
?前言:编辑器开发的一大重要工作内容便是开发一些工具用于提高策划、程序、美术的工作效率,那么有时候开发的工具比较复杂(比如关卡编辑器、地图编辑器等),需要自定义一个可视化界面便于操作。Unity也提供了相应的接口,用于开发者自定义界面,这个接口便是EditorWindow 。
一、EditorWindow
在官方API中,对于EditorWindow 的描述:
下面直接附上代码:
using UnityEngine;
using UnityEditor;
public class TestWindow: EditorWindow
{
[MenuItem("Tools/Test Window", false, -1)]
static void Init()
{
EditorWindow.GetWindow(typeof(TestWindow));
}
void 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;
public class TestWindow: 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);
instance.titleContent = new GUIContent("这是一个新的窗口");
}
void OnGUI()
{
}
void OnDestory()
{
instance = null;
}
}
二、EditorWindow相关消息函数
void Awake();
void OnGUI();
void OnFocus();
void OnLostFocus();
void OnHierarchyChange();
void OnProjectChange();
void OnSelectionChange();
void Update();
void OnDestroy();
?注意事项: ?1、失去焦点:界面被选中时,用户又选择了其他界面 ?2、得到焦点:即界面重新被选中 ?3、OnGUI 每一秒会执行很多次(类似Update),所以许多逻辑不要在OnGUI 中实现(比如向List添加元素)
三、EditorGUI与GUI
?在自定义的界面中,需要各种各样的组件,比如:标签、开关、开关组、按钮、各种输入框以及各种布局组件等,日常使用的接口便是下面这四个:
?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)
|