Unity编辑器开发(四)——拓展自定义界面(EditorWindow)

个人学习笔记,如有错误、疑问,欢迎留言。
声明:本文不得以任何形式进行转载。


文章目录

  • 一、EditorWindow
  • 二、EditorWindow相关消息函数
  • 三、EditorGUI与GUI


前言:编辑器开发的一大重要工作内容便是开发一些工具用于提高策划、程序、美术的工作效率,那么有时候开发的工具比较复杂(比如关卡编辑器、地图编辑器等),需要自定义一个可视化界面便于操作。Unity也提供了相应的接口,用于开发者自定义界面,这个接口便是EditorWindow


一、EditorWindow

在官方API中,对于EditorWindow的描述:
Unity编辑器开发(四)——拓展自定义界面(EditorWindow)_第1张图片

下面直接附上代码:

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里面实现自定义界面的绘制
    }
}

Unity编辑器开发(四)——拓展自定义界面(EditorWindow)_第2张图片
 我们来看一下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; //界面销毁时,重置实例
    }
}

 可以通过修改窗口的positiontitleContent属性来设置窗口的位置、大小以及标题。


二、EditorWindow相关消息函数

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添加元素)


三、EditorGUI与GUI

 在自定义的界面中,需要各种各样的组件,比如:标签、开关、开关组、按钮、各种输入框以及各种布局组件等,日常使用的接口便是下面这四个:

 GUI、GUILayout
 EditorGUI、EditorGUILayout

GUILayoutEditorGUILayout自动布局的,而GUIEditorGUI不是自动布局的,通过传入一个Rect参数来手动控制它的位置与高度宽度,所以一般情况下都是使用GUILayoutEditorGUILayout


下面附上官方API文档:
UnityEditor.EditorWindow - Unity 脚本 API (unity3d.com)
UnityEditor.EditorGUILayout - Unity 脚本 API (unity3d.com)
UnityEditor.GUILayout - Unity 脚本 API (unity3d.com)

你可能感兴趣的:(Unity编辑器开发,unity,编辑器,c#)