UnityEditor研究学习之EditorWindow
在unity使⽤过程中,其实我们都是在各个不同功能的Window下⼯作。
⽐如在Scene窗⼝中操作物体,在Inspector中操作物体属性,在Game视窗中观察游戏状态
所以窗⼝是Unity的灵魂,这是唯⼀接⼝我们能够通过它来制作游戏。
那么,我们想⾃定义⼀个⾃⼰的窗⼝,那该如何呢?今天我们就来学习下EditorWindow,由于这个类在UnityEdior下,所以要using UnityEditor; using UnityEngine;
using System.Collections;
using UnityEditor;//注意要引⽤
public class MyWindow: EditorWindow
{
[MenuItem("Window/MyWindow")]//在unity菜单Window下有MyWindow选项
static void Init()
{
MyWindow myWindow = (MyWindow)EditorWindow.GetWindow(typeof(MyWindow), false, "MyWindow", true);//创建窗⼝
myWindow.Show();//展⽰
}
}
这是个简单的创建窗⼝的代码,⾸先通过EditorWindow.GetWindow来取得窗⼝实例,然后展现,我们来看看官⽅的API说明。
GetWindow是个静态⽅法,有三个参数:
第⼀个参数是窗⼝类型,注意是⼀定要继承⾃EditorWindow。
第⼆个参数是窗⼝是否浮动,如果是就不能内嵌到unity其他窗⼝中去,如果不是就能嵌⼊其他窗⼝。(可以省略,默认为内嵌⼊式)
第三个参数是窗⼝的标题,如果为空的话就采⽤类的名称来当标题。(可以省略,默认类的名称)
可以看到第⼀个参数是必须的,其他参数可以省略。c#可选参数的特性。
回到Unity,在Window菜单下拉列表选择MyWindow,可以看到弹出⾃⼰的窗⼝。好开⼼!
当然这个窗⼝⾥⾯什么东西都没有,我们需要往⾥⾯添加各个功能组件,当然这个以后再慢慢详谈,貌似好像如饥似渴了!!=_=
接着,下⾯我们来学习下EditorWindow的各个属性和⽅法:
fousedWindow(静态变量):
注意到类型是EditorWindow,所以顾名思义这个是表⽰当我们聚焦到哪个窗⼝,那么这个静态变量就是那个窗⼝。其实也就是记录我们聚焦的窗⼝。
于是我做了个⼩实验,功能也就是聚焦哪个窗⼝会打印这个窗⼝的信息。
void OnGUI()
{
EditorGUILayout.LabelField(EditorWindow.focusedWindow.ToString());
}
mouseOverWindow(静态变量):
与fouseWindow相似,这个是⿏标悬停在哪个Window,这个静态变量就是那个窗⼝。
using UnityEngine;
using System.Collections;
using UnityEditor;
public class MyWindow: EditorWindow
{
string move;
[MenuItem("Window/MyWindow")]//在unity菜单Window下有MyWindow选项
static void Init()
{
MyWindow myWindow = (MyWindow)EditorWindow.GetWindow(typeof(MyWindow), false, "MyWindow", false);
myWindow.Show(true);
}
void OnGUI()
{
move = useOverWindow ? useOverWindow.ToString() : "Nothing";
EditorGUILayout.LabelField(move);
}
void OnInspectorUpdate()
{
if (useOverWindow)
this.Repaint();//重画MyWindow窗⼝,更新Label
}
}
于是我⼜做了个⼩测试,功能很简单,⿏标移动的哪个窗⼝,在MyWindow打印那个窗⼝的信息,并且⾃动聚焦到那个窗⼝。反正我是成功了,你们可以⾃⾏测试。
.autoRepaintOnSceneChange
engine什么意思
当这个变量为true时,如果unity编辑视窗(注意不只是scene视窗,其他窗⼝)只要有变动,就会重画窗⼝,为false就不会。当然我们做个⼩测试:
using UnityEngine;
using System.Collections;
using UnityEditor;
public class MyWindow: EditorWindow
{
int i = 0;
[MenuItem("Window/MyWindow")]//在unity菜单Window下有MyWindow选项
static void Init()
{
MyWindow myWindow = (MyWindow)EditorWindow.GetWindow(typeof(MyWindow), false, "MyWindow", false);
myWindow.autoRepaintOnSceneChange = true;
myWindow.Show(true);
}
void OnGUI()
{
i++;
EditorGUILayout.LabelField(i.ToString());
}
}
这段代码就是当我们变动unity编辑器时,label就会显⽰i⾃增。
.maximized
当为true,就是当窗⼝是内嵌到其他窗⼝,也就是docked停靠的意思,窗⼝就能最⼤化。开上⾯,他说如果窗⼝没有在停靠状态,那么这个值永远为false,并且设置⽆效。测试的话,我们可以⽤toggle来改变这个bool值。
using UnityEngine;
using System.Collections;
using UnityEditor;
public class MyWindow: EditorWindow
{
[MenuItem("Window/MyWindow")]//在unity菜单Window下有MyWindow选项
static void Init()
{
MyWindow myWindow = (MyWindow)EditorWindow.GetWindow(typeof(MyWindow), false, "MyWindow", false);
myWindow.autoRepaintOnSceneChange = true;
myWindow.Show(true);
}
void OnGUI()
{
maximized = EditorGUILayout.ToggleLeft("Max",maximized);
}
}
  注意⼀定要是内嵌的状态下,那么会观察到点击Max会最⼤化,再次点击会回到原来。
maxSize,minSize,position这⾥我就不详细介绍了,⾃⼰可以去改变着玩玩。
.titleContent
这个变量是设置窗⼝的⼩图标的,图标的类型为GUIContent。
我们再来顺便学习下GUIContent,看看他的API。
.GUIContent
这⾥我们只看他的构造函数,因为我们只想要图标,所以我们选择public GUIContent(image);这个构造函数
不知为何,unity现在没有titleContent这个变量,那么我们也就不要管他了,影响不是很⼤。
.wantsMouseMove
也就是设置这个变量为true的时候,这个窗⼝会接收OnGUI⾥⾯的⿏标在窗⼝上⾯移动的事件。我们来测试⼀下:
using UnityEngine;
using System.Collections;
using UnityEditor;
public class MyWindow: EditorWindow
{
static MyWindow myWindow;
[MenuItem("Window/MyWindow")]//在unity菜单Window下有MyWindow选项
static void Init()
{
myWindow = (MyWindow)EditorWindow.GetWindow(typeof(MyWindow), false, "MyWindow", false);
myWindow.Show(true);
}
void OnEnable()
{
}
void OnGUI()
{
wantsMouseMove = EditorGUILayout.Toggle("receive mouseMove:", wantsMouseMove);//是否启⽤接收⿏标移动事件监听
EditorGUILayout.LabelField("Mouse Position:", usePosition.ToString());
if (pe == useMove && wantsMouseMove)//如果是⿏标移动的事件,就重画窗⼝
{                                              ///因为上⾯注意那⾥有讲到:他不会⾃动调⽤repaint()⽅法
Repaint();
}
}
 运⾏项⽬,可以看到,当勾选了recevive mouseMove选项后,label会实时更新⿏标的坐标。
--------------------------------------------------------------------------分隔符-------------------------------------------------------------------------------------------------------