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 处理程序,用于在层级视图中的对象或对象组发生更改时发送的消息。
OnInspectorUpdate OnInspectorUpdate 以每秒 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");
    }
}

Unity 编辑器篇|(十二)自定义编辑器窗体(EditorWindow,ScriptableWizard) (全面总结 | 建议收藏)_第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("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();
    }
}

Unity 编辑器篇|(十二)自定义编辑器窗体(EditorWindow,ScriptableWizard) (全面总结 | 建议收藏)_第2张图片
Unity 编辑器篇|(十二)自定义编辑器窗体(EditorWindow,ScriptableWizard) (全面总结 | 建议收藏)_第3张图片

你可能感兴趣的:(#,Unity编辑器篇,unity,编辑器,游戏引擎,c#)