【Unity编辑器】EditorWindow的使用

文章目录

前言

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

创建一个Editor窗口

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

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

c 复制代码
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类添加如下代码

c 复制代码
private void OnGUI()
{
     EditorGUILayout.LabelField(EditorWindow.focusedWindow.ToString());
}

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

Editor窗口鼠标悬停

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

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

功能很简单,鼠标移动的哪个窗口,在MyWindow打印那个窗口的信息,并且自动聚焦到那个窗口。

反正我是成功了,你们可以自行测试。

Editor窗口场景编辑更改监听

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

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

主窗口停靠下最大化窗口

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

c 复制代码
 private void OnGUI()
   {
      maximized = EditorGUILayout.ToggleLeft("Max", maximized);
   }

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

设置窗口的小图标

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

获取中焦窗口

c 复制代码
EditorGUILayout.LabelField("聚焦窗口名字"+EditorWindow.focusedWindow.ToString());

Window.ShowNotification

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

c 复制代码
 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窗口就行了。

c 复制代码
EditorGUIUtility.CommandEvent("Paste");

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

c 复制代码
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的名称改变会有触发事件监听,还有创建,删除,粘贴等等操作,都会被监听到。

写个小例子测试下:

c 复制代码
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视窗)的时候会执行该方法。

相关推荐
Mortal_hhh9 小时前
VScode的C/C++点击转到定义,不是跳转定义而是跳转声明怎么办?(内附详细做法)
ide·vscode·stm32·编辑器
charon877814 小时前
UE ARPG | 虚幻引擎战斗系统
游戏引擎
小春熙子15 小时前
Unity图形学之Shader结构
unity·游戏引擎·技术美术
Sitarrrr18 小时前
【Unity】ScriptableObject的应用和3D物体跟随鼠标移动:鼠标放置物体在场景中
3d·unity
极梦网络无忧18 小时前
Unity中IK动画与布偶死亡动画切换的实现
unity·游戏引擎·lucene
电子云与长程纠缠19 小时前
UE5.3中通过编辑器工具创建大纲菜单文件夹
java·ue5·编辑器
lucky九年20 小时前
vscode翻译插件
ide·vscode·编辑器
真·Wild·攻城狮21 小时前
【码农日常】Vscode Clangd初始化失败(Win10)
ide·vscode·编辑器
七灵微21 小时前
【测试】【Debug】vscode中同一个测试用例出现重复
ide·vscode·编辑器
逐·風1 天前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#