【Unity编辑器】EditorWindow的使用

news2024/11/16 10:38:33

文章目录

  • 前言
  • 创建一个Editor窗口
    • Unity引擎目前中焦的窗口
    • Editor窗口鼠标悬停
    • Editor窗口场景编辑更改监听
    • 主窗口停靠下最大化窗口
    • 设置窗口的小图标
    • 获取中焦窗口
    • Window.ShowNotification
    • Window.SendEvent
    • EditorWindow.OnHierarchyChange()
    • EditorWindow.OnProjectChange()

前言

学习下编辑器的写法,主要可以用来做一些流程化的东西,帮助自己提高下工作效率

创建一个Editor窗口

在Unity中都是基于窗口进行工作的。Game窗口用查看游戏运行的实际情况,Scene窗口用来看游戏场景等等,窗口就是Unity引擎工作流的核心灵魂。

写创建一个cs文件,命名ExcelWindow.cs,编写代码如下

using UnityEditor; 
public class ExcelWindow : EditorWindow
{
   [MenuItem("Excel/ExcelWindow")]
   private static void ShowExcelProcessWindow()
   {
       var window = GetWindow<ExcelWindow>();
       window.Show();
   }
}

MenuItem特性能直接在Unity的菜单栏中加上一个路径Excel/ExcelWindow,再加上通过GetWindow方法得到对应Window的实例,调用Show方法来进行窗口的显示。
在这里插入图片描述

Unity引擎目前中焦的窗口

通过EditorWindow自己的静态字段focusedWindow来获取中焦窗口,在EditorWindow类添加如下代码

private void OnGUI()
{
     EditorGUILayout.LabelField(EditorWindow.focusedWindow.ToString());
}

这样就能在Excel面板上获取当前中焦的参考,OnGUI是Unity自带的GUI刷新函数,会一直进行刷新。
在这里插入图片描述

Editor窗口鼠标悬停

mouseOverWindow与fouseWindow相似,这个是鼠标悬停在哪个Window,这个静态变量就是那个窗口。

 void OnInspectorUpdate()
    {
        if (EditorWindow.mouseOverWindow)
 
            EditorWindow.mouseOverWindow.Focus();//就是当鼠标移到那个窗口,这个窗口就自动聚焦
 
        this.Repaint();//重画MyWindow窗口,更新Label
    }

功能很简单,鼠标移动的哪个窗口,在MyWindow打印那个窗口的信息,并且自动聚焦到那个窗口。
反正我是成功了,你们可以自行测试。

Editor窗口场景编辑更改监听

很多时候,我们都是在Scene面板上进行编辑工作,一些编辑器功能要做一些实时刷新的工作,只有在编辑Scene才刷新窗口,一般情况下不进行任何刷新。可以设置对应的window类的autoRepaintOnSceneChange = true。

[MenuItem("Excel/ExcelWindow")]
   private static void ShowExcelProcessWindow()
   {
       var window = GetWindow<ExcelWindow>();
       window.autoRepaintOnSceneChange = false;
       window.Show(true);
   }

主窗口停靠下最大化窗口

maximized只有在窗口停靠在主窗口的情况下才能使用的选项,这里添加设置一个窗口向左的Toggle来进行测试,代码如下。

 private void OnGUI()
   {
      maximized = EditorGUILayout.ToggleLeft("Max", maximized);
   }

当窗口停靠在主窗口上才能失效,点击max的toggle就能进行这个窗口的最大化。

设置窗口的小图标

通过GUIContent.GUIContent来修改窗口的icon小图标

获取中焦窗口

EditorGUILayout.LabelField("聚焦窗口名字"+EditorWindow.focusedWindow.ToString());

Window.ShowNotification

在这里插入图片描述
使用这个方法打印的消息不会像消息盒子一样自动消失,必须手动调用RemoveNotiftcation才会这个文本消失,编码如下:

 m_notification = EditorGUILayout.TextField(m_notification);
 
        if (GUILayout.Button("Show Notification"))
        {
            myWindow.ShowNotification(new GUIContent(m_notification));
        }
 
        if (GUILayout.Button("Remove Notification"))
        {
            myWindow.RemoveNotification();
        }

Window.SendEvent

这个方法就是传递事件的方法,什么意思,也就是说比如你想在Hierarchy窗口粘贴要复制的Cube,那么这个粘贴他是一个事件,那么正常我们是用鼠标操作粘贴,如果我们想要用代码控制,就得使用该方法,直接传递粘贴事件给Hierarchy窗口就行了。

EditorGUIUtility.CommandEvent("Paste");

这个方法是通过事件名字取得事件,OK,我们来写下代码:

using UnityEngine;
using System.Collections;
using UnityEditor;
 
public class MyWindow: EditorWindow
{
    static MyWindow myWindow;
 
