IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity编辑器拓展(四)——拓展自定义界面(EditorWindow) -> 正文阅读

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

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



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


一、EditorWindow

在官方API中,对于EditorWindow的描述:
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; //界面销毁时,重置实例
    }
}

二、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参数来手动控制它的位置与高度宽度,所以一般情况下都是使用GUILayout和EditorGUILayout。


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

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-11-25 08:26:52  更:2021-11-25 08:27:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 23:34:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码