Unity支持自行创建窗口,也支持自定义窗口布局。在Project视图中创建一个Editor文件夹,在文件夹中在创建一条脚本。
自定义窗口需要让脚本继承EditorWindow在设置MenuItem,此时在Unity导航菜单栏中GameObjec->window就可创建一个自定义窗口。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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表示窗口的名称。
然后我们在扩充一下自定义窗口,仔细看看窗口的生命周期。
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 |
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("当窗口关闭时调用"); } } |
下载内容:http://vdisk.weibo.com/s/xHLuJ
- 本文固定链接: https://www.xuanyusong.com/archives/2211
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!
有没有什么方法可以把内置的几个菜单隐藏掉??
MOMO大大,问一下,如果想要在关闭窗口前弹出确认框,让用户点击确认再关闭,应该怎么做?
雨凇大神 请教一下 可以在u3dGame视图下 新开一个窗口 用来显示其他App的界面吗
请教个问题呀,我想做一个编辑器,他的功能是当我选中Button时,这个窗口可以显示相应Button的属性,当我选中Text可以显示相应Text的属性,但是现在有点问题,需要我获取这个编辑器窗口的焦点他才能去刷新GUI函数,导致我点击Text他不会立即刷新我编辑器窗口里面的内容,而是要我获取焦点后才去刷新
大神怎么打印 更改的 project的文件名字呢
MOMO大大 问一下 自定义编辑器的布局 只能用GUI来做吗
EditorWIndows 或者 EditorGUI都可以
什么时候需要用到这个窗口?和扩展监视面板的窗口比这个有什么优势么?
我想写个小插件,就是当脚本添加到物体后,自动修改物体的名字,该如何实现呢?请大神指点下,谢谢啊。
MOMO大神 怎么才能让窗口支持中文显示呢?
windows UTF-8 +BOM mac 下 utf-16
windows UTF-8 BOM mac 下 utf-16
Cool ! 原來是這樣設計出來的 ^_^
呵呵 就是这样的。。