Unity 编辑器篇|(十二)自定义编辑器窗体(EditorWindow,ScriptableWizard) (全面总结 | 建议收藏)

目录

  • 1. 前言
  • 2. 创建自定义窗体:EditorWindow
    • 2.1 参数总览
    • 2.2 EditorWindow的生命周期
    • 2.3 区别:CreateWindow(),GetWindow() ,GetWindowWithRect()
    • 2.4 代码示例
  • 3. 创建对话框窗体:ScriptableWizard
    • 3.1 参数总览
    • 3.2 区别:OnWizardCreate,OnWizardOtherButton,OnWizardUpdate
    • 3.3 代码样例

1. 前言

  • 在Unity中,EditorWindowScriptableWizard都是用于创建自定义编辑器界面的类。
  • EditorWindow是用于创建自定义编辑器窗口的类,可以包含自定义的GUI元素和逻辑。它通常用于创建工具窗口、面板或者其他自定义的编辑器界面。
  • ScriptableWizard是用于创建向导式界面的类,可以帮助用户完成特定的任务。通常用于引导用户完成一系列步骤,例如创建新的资产、配置项目设置等。与EditorWindow相比,向导更加注重交互性和引导性,常用于流程化的操作步骤。

2. 创建自定义窗体:EditorWindow

2.1 参数总览

常用参数描述
position窗口在屏幕空间中的理想位置。
titleContent用于绘制 EditorWindow 标题的 GUIContent。
Close关闭编辑器窗口。
Show显示 EditorWindow 窗口。
ShowAsDropDown显示包含下拉菜单和样式的窗口。
ShowAuxWindow在辅助窗口中显示编辑器窗口。
ShowModal显示模态编辑器窗口。
ShowNotification显示通知消息。
ShowPopup使用弹出式框架显示编辑器窗口。
ShowUtility将 EditorWindow 显示为浮动实用程序窗口。
CreateWindow创建类型为 T 的 EditorWindow。
FocusWindowIfItsOpen聚焦发现的第一个指定类型的 EditorWindow(如果已打开)。
GetWindow返回当前屏幕上的第一个 windowType 类型的 EditorWindow。
GetWindowWithRect返回当前屏幕上第一个 t 类型的 EditorWindow。
HasOpenInstances检查编辑器窗口是否已打开。
OnBecameInvisible在窗口从容器视图中删除或在 EditorWindow 的选项卡式集合中不再可见后调用。
OnBecameVisible将窗口添加到容器视图后调用。
OnDestroy调用 OnDestroy 以关闭 EditorWindow 窗口。
OnFocus在窗口获得键盘焦点时调用。
OnGUI在此处实现您自己的 Editor GUI。
OnHierarchyChange处理程序,用于在层级视图中的对象或对象组发生更改时发送的消息。
OnInspectorUpdateOnInspectorUpdate 以每秒 10 帧的速度调用,以便检视面板有机会进行更新。
OnLostFocus在窗口失去键盘焦点时调用。
OnProjectChange处理程序,用于在项目状态发生更改时发送的消息。
OnSelectionChange每当选择发生更改时调用。

2.2 EditorWindow的生命周期

  • 打开:
    • OnEnable():当打开界面的时候调用
    • OnFocus():当该窗口被聚焦(点击该窗口)
  • 打开中:
    • OnGUI():当渲染UI的时候调用
    • OnSelectionChange():当选择发生更改时调用,选中的可选项(在Project和Hierarchy视图中)
    • OnInspectorUpdate():当属性界面更新时,几乎一直在更
    • OnHierarchyChange():当场景层次界面发生改变时调用");//在Hierarchy界面改变(增加、减少物体)
    • OnProjectChange():当项目发生更改时调用");//在Project视图删除、增加文件
    • OnValidate():当拖拽式赋值时调用
  • 关闭:
    • OnLostFocus():从该窗口离开时调用(点击非窗口外其他地方)
    • OnDisable():当隐藏的时候调用
    • OnDestroy():当销毁的时候调用

