窗口初现
通过前面的两篇教程和一篇番外,我们已经完全实现了打包的功能。但是使用起来总是觉得有些晦涩别扭,如果不告诉别人怎么使用,对方肯定是一头雾水。
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);
EditorWindow是基类,这个函数的第一个参数是派生类类型,后面三个参数都有默认值,可以填,也可以不填。但是如果填的话,千万不要把第二个参数带入true,相信我!第三个参数是窗口标题,第四个参数表示是否获得焦点。最后函数返回一个窗口对象,调用窗口对象的Show方法,窗口就显示出来了。
设置窗口标题
除了在创建窗口的时候设置标题以外,我们也可以在构造函数或者OnEnable函数中设置窗口标题↓↓
void OnEnable() {
GUIContent title = new GUIContent ("My Window"); this.titleContent = title;
}
OnEnable是基类的消息函数,会在窗口对象创建的时候调用一次。
那么问题来了,如何往窗口中添加控件呢??
别急,基类的消息函数除了OnEnable之外,还有OnGUI,这个函数就是用来绘制窗口控件的,我们可以将要显示的控件在这个函数中创建。
比如我们首先实现这样一个功能:我们在打包的时候需要选择打包输出的文件路径,我们在窗口中添加一个输入框,提示用户输入一个路径。看代码↓↓
string path; //文件路径void OnGUI() {
path = EditorGUILayout.TextField("输入文件路径:", path);
}
EditorGUILayout.TextField函数用来创建一个输入框,第一个参数是输入框前的提示字符,第二个参数是一个字符串变量,这个字符串会显示在输入框中,它的返回值是输入框中的内容。这里我们将返回值和第二个参数都给到path变量,这样path变量中就存储了我们输入的内容。
之前还有一个选择文件路径的功能,这里我们也给加上。只需要在创建一个按钮,当点击按钮的时候执行选择文件的代码就OK了↓↓
string path; //文件路径void OnGUI() {
path = EditorGUILayout.TextField("输入文件路径:", path);
if(GUILayout.Button("选择文件") {
path = UnityEditor.EditorUtility.SaveFolderPanel("选择保存文件夹", "C:/", "");
}
}
GUILayout.Button会创建一个按钮,当按钮被点击时,返回true。
但是这时打开窗口你会发现按钮被创建在输入框的下面,我们希望的是按钮可以和输入框在同一行,我们可以用GUILayout.BeginHorizontal来将它们显示在同一行↓↓
string path; //文件路径void OnGUI() {
GUILayout.BeginHorizontal();
path = EditorGUILayout.TextField("输入文件路径:", path); if(GUILayout.Button("选择文件", GUILayou.width(80)) {
path = UnityEditor.EditorUtility.SaveFolderPanel("选择保存文件夹", "C:/", ""); }
GUILayout.EndHorizontal();
}
好了,现在它们都乖乖的在一行显示了,最后那个Button函数里加了一个限制宽度的参数,否则按钮会很长。
今天就到这儿了,虽然还很简陋,但好歹看到窗口初现了,后面会逐步完善这个窗口。
下期见啦~