    [MenuItem("Window/MyWindow")]//在unity菜单Window下有MyWindow选项
    static void Init()
    {
 
        myWindow = (MyWindow)EditorWindow.GetWindow(typeof(MyWindow), false, "MyWindow", false);
 
        myWindow.Show();
    }
 
    void OnEnable()
    {
        
    }
 
    void OnGUI()
    {
 
        if (EditorWindow.focusedWindow.ToString().Trim() == "(UnityEditor.SceneHierarchyWindow)")
 
        {
 
            EditorWindow.focusedWindow.SendEvent(EditorGUIUtility.CommandEvent("Paste"));//传递粘贴的事件
 
        }
    }
}

EditorWindow.OnHierarchyChange()

这个方法是当Hierarchy视窗改变的时候,会执行这个方法的逻辑。
当Transform组件参数改变的时候,这里注意下你在视窗Scene中拖动坐标轴是不会监听到,只有在Inspector视窗中手动改Transform的值才发生监听。

还有GameObject的名称改变会有触发事件监听,还有创建,删除,粘贴等等操作,都会被监听到。

写个小例子测试下:

using UnityEngine;
using UnityEditor;
using System.Collections;
 
 
public class MyWindow : EditorWindow
{
    static EditorWindow myWindow;
 
    [MenuItem("Window/MyWindow")]
    static void Init()
    {
 
        myWindow = (MyWindow)EditorWindow.GetWindow(typeof(MyWindow), false, "MyWindow", false);
 
        myWindow.Show();
    }
 
    void OnHierarchyChange()
    {
        Debug.Log("Sync");
    }
} 

EditorWindow.OnProjectChange()

这个方法和上述类似,是Project视窗发生改变的时候,会执行该方法。

比如说导入文件,移动文件,等等,当然包括删除文件。

这里我就不演示了,和上述类似。

EditorWindow.OnSelectionChange()
这个方法是当你选择的物件发生变化(包括Scene,Project和Hierarchy视窗)的时候会执行该方法。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谷歌搜索垄断案:历史是否会重演微软的宿命?

美国法官在本周一作出裁决&#xff0c;确认Google在搜索市场拥有垄断地位&#xff0c;并援引了二十多年前的微软案作为参考。卡多佐法学院的法学教授Sam Weinstein&#xff0c;也曾是司法部反垄断律师&#xff0c;他指出政府始终在明示或暗示地将本案建立在微软案的基础上。面对…

Unity效果优化之抗锯齿

Unityde 基于HDRP渲染管线的抗锯齿处理的设置参考图&#xff1a; 前提&#xff1a;需要导入HDRP的插件包才行&#xff0c; 该参数设置能保证在PC版上抗锯齿效果非常好&#xff0c; 英文版&#xff1a;

《向量数据库指南》——向量搜索:从简单到复杂,生产级部署的挑战与策略

向量搜索并非轻而易举! 向量搜索,也称为向量相似性搜索或最近邻搜索,是一种常见于 RAG 应用和信息检索系统中的数据检索技术,用于查找与给定查询向量相似或密切相关的数据。业内通常会宣传该技术在处理大型数据集时非常直观且简单易用。一般来说,您只需将数据输入到 Embed…

k8s—Prometheus+Grafana+Altermaneger构建监控平台

目录 一、安装node-exporter 1.下载所需镜像 2.编写node-export.yaml文件并应用 3.测试node-exporter并获取数据 二、Prometheus server安装和配置 1.创建sa(serviceaccount)账号&#xff0c;对sa做rabc授权 1&#xff09;创建一个 sa 账号 monitor 2&#xff09;把 sa …

C++ | Leetcode C++题解之第330题按要求补齐数组

题目&#xff1a; 题解&#xff1a; class Solution { public:int minPatches(vector<int>& nums, int n) {int patches 0;long long x 1;int length nums.size(), index 0;while (x < n) {if (index < length && nums[index] < x) {x nums[i…

系统时间的获取 | 文件操作相关函数 |报错函数 | makefile

系统uid/gid的获取 1.getpwuid 功能:根据用户id到/etc/passwd文件下解析获得结构体信息 参数:uid:用户id 返回值:成功返回id对应用户的信息 ;失败返回NULL 2.getgrgid 功能:根据gid到/etc/group文件中解析组信息 参数:gid:组id 返回值:成功返回组信息;失败返回NULL 系统时间的…

【新械专栏】球囊型冷冻消融导管获批上市

近日&#xff0c;国家药品监督管理局批准了上海安钛克医疗科技有限公司“球囊型冷冻消融导管”创新产品注册申请。 该产品由球囊型冷冻消融导管、手动回缩器组成&#xff0c;与特定冷冻消融仪联合使用&#xff0c;用于治疗成人患者药物难治性、复发性、症状性的阵发性房颤。 该…

Python中的 `break` 语句:掌握循环控制的艺术