2.3 区别:CreateWindow(),GetWindow() ,GetWindowWithRect()

  • 在Unity编辑器中,CreateWindow()GetWindow()GetWindowWithRect() 是用于处理窗口的函数,但它们的功能和使用场景有所不同。
  • CreateWindow():这个函数通常用于创建一个新的窗口。在Unity编辑器中,这可能涉及到创建一个新的Inspector窗口、Console窗口或其他自定义窗口。CreateWindow() 需要指定窗口类型(例如 WindowType.Inspector 或 WindowType.Console)以及其他可能的参数,如窗口标题和大小。
  • GetWindow()::这个函数用于获取一个已经存在的窗口。它通常用于需要引用已打开的窗口的情况,例如,你可能想关闭一个已经打开的Inspector窗口。
  • GetWindowWithRect()::这个函数比较特殊,它不仅仅是为了获取一个窗口,而且还要通过一个指定的矩形区域获取。这对于需要在给定屏幕区域中查找和操作窗口非常有用。比如你可能想在指定的屏幕区域查找Console窗口。
  • 在使用这些函数时,通常需要注意以下几点:
    • CreateWindow() 用于创建新窗口,而 GetWindow()GetWindowWithRect() 用于获取已存在的窗口。
    • GetWindow()GetWindowWithRect() 通常用于操作已打开的窗口,例如关闭它们或获取它们的引用。
    • GetWindowWithRect() 特别适用于在特定屏幕区域查找窗口,这在处理多显示器或多窗口环境时非常有用。

2.4 代码示例

using UnityEditor;
using UnityEngine;

public class WindowExample : EditorWindow
{
    private static WindowExample window;//窗体实例

    //显示窗体
    [MenuItem("MyWindow/Second Window")]
    private static void ShowWindow()
    {
        window = EditorWindow.GetWindow<WindowExample>("Window Example");
        window.Show();
    }

    //显示时调用
    private void OnEnable()
    {
        Debug.Log("OnEnable");
    }

    //绘制窗体内容
    private void OnGUI()
    {
        EditorGUILayout.LabelField("Your Second Window", EditorStyles.boldLabel);
    }

    //固定帧数调用
    private void Update()
    {
        Debug.Log("Update");
    }

    //隐藏时调用
    private void OnDisable()
    {
        Debug.Log("OnDisable");
    }

    //销毁时调用
    private void OnDestroy()
    {
        Debug.Log("OnDestroy");
    }
}

1

3. 创建对话框窗体:ScriptableWizard

3.1 参数总览

常用参数描述
createButtonName允许您设置向导的 Create 按钮上显示的文本。
errorString允许您设置向导的错误文本。
helpString允许您设置向导的帮助文本。
isValid允许您启用向导 Create 按钮,或者将其禁用,从而使用户无法点击。
otherButtonName允许您设置向导的可选 Other 按钮上显示的文本。忽略此参数将不显示该按钮。
OnWizardCreate当用户单击 Create 按钮时,将调用此函数。
OnWizardOtherButton允许您在用户单击 Others 按钮时提供操作。
OnWizardUpdate在向导打开或者用户在向导中更改内容时,将调用此函数。

3.2 区别:OnWizardCreate,OnWizardOtherButton,OnWizardUpdate

  • OnWizardCreate:
    • 当向导被创建时调用。
    • 通常用于初始化向导的状态或设置。
  • OnWizardOtherButton:
    • 当用户在向导界面上点击非标准按钮(如“下一步”、“上一步”或自定义按钮)时调用。
    • 你可以根据需要重写此方法以处理非标准按钮的点击事件。
  • OnWizardUpdate:
    • 在向导的当前步骤被更新时调用。
    • 通常用于根据用户输入或其他条件更新向导的当前步骤内容。

3.3 代码样例

using UnityEditor;
using UnityEngine;

public class WindowExample : ScriptableWizard
{
    public float range = 500;
    public Color color = Color.red;

    [MenuItem("GameObject/Create Light Wizard")]
    static void CreateWizard()
    {
        ScriptableWizard.DisplayWizard<WindowExample>("Create Light", "Create", "Apply");
        如果您不想使用辅助按钮,只需将其省略即可:
        //ScriptableWizard.DisplayWizard<WizardCreateLight>("Create Light", "Create");
    }
    //显示在向导窗口里的变量
    public float speedValue = 10;
    public bool canShoot = true;

    //用户单击创建按钮进行调用,固定用法,点击后向导窗口关闭
    private void OnWizardCreate()
    {
        Debug.Log("Create : Change By Value");
        //一般在这里做最终的处理
        //比如在这里可以获取选中的全部object,再利用向导窗口里填写的变量批量改变文件数值
    }

