实力封装:Unity打包AssetBundle(三)

前情提要:第二种打包方式

窗口初现

通过前面的两篇教程和一篇番外,我们已经完全实现了打包的功能。但是使用起来总是觉得有些晦涩别扭,如果不告诉别人怎么使用,对方肯定是一头雾水。

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是基类的消息函数,在窗口创建之初被调用。通过上面两行代码也能设置窗口的标题,窗口标题通过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函数之间,这样它们就在同一行了。这两个函数就是这么神奇,包裹在它们之间的控件都会排布在同一行上。


好了效果还不错。就到这里吧,下次见。














  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值