Python中的 break 语句&#xff1a;掌握循环控制的艺术 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕…

Go语言内存管理:从理论到实战

1. 引言 1.1 内存管理的重要性 内存管理是编程中的一个重要环节&#xff0c;它涉及到内存的分配与释放&#xff0c;对于程序的性能和稳定性有着至关重要的影响。不当的内存管理会导致内存泄漏、内存溢出等问题&#xff0c;从而影响程序的正常运行。特别是在大型项目中&#xf…

ttwid、x-bogus、a-bogus、msToken、byted_acrawler等直播参数说明和获取方式

可以参考开源项目&#xff1a;https://github.com/Sjj1024/douyin-live 桌面端的直播间项目&#xff1a;https://github.com/Sjj1024/LiveBox ttwid参数 ttwid类似客户端id&#xff0c;即便是游客模式&#xff0c;也可以对页面数据进行埋点统计&#xff0c;通过收集ttwid下的…

R9000P 双系统安装 win11 和 ubuntu

网上了解到一堆关于 r9000p 安装较老的ubuntu系统&#xff0c;会有一堆问题 可能是电脑硬件比较新&#xff0c;较老的系统相关方面不兼容 那么干脆直接装新一点的系统 我安装了 Ubuntu 22.04 1 根据相关教程利用u盘制作系统盘 ultraISO 推荐使用清华源 速度快一点 https://…

【Linux】系列入门摘抄笔记-5-管理、创建、移动文件目录及文件搜索命令

touch 创建新的空文件 touch [选项] [参数] 描述:创建新的空文件,可以一次性创建多个文件。touch命令还可以用于修改文件的时间属性,不加时间戳则默认修改为当前时间。 如果文件不存在,则会建立空文件,如果文件已存在,则会修改文件的时间戳。 在linux中,文件没有创建时…

MTK Android12 SystemUI 手势导航 隐藏导航栏底部布局

问题:android12 平台手势导航情况下,app页面未设置全屏情况下,底部导航栏会有一个高度的颜色,底部导航会有一个手势导航提示条 需求:去掉手势导航情况下底部的导航栏和手势提示条 文章目录 相关资源修改问题描述解决方案代码跟踪中间提醒小方块代码查找底部手势导航条跟踪…

Dell R750 R760 H755安装SuSE12SP5 并识别Intel E810 NIC

新的机器对老的版本的OS支持不是非常好&#xff0c;好在有一些方法是可以获得老的驱动&#xff0c;并可以进行安装的。 1 需要有H755阵列卡对应的驱动 这里可以在博科的网站上进行下载&#xff0c;里面是有相关的驱动 截一些图片 按e键进行操作 后续继续安装即可,安装 安装…

【漏洞复现】LiveBos UploadFile 任意文件上传漏洞

声明&#xff1a;本文档或演示材料仅用于教育和教学目的。如果任何个人或组织利用本文档中的信息进行非法活动&#xff0c;将与本文档的作者或发布者无关。 一、漏洞描述 LiveBOS&#xff0c;由顶点软件股份有限公司开发的对象型业务架构中间件及其集成开发工具&#xff0c;是…

实现关系运算符的重载

全局函数的实现法&#xff1a; 成员函数实现法&#xff1a;

vscode配置代码片段生成快捷键

一开始还以为是装个插件的事&#xff0c;没想到是自己定义的快捷键。 以vue3代码片段为例 在vscode左下角点击红框处 选择新建全局代码片段文件 输入快捷键名称 vue3&#xff08;可以自定义&#xff09;&#xff0c;以.json结尾&#xff0c;回车 在打开的文件里编写需要的代…

MySQL把逗号分隔的id转换成逗号分隔的文字

有些列的值是逗号分隔的id&#xff0c;例如用户id&#xff1a;1,2,3&#xff0c;想要把这些id转成对应的文字&#xff0c;本文介绍转换方法。 方法一&#xff1a; 借助mysql.help_topic&#xff0c;参考我的另一篇博客&#xff1a;MySQL列转行-CSDN博客 方法二&#xff1a; …

二叉搜索树+set和map

前言 现在我们开始进行对树的学习,这一节我们主要讲二叉搜索树和set和map的使用&#xff0c;这两个的使用我们只讲一些&#xff0c;然后就是一些练习题&#xff0c;综合使用stl 1. key类型的二叉搜索树的实现 //实现二叉搜索树 template<class K> struct BSNode {BSNo…

nginx.conf alias 静态资源 别名 nginx配置

Linux系统Bug 报权限不足错误 user root; 解决server_name太长时报错的问题 #解决server_name太长时报错的问题server_names_hash_bucket_size 64; 解决文件上传默认限制1M的问题 #解决文件上传默认限制1M的问题client_max_body_size 100m; 监听所有端口 server_name _; a…