    //用户单击自定义其他按钮时进行调用,固定用法,点击后向导窗口不会关闭
    private void OnWizardOtherButton()//在这里是一个初始化数据的功能
    {
        Debug.Log("Clear");
        speedValue = 0;
        canShoot = false;
        ShowNotification(new GUIContent("数据已经初始化完毕"));//该功能用来弹出一个小提示通知信息,几秒后自动消失
    }

    //打开向导或者更改向导里的内容时进行调用,固定用法
    private void OnWizardUpdate()
    {
        Debug.Log("Change");
        //当在向导窗口里一些操作错误或者不规范时,可以通过设置helpString和errorString来进行提示操作人员
        helpString = "文中某某变量填写规范为\"XXXX+DDDD+SS\"";
        errorString = "文中某某变量填写不规范";

        //编辑器模式下,可以使用EditorPrefs进行数据的存取,用法与游戏运行时PlayerPrefs用法一致
        EditorPrefs.SetFloat("key", speedValue);

    }

    //当在工程里选中操作有变化时进行调用
    private void OnSelectionChange()
    {
        OnWizardUpdate();
    }
}

2
2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/339317.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java并发基础:Executor接口和Executors类的区别

Executor是Java中的一个接口&#xff0c;它定义了一种将任务提交与任务执行机制&#xff08;包括线程管理、调度等&#xff09;分离的方式&#xff0c;Executors是一个工具类&#xff0c;它提供了多个静态工厂方法&#xff0c;用于创建不同类型的Executor实例。 代码案例 下面…

Camera基础原理与畸变补偿

Camera基础原理与畸变补偿 Camera知识大盘点 Camera的构成看起来并不复杂&#xff0c;核心是镜头感光芯片&#xff0c;以及其它辅助部件。但大家也都知道光学成像是一门非常深奥且尖端的科学&#xff0c;这其中消费者可以拿来讨论的话题非常之多。现在就来谈谈摄像头&#xf…

php目录操作示例

目录 1.常用函数 2.列举当前目录列表 3.判断是否是文件夹 1.常用函数 函数名功能scandir 列出指定路径中的文件和目录 opendir 打开文件夹&#xff0c;返回操作资源 readdir读取文件夹资源closedir 关闭文件夹操作资源 is_dir 判断是否是文件夹 filetype 显示是文件夹还是文…

若依微服务框架,富文本加入图片保存时出现JSON parse error: Unexpected character (‘/‘ (code 47)):...

若依微服务框架&#xff0c;富文本加入图片保存时出现JSON parse error: Unexpected character 一、问题二、解决1.修改网关配置2、对数据进行加密解密2.1安装插件2.2vue页面加密使用2.3后台解密存储 一、问题 若依微服务项目在使用富文本框的时候&#xff0c;富文本加入图片进…

IDEA(十)2022版本 Services中服务窗口不显示端口号解决

目录 一、问题描述二、问题分析三、解决方案3.1 设置启动参数【生效】3.2 方法二&#xff1a;设置环境变量【不生效】3.3 方法三&#xff1a;删除缓存【不生效】 四、补充&#xff1a;如何手动控制端口显示 一、问题描述 我们在使用 IDEA 的过程中&#xff0c;会发现在 Servic…

详解C语言中`||`的短路机制

在C语言中&#xff0c;逻辑或运算符&#xff08;||&#xff09;是一种常用的逻辑运算符&#xff0c;用于组合多个条件表达式。与其他编程语言一样&#xff0c;C语言中的逻辑或运算符具有短路机制&#xff0c;这是一种非常重要的概念&#xff0c;本文将深入解释C语言中的||短路机…

如何在ubuntu22.04安装ROS2

ubuntu22.04安装ROS2 教程 选择对应版本进行安装设置编码添加源安装ROS2设置环境变量 运行ROS2 选择对应版本 通过官方网站&#xff0c;查询Ubuntu与ros对应的版本&#xff0c;版本不一致也会出现安装不成功。 https://wiki.ros.org/ROS/Installation 每一个都可以进行点击&a…

使用Dockerfile来构建服务的镜像,并部署在容器中

构建服务镜像和容器化部署 一、构建服务镜像1、编写Dockerfile2、构建脚本3、启动脚本 二、问题及解决办法1、no main manifest attribute, in /chatgpt-api-1.0-SNAPSHOT.jar2、如果是SpringBoot项目&#xff0c;应该这么做&#xff1a; 一、构建服务镜像 1、编写Dockerfile …

