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

发布时间:2024年01月22日

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

文章来源:https://blog.csdn.net/backlighting2015/article/details/135660870
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。