1. 前言
- 在Unity中,EditorWindow和ScriptableWizard都是用于创建自定义编辑器界面的类。
- 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");
}
}
![](https://www.fantsida.com/assets/files/2024-03-11/1710148376-663243-55e4fd7ccf1c451fa402a35a166a0c72.png)
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();
}
}
![](https://www.fantsida.com/assets/files/2024-03-11/1710148401-791205-8c65041951f84242b2de8ac7f7eb4cfb.png)
![](https://www.fantsida.com/assets/files/2024-03-11/1710148401-811264-cf5d0ba1bee14080b71a042858bd5dd8.png)