Lesson2 - 自定义编辑器窗口

EditorWindow 基础

继承 EditorWindow 类并重写 OnGUI 方法可以创建自定义编辑器窗口。这是实现编辑器拓展的基础。

创建并显示窗口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using UnityEditor;
using UnityEngine;

public class MyWindow : EditorWindow {
[MenuItem("Window/My Custom Window")]
public static void ShowWindow() {
MyWindow win = EditorWindow.GetWindow<MyWindow>("窗口标题");
win.titleContent = new GUIContent("我的窗口");
win.Show();
}

private void OnGUI() {
GUILayout.Label("这是窗口内容");
if (GUILayout.Button("测试按钮")) {
Debug.Log("按钮被点击");
}
}
}

GetWindow 常用参数

创建窗口时可以使用不同的 GetWindow 重载方法:

  • GetWindow<T>():获取或创建窗口
  • GetWindow<T>("标题"):指定窗口标题
  • GetWindow<T>(utility: true):创建浮动窗口(可自由移动改变大小)
  • GetWindowWithRect<T>(Rect):创建指定位置和大小的窗口

生命周期函数

OnEnable 和 OnDisable

1
2
3
4
5
6
7
8
9
private void OnEnable() {
Debug.Log("窗口被激活");
// 初始化工作,注册事件监听器
}

private void OnDisable() {
Debug.Log("窗口被关闭");
// 清理工作,注销事件监听器
}

OnGUI

每帧调用,用于绘制窗口 UI。这是最重要的方法。

OnDestroy

窗口销毁时调用,执行最终清理工作。

事件回调函数

内容变化事件

OnHierarchyChange():Hierarchy 窗口发生变化时调用,如游戏对象创建、删除、重命名。

OnProjectChange():Project 资源发生变化时调用。

OnInspectorUpdate():Inspector 面板更新时调用,可用于实时更新窗口显示。

焦点事件

OnFocus():窗口获得焦点时调用。

OnLostFocus():窗口失去焦点时调用,可用于保存数据。

选择事件

OnSelectionChange():选中对象发生变化时调用,可以在这里更新窗口显示的内容。

1
2
3
4
5
6
private void OnSelectionChange() {
if (Selection.activeGameObject != null) {
Debug.Log("选中了:" + Selection.activeGameObject.name);
}
Repaint(); // 重绘窗口
}

常用成员

静态属性

  • focusedWindow:当前获得键盘焦点的窗口
  • mouseOverWindow:鼠标所在的窗口

成员属性

  • titleContent:窗口标题和图标
  • position:窗口位置和大小的 Rect
  • wantsMouseEnterLeaveWindow:设为 true 可监听鼠标进出事件

成员方法

  • Show():显示窗口
  • Close():关闭窗口
  • Repaint():立即重绘窗口
  • Focus():获得焦点

窗口类型

普通窗口

1
MyWindow win = EditorWindow.GetWindow<MyWindow>("标题");

浮动窗口(Utility)

1
MyWindow win = EditorWindow.GetWindow<MyWindow>("标题", utility: true);

浮动窗口可以自由拖动和改变大小,不会与其他窗口停靠。

多实例窗口

1
MyWindow win = EditorWindow.CreateWindow<MyWindow>("标题");

CreateWindow 允许创建多个相同类型的窗口实例。