首页 >Unity3D频道 >【Unity3D拓展编辑器】 > Unity3D研究院之拓展自定义编辑器窗口(二)
2013
04-15

Unity3D研究院之拓展自定义编辑器窗口(二)

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

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

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表示窗口的名称。

屏幕快照 2013-04-15 下午1.19.03

 

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

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("当窗口关闭时调用");
	}
}

 

屏幕快照 2013-04-15 下午1.22.39

 

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

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

Unity3D研究院之拓展自定义编辑器窗口(二)》有 14 条评论

  1. 秦海刚说:

    有没有什么方法可以把内置的几个菜单隐藏掉??

  2. MOMO大大,问一下,如果想要在关闭窗口前弹出确认框,让用户点击确认再关闭,应该怎么做?

  3. 岩0-08说:

    雨凇大神 请教一下 可以在u3dGame视图下 新开一个窗口 用来显示其他App的界面吗

  4. Turing说:

    请教个问题呀,我想做一个编辑器,他的功能是当我选中Button时,这个窗口可以显示相应Button的属性,当我选中Text可以显示相应Text的属性,但是现在有点问题,需要我获取这个编辑器窗口的焦点他才能去刷新GUI函数,导致我点击Text他不会立即刷新我编辑器窗口里面的内容,而是要我获取焦点后才去刷新

  5. 大神怎么打印 更改的 project的文件名字呢

  6. a2154359说:

    MOMO大大 问一下 自定义编辑器的布局 只能用GUI来做吗

  7. 枫音FireFLO说:

    什么时候需要用到这个窗口?和扩展监视面板的窗口比这个有什么优势么?

  8. 查穆说:

    我想写个小插件,就是当脚本添加到物体后,自动修改物体的名字,该如何实现呢?请大神指点下,谢谢啊。

  9. MOMO大神 怎么才能让窗口支持中文显示呢?

  10. Sora说:

    Cool ! 原來是這樣設計出來的 ^_^

留下一个回复

你的email不会被公开。 必填项已用 * 标注。