接口测试 03 -- 接口自动化思维 Requests库应用

1. 接口自动化思维梳理 1.1接口自动化的优点 接口测试自动化&#xff0c;简单来讲就是功能测试用例脚本化然后执行脚本&#xff0c;产生一份可视化测试报告。不管什么样的测试方式&#xff0c;都是为了验证功能与发现 BUG。那为什么要做接口测试自动化呢&#xff1f;一句话概括…

城市道路智慧养护顶层设计建议书

项目通过对国家在推动智慧交通领域的健康发展上发布的如&#xff1a;《交通强国建设纲要》、《推进综合交通运输大数据发展行动纲要(2020-2025年)》、《数字交通发展规划纲要》等相关政策的深入理解与研究&#xff0c;结合“互联网”、“智能化”、“智慧化”等理念,对国家提出…

Mybatis 动态SQL(set)

我们先用XML的方式实现 : 把 id 为 13 的那一行的 username 改为 ip 创建一个接口 UserInfo2Mapper ,然后在接口中声明该方法 package com.example.mybatisdemo.mapper; import com.example.mybatisdemo.model.UserInfo; import org.apache.ibatis.annotations.*; import jav…

GD32接收不定长数据包

接收不定长数据 Cubemx生成代码过程忽略 首先在main函数中创建接收缓存区 并在main.h中定义 接下来就是重写串口的中断函数中的内容&#xff0c;把原有内容注释掉 main中创建一个记录接收数据长度的变量和标志位 然后再在主函数中添加一个验证代码&#xff0c;这样MCU收到数据…

QT第六天

要求&#xff1a;使用QT绘图&#xff0c;完成仪表盘绘制&#xff0c;如下图。 素材 运行效果&#xff1a; 代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPainter> #include <QPen>QT_BEGIN_NAMESPACE name…

嵌入式软件工程师面试题——2025校招社招通用(计算机网络篇)(三十二)

说明&#xff1a; 面试群&#xff0c;群号&#xff1a; 228447240面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但…

HTML Grid 另一种布局方法

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>网格布局测试</title><link rel"styl…

动手做个无人机—材料篇

基于浙江大学Fast-Lab(高飞&#xff0c;潘能)和深蓝学院合作课程&#xff1a;第二课&#xff1a;动力套焊接_哔哩哔哩_bilibili 无人机材料1&#xff1a; 1、NUC 猛虎峡谷 准系统 i5薄款&#xff1a; 一款机载电脑&#xff0c;使用i5-1135G7 &#xff0c;最大内存64G&#xff…

从 fatal 错误到 sync.Map:Go中 Map 的并发策略

为什么 Go 语言在多个 goroutine 同时访问和修改同一个 map 时&#xff0c;会报出 fatal 错误而不是 panic&#xff1f;我们该如何应对 map 的数据竞争问题呢&#xff1f; 这篇文章将带你一步步了解背后的原理&#xff0c;并引出解决 map 并发问题的方案。 Map 数据竞争 首先…

C语言的编译和链接

每日一言 要保持希望在每天清晨太阳升起。 --自己 前言 当我们写下C语言代码&#xff08;源文件、以.c为后缀&#xff09;的时候&#xff0c;他需要经过一个翻译环境&#xff0c;被处理后形成一个可执行程序&#xff08;以.exe为后缀&#xff09;。形成的这个可执行程序里面放…

PLC-IoT 网关开发札记(5):将本地数据库作为资产打包发布到 App

App需求&#xff1a;保存物模型 什么是物模型 在项目开发中&#xff0c;用到了本地数据库&#xff0c;这个本地数据库记录了系统的物模型。所谓物模型就是对某一个设备的可操纵属性的定义&#xff0c;每一个设备包括了一个或者多个属性&#xff0c;通过获取这些属性的当前值可…

基于CanvasLabel的Leaflet矢量数据免切片属性标注实践

目录 前言 一、Leaflet.CanvasLabel 1、开源地址 2、设置参数说明 二、组件集成 1、新建html文件 2、声明样式 3、定义矢量文本渲染器 4、定义地图 5、添加矢量数据 6、最终效果 总结 前言 在一般的业务场景中&#xff0c;针对小量的矢量数据&#xff0c;比如POI兴…
最新文章