栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

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

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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


文章目录
  • 一、EditorWindow
  • 二、EditorWindow相关消息函数
  • 三、EditorGUI与GUI


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


一、EditorWindow

在官方API中,对于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(); //不建议使用

 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属性来设置窗口的位置、大小以及标题。


二、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

 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)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/902158.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号