→→前情提要:让用户选择要打包的文件←←

大结局:更多选择

Unity打包AssetBundle从入门到放弃系列终于要迎来大结局了【小哥哥表示实在写不动了o(╥﹏╥)o】...

经过上一次的教程,其实整个打包的功能也就差不多完成了,只是我们还没加上打包的按钮。这几次我们会加上打包和取消的按钮,并且开放更多的选项。

开始之前我们再来看看BuildAssetBundles函数的定义↓↓

  public static AssetBundleManifest BuildAssetBundles(string outputPath, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform);
Parameters

在这个函数中,最后两个参数规定了打包时采用的压缩方式以及目标平台,我们可以将这两个选项公开出来,供用户选择。

BuildAssetBundleOptions和BuildTarget都是枚举类型的变量,我们可以提供一个下拉按钮,让用户自由选择。EditorGUILayout.EnumPopup方法恰好可以实现这一功能,它需要一个枚举类型的参数,并且自动将该枚举类型的所有选项变成下拉按钮,所以首先我们需要定义两个枚举类型的字段↓↓

  private BuildAssetBundleOptions buildOption = BuildAssetBundleOptions.None;
private BuildTarget targetPlatform = BuildTarget.StandaloneWindows64;

然后在OnGUI函数中添加如下代码↓↓

  buildOption = (BuildAssetBundleOptions)EditorGUILayout.EnumPopup ("Build Option:", buildOption);
targetPlatform = (BuildTarget)EditorGUILayout.EnumPopup ("Build Platform:", targetPlatform);

注意,函数返回值要进行类型转换,第一个参数表示下拉框前面的文字提示。

在第二篇教程:第二种打包方式中,我们写了两个打包函数,表示两种不同的打包方式。一是将选中的文件分开打包,二是将选中文件打进一个包,我们也可以自定义一个枚举类型来表示这两种不同的打包方式,已提供更灵活的选择。

首先定义枚举类型和枚举变量↓↓

  enum PackageStyle {
BUILD_ALL_IN_ONE_FOLDER, //分开打包
BUILD_ALL_IN_AN_ASSETBUNDLE,//打进一个包
};
private PackageStyle style = PackageStyle.BUILD_ALL_IN_EACH_FOLDER;
private string packageName;

然后往OnGUI函数中添加如下代码↓↓

  GUILayout.Space (10);
GUILayout.BeginVertical (GUILayout.Height(50));
style = (PackageStyle)EditorGUILayout.EnumPopup ("Package Style:", style);
if (style == PackageStyle.BUILD_ALL_IN_AN_ASSETBUNDLE) {
packageName = EditorGUILayout.TextField ("Package Name:", packageName);
}
GUILayout.EndVertical ();

这里我们还判断了一下打包方式,如果是所有文件打进一个包的话,提供一个文本框让用户输入包的名字,因为我们也不知道把哪一个文件的名字作为包的名字合适。

现在只剩最后一步打包了,我们提供两个按钮,一个叫打包,一个叫取消。如果取消被点击,就直接关闭窗口;如果打包被点击,就根据用户选择的打包方式,调用对应的函数进行打包,完成以后关闭窗口。我们继续在OnGUI函数中添加代码↓↓

  GUILayout.BeginHorizontal ();
if (GUILayout.Button ("取消",  GUILayout.Width(80))) {
this.Close ();
}
if (GUILayout.Button ("打包",  GUILayout.Width(80))) {
bool canPackage = true;
if (packagePath == null || packagePath.Length <= 0 || !Directory.Exists (packagePath)) {
canPackage = false;
EditorApplication.Beep ();
}
List<string> selectedAssets = new List<string> ();
int count = 0;
foreach (var go in assetsPath) {
if (flags [count])
selectedAssets.Add (go);
++count;
}
if (selectedAssets == null || selectedAssets.Count <= 0) {
canPackage = false;
EditorApplication.Beep ();
}
if (canPackage) {
switch (style) {
case PackageStyle.BUILD_ALL_IN_ONE_FOLDER:
{
BuildAssetsInOneFolder (packagePath, selectedAssets.ToArray ());
break;
}
case PackageStyle.BUILD_ALL_IN_AN_ASSETBUNDLE:
{
BuildAssetsInOneBundle (packagePath, selectedAssets.ToArray ());
break;
}
default: { break; }
}
this.Close ();
}
}
GUILayout.EndHorizontal ();

点击打包按钮的时候复杂一点,我们一一来说明↓↓

首先有一个bool标志,表示是否可以打包。有两种情况下是不能进行打包的:

  • 用户给出的打包路径为空或不存在;

  • 用户未选择任何资源文件

针对以上两种情况,我们将标志位设为false,这样就不会运行打包的函数了。EditorApplication.Beep ()可以让系统发出“叮”的一声,提示用户出错了。

另外,我们还需要将用户选择的文件都给摘出来。也就是需要遍历AssetsPath链表,将flags数组中值为true的下标对应的文件路径添加到一个新的链表中。如果这个链表为空,则表示用户未选择任何文件。

如果标志位(canPackage)为true,则表示可以进行打包。首先需要判断一下用户选择的打包方式,然后分别调用不同的打包函数。最后打包结束后,调用Close()方法关闭窗口。

需要注意的是这里用到的打包函数和第二篇教程里的那两个打包函数有点不一样了,为了适应新的参数,我们做了一点小小的改动,核心的部分没有任何变化,只是参数传入的方式变了,相信这是难不倒你的!

