自定义窗口拓展
一、创建窗口类
- 命名空间: UnityEditor
- 类名: EditorWindow
当我们想要为 Unity 拓展一个自定义窗口时 只需要实现一个继承了 EditorWindow 的类即可 并且在该类中的 OnGUI 函数中编写面板控件的逻辑
二、显示窗口
通过上一节课(自定义菜单栏拓展)的知识 添加一个自定义页签用于开启窗口
调用EditorWindow.GetWindow 该方法有很多重载,主要参数有:
- Type 或者 T:窗口类型
- utility
- 为 ture 时,可创建浮动实用程序窗口(可以自由拖动自由改变大小)
- 为 false 时,可创建正常窗口
- title : 标题
- focus : 是否为窗口提供焦点(如果已存在)。如果 GetWindow 创建新窗口,则始终获得焦点
- desiredDockNextTo : 窗口试图停靠在其他的 EditorWindow 类型的数组
创建窗口对象,之后调用对象的 Show 方法 即可显示窗口
1 | public class Lesson2 : EditorWindow |
三、窗口事件回调函数
继承了 EditorWindow 的窗口类 自带一些事件的回调函数 当出发这些对应事件时会自动进入
- OnHierarchyChange() 当场景中的层次结构(Hierarchy) 发生变化时调用 例如:当游戏对象被创建、删除、重命名时触发
- OnFocus() 当窗口获得焦点时调用 在这个方法中,你可以执行一些在窗口获得焦点时需要进行的操作
- OnLostFocus() 当窗口失去焦点时调用 通常这个方法执行一些在窗口拾取焦点时进行的清理工作
- OnProjectChange() 当项目资源发生变化时调用 例如:当添加、删除、修改项目中的文件时触发
- OnInspectorUpdate() 当监视器(Inspector) 窗口更新时调用 可以用在这个方法中执行需要在监视器面板刷新时进行的逻辑,比如更新信息的显示
- OnSelectionChange() 当选择的对象发生变化时调用 在这个方法中,你可以执行与所选对象相关的操作,确保编辑器窗口的内容与当前选择保持同步
四、常用的生命周期函数
- OnEnable() 当这个窗口被激活时调用,通常在创建窗口时调用一次 主要进行一些初始化的工作,例如注册事件监听器或者设置初始化变量
- OnGUI() 每帧都会调用此方法,用于绘制编辑器窗口中的 GUI 主要使用 GUILayout 或者 EditorGUILayout 等类创建界面元素,进行交互
- OnDestroy() 当窗口被销毁时调用 通常在关闭编辑器或者切换场景时触发 主要进行最终的清理工作,以确保没有未释放的资源
- Update() 在编辑器窗口每帧更新时调用 主要执行一些需要在每帧进行的逻辑
五、常用的成员
编辑器窗口类的成员非常多,其他具体可以查看文档
1.静态成员
- focuseWindow : 当前已获得的键盘焦点的 EditorWindow(只读)
- mouseWindow : 当前鼠标光标下的 EditorWindow(只读)
2.静态函数
- CreateWindow : 创建窗口,窗口可以有多个
- GetWindow : 没有窗口创建窗口(窗口只能有一个)
- GetWindowWithRect : 返回一个指定位置,大小的窗口
- HasOpenInstances : 检查编辑器窗口是否打开
3.成员变量
- titleContent : 窗口标题名
- position : 窗口的位置大小信息
- wantsMouseEnterLeaveWindow : 如果为 ture,鼠标每次进入或者离开窗口时,都调用一次 OnGUI()
4.成员函数
- Show() 显示面板
- Repaint 重新绘制面板
- Close() 关闭面板