EditorWindow 类中事件方法的执行顺序

参与实验的事件方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Open() // 内部调用了 GetWindow() 方法

OnEnable()

OnFocus()

OnGUI()

OnInspectorUpdate()

OnLostFocus()

OnDisable()

OnDestroy()

OnHierarchyChange()

OnProjectChange()

OnSelectionChange()

实验代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
using UnityEditor;
using UnityEngine;

public class MyWindow : EditorWindow
{
bool bool_OnEnable = true;
bool bool_OnInspectorUpdate = true;
bool bool_OnHierarchyChange = true;
bool bool_OnProjectChange = true;
bool bool_OnGUI = true;
bool bool_OnFocus = true;
bool bool_OnSelectionChange = true;
bool bool_OnLostFocus = true;
bool bool_OnDisable = true;
bool bool_OnDestroy = true;

public static void Open()
{
Debug.Log("打开窗口");
Debug.Log("BeforeOpen");

GetWindow<MyWindow>();

Debug.Log("AfterOpen");
}

private void OnEnable()
{
if (bool_OnEnable)
{
bool_OnEnable = false;
Debug.Log("OnEnable");
}
}

private void OnInspectorUpdate()
{
if (bool_OnInspectorUpdate)
{
bool_OnInspectorUpdate = false;
Debug.Log("OnInspectorUpdate");
}
}

private void OnHierarchyChange()
{
if (bool_OnHierarchyChange)
{
bool_OnHierarchyChange = false;
Debug.Log("OnHierarchyChange");
}
}

private void OnProjectChange()
{
if (bool_OnProjectChange)
{
bool_OnProjectChange = false;
Debug.Log("OnProjectChange");
}
}

private void OnGUI()
{
if (bool_OnGUI)
{
bool_OnGUI = false;
Debug.Log("OnGUI");
}
}

private void OnFocus()
{
if (bool_OnFocus)
{
bool_OnFocus = false;
Debug.Log("OnFocus");
}
}

private void OnSelectionChange()
{
if (bool_OnSelectionChange)
{
bool_OnSelectionChange = false;
Debug.Log("OnSelectionChange");
}
}

private void OnLostFocus()
{
if (bool_OnLostFocus)
{
bool_OnLostFocus = false;
Debug.Log("---------------------------------------------------------------------------------------------------------------------");
Debug.Log("关闭窗口");
Debug.Log("OnLostFocus");
}
}

private void OnDisable()
{
if (bool_OnDisable)
{
bool_OnDisable = false;
Debug.Log("OnDisable");
}
}

private void OnDestroy()
{
if (bool_OnDestroy)
{
bool_OnDestroy = false;
Debug.Log("OnDestroy");
}
}
}

实验输出

EditorWindowRunTime

实验结论

下图中有一个点需要特别注意, OnEnable()OnFocus() 是在 GetWindow() 方法返回之前执行的. 因此 OnEnable()OnFocus() 中不能对 GetWindow() 的返回值做任何操作, 因为此时的返回值还是空值.

EditorWindowRunTimeUML

另外的三个 Change() 类事件方法:

  • OnHierarchyChange()

    每当场景的层次结构发生变化时调用.

  • OnProjectChange()

    每当项目发生更改时调用.

  • OnSelectionChange()

    每当选择发生更改时调用.