那儿到这里整个打包封装的过程就结束了,一些细枝末节和UI布局上的事大家根据自己的喜好做就好了,感谢大家的支持!

完结撒花✿✿ヽ(°▽°)ノ✿

实力封装:Unity打包AssetBundle(大结局)的更多相关文章

  1. 实力封装:Unity打包AssetBundle(一)

    说明:这是一系列循序渐进的教程,今天先介绍最简单的AssetBundle打包方式. 这是一个由在Unity中需要加载模型而引发出来的一系列坑,为了填坑花了不少时间,如果有需要在Unity中自定义菜单, ...

  2. 实力封装:Unity打包AssetBundle(四)

    →→前情提要:窗口初现←← 让用户选择要打包的文件 时至今日,我们选择打包文件的方式依然是在Project面板或Hierarchy面板中用鼠标点选.现在既然有了窗口,我们自然希望可以将所有文件罗列在窗 ...

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

    前情提要:第二种打包方式 窗口初现 通过前面的两篇教程和一篇番外,我们已经完全实现了打包的功能.但是使用起来总是觉得有些晦涩别扭,如果不告诉别人怎么使用,对方肯定是一头雾水. What?你给我的这是啥 ...

  4. 实力封装:Unity打包AssetBundle(二)

    →前情提要:Unity最基本的AssetBundle打包方式. 第二种打包方式 Unity提供的BuildAssetBundles API还有一个重载形式,看下面↓↓ public static As ...

  5. 实力封装:Unity打包AssetBundle(番外篇)

    前情提要:第二种打包方式. 自定义AssetBundle包扩展名 在之前的教程中,我们已经多次提到过扩展名了,并且也已经说明了如何设置自定义的AssetBundle扩展名.至于为什么还要把它单独拿出来 ...

  6. Unity手游之路<十一>资源打包Assetbundle

    http://blog.csdn.net/janeky/article/details/17652021 在手游的运营过程中,更新资源是比不可少的.资源管理第一步是资源打包.传统的打包可以将所有物件制 ...

  7. Unity 5.X扩展编辑器之打包assetbundle

    5.x的assetbundle与4.x以及之前的版本有些不同,不过本质是一样的,只不过5.x打包assetbundle更为简单和人性化了,总体来说只需要三个步骤: 第一步:创建打包资源 //这里是一个 ...

  8. Unity打包/读取AssetBundle资源全教程

    Unity 资源AssetBundle打包 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar ...

  9. 【Unity】AssetBundle的使用——打包/解包

    最近参考了各位大神的资源,初步学习了Unity的资源管理模式,包括在编辑器管理(使用AssetDatabase)和在运行时管理(使用Resources和AssetBundle).在此简单总结运行时用A ...

随机推荐

  1. Python制作AI贪吃蛇

    前提:本文实现AI贪吃蛇自行对战,加上人机对战,文章末尾附上源代码以及各位大佬的链接,还有一些实现步骤,读者可再次基础上自行添加电脑VS电脑和玩家VS玩家(其实把人机对战写完,这2个都没什么了,思路都 ...

  2. sql语句修改字段约束为不为空 并为其设置主键

    alter table Drc_Project_Review alter column ReviewID uniqueidentifier not nullalter table Drc_Projec ...

  3. Python:将数组中的元素导出到变量中 (unpacking)

    问题 你需要将数组(list)或元组(tuple)中的元素导出到N个变量中. 解决方案 任何序列都可以通过简单的变量赋值方式将其元素分配到对应的变量中,唯一的要求就是变量的数量和结构需要和序列中的结构 ...

  4. ABAP 中的搜索帮助

    ABAP 中的搜索帮助 https://blog.csdn.net/u011576750/article/details/50999078 一.简介:在abap中,用到的搜索帮助个人遇到的情况如下,进 ...

  5. 从实验室走向世界:HSP90抑制剂,一种新的癌症药物

    热休克蛋白90(HSP90)是细胞内一种普遍存在的.十分保守的以及有高度活性的蛋白质,它在肿瘤细胞内的含量要比正常细胞多.作为一种分子伴侣,HSP90协助不同种类的癌蛋白(即HSP90的服务蛋白)进行 ...

  6. 浅谈Overload和Override

    Overload是重载的意思,Override是覆盖的意思,也就是重写. 重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同). 重写Ove ...

  7. 调试.vs08

    1.vs2008 在调试的时候出现如下状况: 关键字:“不会命中断点.源代码与原始版本不同.”(ZC:我的情况是 main.cpp里面的断点是有效的,但是执行到另一个cpp里面时 这个文件里面的断点都 ...

  8. Spark面试相关

    Spark Core面试篇01 随着Spark技术在企业中应用越来越广泛,Spark成为大数据开发必须掌握的技能.前期分享了很多关于Spark的学习视频和文章,为了进一步巩固和掌握Spark,在原有s ...

  9. Asp.net core 学习笔记 ( Smtp and Razor template 电子邮件和 Razor 模板 )

    refer : https://dotnetcoretutorials.com/2017/08/20/sending-email-net-core-2-0/ https://ppolyzos.com/ ...

  10. port 执行命令的封装和参数详解

    下面代码摘自rebar_utils.erl -module(tt7). %-export([start/0]). -compile(export_all). -define(FAIL, abort() ...