【unity】拓展自定义编辑器窗口(二)

http://www.xuanyusong.com/archives/2211编辑器

Unity支持自行建立窗口,也支持自定义窗口布局。在Project视图中建立一个Editor文件夹,在文件夹中在建立一条脚本。ide

自定义窗口须要让脚本继承EditorWindow在设置MenuItem,此时在Unity导航菜单栏中GameObjec->window就可建立一个自定义窗口。布局

 

C#this

1spa

2code

3orm

4对象

5blog

6继承

7

8

9

10

11

12

13

14

15

using UnityEngine;

using UnityEditor;

public class MyEditor : EditorWindow

{

 

    [MenuItem ("GameObject/window")]

    static void AddWindow ()

{      

//建立窗口

Rect  wr = new Rect (0,0,500,500);

        MyEditor window = (MyEditor)EditorWindow.GetWindowWithRect (typeof (MyEditor),wr,true,"widow name");

window.Show();

 

    }

}

 EditorWindow.GetWindowWithRect() 和 EditorWindow.GetWindow()均可以建立一个窗口。前者能够规定窗口的区域,后者可经过鼠标动态的延伸窗口。参数1表示窗口的对象,参数2表示窗口的区域,参数3表示窗口类型true表示窗口不会被别的窗口覆盖,参数4表示窗口的名称。

wKiom1WksSfjmb5-AAEo3vb_a80556.jpg

 

而后咱们在扩充一下自定义窗口,仔细看看窗口的生命周期。

 

C#

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

using UnityEngine;

using UnityEditor;

public class MyEditor : EditorWindow

{

 

    [MenuItem ("GameObject/window")]

    static void AddWindow ()

{      

//建立窗口

Rect  wr = new Rect (0,0,500,500);

        MyEditor window = (MyEditor)EditorWindow.GetWindowWithRect (typeof (MyEditor),wr,true,"widow name");

window.Show();

 

    }

 

//输入文字的内容

private string text;

//选择贴图的对象

private Texture texture;

 

public void Awake ()

{

//在资源中读取一张贴图

texture = Resources.Load("1") as Texture;

}

 

//绘制窗口时调用

    void OnGUI ()

{

//输入框控件

text = EditorGUILayout.TextField("输入文字:",text);

 

if(GUILayout.Button("打开通知",GUILayout.Width(200)))

{

//打开一个通知栏

this.ShowNotification(new GUIContent("This is a Notification"));

}

 

if(GUILayout.Button("关闭通知",GUILayout.Width(200)))

{

//关闭通知栏

this.RemoveNotification();

}

 

//文本框显示鼠标在窗口的位置

EditorGUILayout.LabelField ("鼠标在窗口的位置", Event.current.mousePosition.ToString ());

 

//选择贴图

texture =  EditorGUILayout.ObjectField("添加贴图",texture,typeof(Texture),true) as Texture;

 

if(GUILayout.Button("关闭窗口",GUILayout.Width(200)))

{

//关闭窗口

this.Close();

}

 

    }

 

//更新

void Update()

{

 

}

 

void OnFocus()

{

Debug.Log("当窗口得到焦点时调用一次");

}

 

void OnLostFocus()

{

Debug.Log("当窗口丢失焦点时调用一次");

}

 

void OnHierarchyChange()

{

Debug.Log("当Hierarchy视图中的任何对象发生改变时调用一次");

}

 

void OnProjectChange()

{

Debug.Log("当Project视图中的资源发生改变时调用一次");

}

 

void OnInspectorUpdate()

{

   //Debug.Log("窗口面板的更新");

   //这里开启窗口的重绘,否则窗口信息不会刷新

   this.Repaint();

}

 

void OnSelectionChange()

{

//当窗口出去开启状态,而且在Hierarchy视图中选择某游戏对象时调用

foreach(Transform t in Selection.transforms)

{

//有多是多选,这里开启一个循环打印选中游戏对象的名称

Debug.Log("OnSelectionChange" + t.name);

}

}

 

void OnDestroy()

{

Debug.Log("当窗口关闭时调用");

}

}

 

wKioL1WkswLzGEViAAC-DqwnS4c946.jpg

 

下载内容:http://vdisk.weibo.com/s/xHLuJ

相关文章
相关标签/搜索