当前位置: 首页 > news >正文

2024-02-11 Unity 编辑器开发之编辑器拓展2 —— 自定义窗口

文章目录

  • 1 创建窗口类
  • 2 显示窗口
  • 3 窗口事件回调函数
  • 4 窗口中常用的生命周期函数
  • 5 编辑器窗口类中的常用成员
  • 6 小结

1 创建窗口类

​ 当想为 Unity 拓展一个自定义窗口时,只需实现继承 EditorWindow 的类即可,并在该类的 OnGUI 函数中编写面板控件相关的逻辑。

  • 命名空间:UnityEditor
  • 类名:EditorWindow

2 显示窗口

​ 调用 EditorWindow.GetWindow() 添加自定义页签,用于开启窗口。创建窗口对象后,调用对象的 Show() 方法即可显示窗口。

​ 该方法有多种重载,主要参数一般有:

  • Type 或 T:窗口类的类型。
  • utility:为 true 可创建浮动实用程序窗口(可自由拖动、改变大小),设置为 false 可创建正常窗口。
  • title:窗口标题。
  • focus:是否为窗口提供焦点(如果已存在)。(如果 GetWindow 创建新窗口,则将始终获得焦点)。
  • desiredDockNextTo:窗口试图停靠到其上的 EditorWindow 类型的数组。
public class Lesson2 : EditorWindow
{[MenuItem("Unity编辑器拓展/Lesson2/显示自定义面板")]private static void ShowWindow() {Lesson2 win = EditorWindow.GetWindow<Lesson2>("我的窗口");win.Show();}
}
image-20240211144438523

3 窗口事件回调函数

​ 继承 EditorWindow 的窗口类自带一些事件回调函数,当触发对应事件时会自动进入。

  1. OnHierarchyChange():当场景中的层次结构(Hierarchy)发生变化时调用。
    例如,当游戏对象被创建、删除或重命名时触发。

  2. OnFocus():当窗口获得焦点时调用。
    在该方法中可以执行在窗口获得焦点时需要进行的操作。

  3. OnLostFocus():当窗口失去焦点时调用。
    通常在该方法中执行在窗口失去焦点时需要进行的清理工作。

  4. OnProjectChange():当项目资源发生变化时调用。
    例如,当添加、删除或修改项目中的文件时触发。

  5. OnInspectorUpdate():在检视器(Inspector)面板更新时调用。
    可以在这个方法中执行需要在检视器面板刷新时进行的逻辑,比如更新显示的信息。

  6. OnSelectionChange():当选择的对象发生变化时调用。
    在该方法中可以执行与所选对象相关的操作,以确保编辑器窗口的内容与当前选择保持同步。

4 窗口中常用的生命周期函数

  1. OnEnable():
    当窗口被激活时调用,通常在窗口创建时会调用一次。
    在该方法中可以进行初始化工作,例如注册事件监听器或设置初始变量。

  2. OnGUI():
    每帧都会调用此方法,用于绘制编辑器窗口的 GUI。
    在该方法中可以使用 GUILayout 或 EditorGUILayout 等类创建界面元素,以便用户与窗口进行交互。

  3. OnDestroy():
    当窗口被销毁时调用,通常在关闭编辑器或切换场景时触发。在这里进行最终的清理工作,确保没有未释放的资源。

  4. Update():
    在编辑器窗口每帧更新时调用。通常在这里执行需要在每帧进行的逻辑。

5 编辑器窗口类中的常用成员

​ Unity 官方文档有关于编辑器窗口类的 API 说明:https://docs.unity.cn/cn/2022.3/ScriptReference/EditorWindow.html。

  • 静态变量

    1. focusedWindow:当前已获得键盘焦点的 EditorWindow。(只读)
    2. mouseOverWindow:当前在鼠标光标下的 EditorWindow。(只读)
  • 静态函数

    1. CreateWindow:创建窗口,如果允许窗口有多个,可用该 API 创建窗口。
    2. GetWindow:创建一个窗口对象。
    3. GetWindowWithRect:返回一个指定位置、大小的窗口。
    4. HasOpenInstances:检查编辑器窗口是否打开。
  • 成员变量

    1. titleContent:窗口标题名。
    2. positon:窗口位置大小信息。
    3. wantsMouseEnterLeaveWindow:如果设置为 true,则每当鼠标进入或离开窗口时,该窗口都会收到一次 OnGUI 调用。
  • 成员函数

    1. Show:显示面板。
    2. Repaint:重绘窗口。
    3. Close:关闭窗口。

6 小结

​ 想要实现自定义窗口,只需继承 EditorWindow 类,主要工作是在 OnGUI 中利用 GUI 相关 API 绘制控件处理功能逻辑。

​ 使用对应的事件回调函数帮助监听一些特殊情况,用于处理对应逻辑。

相关文章:

  • mxxWechatBot基本配置
  • .NetCore 如何动态路由
  • leetcode链表相关题目
  • 树状菜单(利用映射-bootstrap+jQuery实现折叠功能)
  • 单片机学习笔记---蜂鸣器播放提示音音乐(天空之城)
  • Unity2D 学习笔记 0.Unity需要记住的常用知识
  • Vue中路由的使用
  • MyBatisPlus之分页查询及Service接口运用
  • 2023 年,我患上了 AI 焦虑症!
  • 百面嵌入式专栏(面试题)进程管理相关面试题1.0
  • 详细讲解ES6箭头函数语法(附Demo)
  • 中科大计网学习记录笔记(八):FTP | EMail
  • JCIM | MD揭示PTP1B磷酸酶激活RtcB连接酶的机制
  • 鸿蒙harmony--TypeScript函数详解
  • 【EAI 016】VIMA: General Robot Manipulation with Multimodal Prompts
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 2017前端实习生面试总结
  • Android 架构优化~MVP 架构改造
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • JAVA SE 6 GC调优笔记
  • java第三方包学习之lombok
  • Mysql5.6主从复制
  • SpringBoot几种定时任务的实现方式
  • STAR法则
  • vuex 学习笔记 01
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • Vue全家桶实现一个Web App
  • vue自定义指令实现v-tap插件
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 浅谈web中前端模板引擎的使用
  • 人脸识别最新开发经验demo
  • 如何使用 JavaScript 解析 URL
  • 收藏好这篇,别再只说“数据劫持”了
  • 微服务入门【系列视频课程】
  • 怎么把视频里的音乐提取出来
  • 7行Python代码的人脸识别
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​批处理文件中的errorlevel用法
  • #QT(一种朴素的计算器实现方法)
  • $$$$GB2312-80区位编码表$$$$
  • $.ajax中的eval及dataType
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (C语言)二分查找 超详细
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (vue)页面文件上传获取:action地址
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (力扣)1314.矩阵区域和
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置