窗口初现
通过前面的两篇教程和一篇番外,我们已经完全实现了打包的功能。但是使用起来总是觉得有些晦涩别扭,如果不告诉别人怎么使用,对方肯定是一头雾水。
What?你给我的这是啥??
当你亲自演示了如何操作时,对方...
这也就是前面的教程将操作过程写的那么详细的原因(当然,高手请忽略)。
Unity除了提供常规API以外,还提供了一系列窗口编程的API,这就意味着我们可以轻松创建自定义窗口,扩展编辑器功能,可以说是很方便了。今天的任务就是在Unity中创建一个自定义的窗口,通过菜单调出窗口。
如果要在Unity中创建自定义的窗口,我们的脚本需要继承自EditorWindow这个类。然后添加如下代码↓↓
[MenuItem("AssetBundle/Build")]
static void Init () {
//创建窗口对象
PackageAssetBundle window = EditorWindow.GetWindow (typeof(PackageAssetBundle)) as PackageAssetBundle;
//显示窗口
window.Show ();
}
PackageAssetBundle是当前我们写的类的名字,现在点击菜单AssetBundle→Build,你就会看到一个窗口跃然屏上。
当然这个窗口里面还空空如也,窗口的名字就是类名。下面先说说GetWindow这个函数↓↓
public static EditorWindow GetWindow(Type t, bool utility = false, string title = null, bool focus = true);
设置窗口标题
除了在创建窗口的时候设置标题以外,我们也可以在构造函数或者OnEnable函数中设置窗口标题↓↓
void OnEnable() {
GUIContent title = new GUIContent ("My Window");
this.titleContent = title;
}
OnEnable是基类的消息函数,在窗口创建之初被调用。通过上面两行代码也能设置窗口的标题,窗口标题通过EditorWindow类的titleContent属性设置。既然能在创建窗口对象时就指定窗口标题,还是怎么简单怎么来吧,这里只是提供另一种选择而已。
现在问题来了,怎么往窗口里添加控件呢?别担心,我们有OnGUI函数,它会在每次窗口刷新时执行。在该函数中可以添加常用的窗口控件,如按钮,输入框,单选框,复选框,标签等。
void OnGUI() {
//添加窗口控件的代码。。。
}
我们先来一个选择保存路径的功能。我们需要一个文本框输入路径。我们在OnGUI函数中添加如下代码:
path = EditorGUILayout.TextField ("Build Path:", path);
path是string类型的变量,需要事先定义好。TextField函数的第一个参数就是输入框前的提示信息,第二个参数需要一个string变量接收输入框中输入的内容。
也许你觉得输入太麻烦,想要用鼠标点击选择路径。那就再添加一个按钮。我们在OnGUI函数中继续添加如下代码:
if (GUILayout.Button ("···", GUILayout.Width(30), GUILayout.Height(14))) {
packagePath = UnityEditor.EditorUtility.SaveFolderPanel ("Select Build Path", "F:/", "");
}
Button函数用来创建一个按钮,如果点击按钮函数返回true。它的第一个参数是按钮上的文字提示,后面都是布局信息,可以自己调整看看。UnityEditor.EditorUtility.SaveFolderPanel函数用来打开一个路径选择窗口,第一个参数是窗口标题,第二个窗口时打开窗口的默认路径,第三个参数是默认文件名,这里带入空就好。
运行起来,的确是能看到一个输入框和一个按钮了。但是,哪里不对啊,输入框和按钮不在同一行。不要惊慌,它们默认的布局就是这样的,我们再来调整一下。
GUILayout.BeginHorizontal ();
packagePath = EditorGUILayout.TextField ("Build Path:", packagePath);
if (GUILayout.Button ("···", GUILayout.Width(30), GUILayout.Height(14))) {
packagePath = UnityEditor.EditorUtility.SaveFolderPanel ("Select Build Path", "F:/", "");
}
GUILayout.EndHorizontal ();
我们将前面的代码包裹在BeginHorizontal和EndHorizontal函数之间,这样它们就在同一行了。这两个函数就是这么神奇,包裹在它们之间的控件都会排布在同一行上。
好了效果还不错。就到这里吧,下次见。