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

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");	
        //MyEditor2 myEditor2 = GetWindow(typeof(MyEditor2), true, "我的窗口") as MyEditor2;    // 可拉伸
		window.Show();
 
    }
}
 

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

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

 
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 ());
        //GUILayout.Label("鼠标位置2:" + strMousePos);              // EditorGUILayout 与 GUILayout 都属于自动布局,可以一起使用,GUILayout主要设置值,EditorGUILayout还可以设置变量名
        //GUI.Label(new Rect(100, 100, 100, 50),"鼠标位置3:" + strMousePos);    // GUI需要自己确定控件位置等。和自动布局一起使用,容易产生位置冲突。
        //EditorGUI.LabelField(new Rect(0, 100, 200, 50), "鼠标位置4:", strMousePos);  // EditorGUI与GUI差不多。区别也是设置值和设置变量名,控件宽高设置不一样(包含变量名)
 
		//选择贴图
		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();    // 重绘窗口面板。没注释的话,当前窗口丢失焦点,只要焦点还在Unity编辑器内,也会刷新当前窗口面板,且刷新频率比OnGUI更快。
	}
 
	void OnSelectionChange()
	{
		//当窗口出去开启状态,并且在Hierarchy或project视图中选择某游戏对象时调用
		foreach(Transform t in Selection.transforms)
		{
			//有可能是多选,这里开启一个循环打印选中游戏对象的名称
			Debug.Log("OnSelectionChange" + t.name);
		}
	}
 
	void OnDestroy()
	{
		Debug.Log("当窗口关闭时调用");
	}
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值