转载自:http://www.xuanyusong.com/archives/2211
Unity支持自行创建窗口,也支持自定义窗口布局。在Project视图中创建一个Editor文件夹,在文件夹中在创建一条脚本。
自定义窗口需要让脚本继承EditorWindow在设置MenuItem,此时在Unity导航菜单栏中GameObjec->window就可创建一个自定义窗口。
C#
usingUnityEngine;
usingUnityEditor;
publicclassMyEditor:EditorWindow
{
[MenuItem("GameObject/window")]
staticvoidAddWindow()
{
//创建窗口
Rect wr=newRect(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表示窗口的名称。**
然后我们在扩充一下自定义窗口,仔细看看窗口的生命周期。
C#
usingUnityEngine;
usingUnityEditor;
publicclassMyEditor:EditorWindow
{
[MenuItem("GameObject/window")]
staticvoidAddWindow()
{
//创建窗口
Rect wr=newRect(0,0,500,500);
MyEditor window=(MyEditor)EditorWindow.GetWindowWithRect(typeof(MyEditor),wr,true,"widow name");
window.Show();
}
//输入文字的内容
privatestringtext;
//选择贴图的对象
privateTexture texture;
publicvoidAwake()
{
//在资源中读取一张贴图
texture=Resources.Load("1")asTexture;
}
//绘制窗口时调用
voidOnGUI()
{
//输入框控件
text=EditorGUILayout.TextField("输入文字:",text);
if(GUILayout.Button("打开通知",GUILayout.Width(200)))
{
//打开一个通知栏
this.ShowNotification(newGUIContent("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)asTexture;
if(GUILayout.Button("关闭窗口",GUILayout.Width(200)))
{
//关闭窗口
this.Close();
}
}
//更新
voidUpdate()
{
}
voidOnFocus()
{
Debug.Log("当窗口获得焦点时调用一次");
}
voidOnLostFocus()
{
Debug.Log("当窗口丢失焦点时调用一次");
}
voidOnHierarchyChange()
{
Debug.Log("当Hierarchy视图中的任何对象发生改变时调用一次");
}
voidOnProjectChange()
{
Debug.Log("当Project视图中的资源发生改变时调用一次");
}
voidOnInspectorUpdate()
{
//Debug.Log("窗口面板的更新");
//这里开启窗口的重绘,不然窗口信息不会刷新
this.Repaint();
}
voidOnSelectionChange()
{
//当窗口出去开启状态,并且在Hierarchy视图中选择某游戏对象时调用
foreach(TransformtinSelection.transforms)
{
//有可能是多选,这里开启一个循环打印选中游戏对象的名称
Debug.Log("OnSelectionChange"+t.name);
}
}
voidOnDestroy()
{
Debug.Log("当窗口关闭时调用");
}
}
网友评论