实力封装:Unity打包AssetBundle(一)
说明:这是一系列循序渐进的教程,今天先介绍最简单的AssetBundle打包方式。
这是一个由在Unity中需要加载模型而引发出来的一系列坑,为了填坑花了不少时间,如果有需要在Unity中自定义菜单,或者创建窗口,扩展编辑器,特别是有需要打包AssetBundle包的筒子们,请看过来←_←
在Unity中载入模型最简单的方式是直接将模型文件放到工程目录下,然后拖进场景中。但是如果我们需要在程序运行时将网络或任意目录下的模型加载到场景中,那么我们只能自己编写解析模型文件的脚本。因为Unity并没有提供加载模型的API,也可能是没有开放给用户。这个过程很痛苦,而且总是有意想不到的错误,模型格式也千奇百怪。Unity自己的格式是.prefab文件,也就是预制体,使用方便,也不会出错,因为所有资源都打包在了一起。但问题是Unity加载Prefab的API只有两个,一是Resource.Load,需要将prefab文件放在Resource目录下;二是AssetDatabase.LoadAssetAtPath,文件必须在Assets目录下。这就意味着网络上和其他文件夹下的prefab是无法加载的。
幸好,还有AssetBundle可以用,我们可以通过WWW加载AssetBundle,这样就没有文件路径的限制了。
那么接下来的 问题就是如何打包AssetBundle了,在Unity5之前,可以通过BuildPipeline.BuildAssetBundle这个API来打AssetBundle包。但是很不幸,在Unity5之后,这个API就被废弃了。Unity提供了一个新的API来打AssetBundle包。
public static AssetBundleManifest BuildAssetBundles(string outputPath, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform);
要使用这个API打包还得费一番周折。首先要在你的工程中创建一个Editor文件夹(如果没有的话),然后在Editor文件下新建一个脚本,名字自己定。然后输入如下代码:
- [MenuItem("AssetBundle/Package (Default)")]
- private static void PackageBuddle() {
- Debug.Log("Packaging AssetBundle...");
- string packagePath = UnityEditor.EditorUtility.OpenFolderPanel ("Select Package Path", "F:/", "");
- if (packagePath.Length <= 0 || !Directory.Exists (packagePath))
- return;
- Debug.Log ("Output Path: " + packagePath);
- BuildPipeline.BuildAssetBundles (packagePath, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
- AssetDatabase.Refresh ();
- }
保存后切换到Unity,你就会看到你的Unity跟以前不一样了。在菜单栏多了一个叫做AssetBundle的菜单,点开这个菜单,还有一个叫Package (Default)的子菜单,就是这么神奇。点击Package (Default)菜单,就会运行上面我们写的PackageBundle函数了。不信你看Console窗口,已经有东西打印出来了。
说明一下:
第一,这个脚本必须放在Editor文件夹下才会有效;
第二,使用[MenuItem("AssetBundle/Package (Default)")]创建菜单时,必须有子菜单,否则主菜单会被忽略,不会创建。
第三,UnityEditor.EditorUtility.OpenFolderPanel这个API会弹出一个文件夹选择窗口,返回你选择的路径。要注意BuildAssetBundles打包时不会创建文件夹,也就是说你必须保证你带入的路径是存在的,否则就会出错。
现在打Asset包的功能就写好了,下面的问题是怎么用?
首先,点击某个prefab文件,看图↓
在Inspector面板的最下面有个预览区域,就是在这里设置哪些文件需要打包的。
AssetBundle后面有个下拉按钮,点击一下,看下图↓
点击new,输入名字,这就是这个文件打包后的名字,后面第二个None是后缀名,可以不用填,但是如果填的话也要注意好像不是任意字符串都行的。这也就是说AssetBundle包是没有固定后缀名的,你可以输入任何后缀名,也可以没有后缀名,都能打包成功,也能正确加载。
说明:
只有AssetBundle后面名字不能None的文件才会被BuildAssetBundles函数打包,为None的都不会打包。
当看到BuildAssetBundles函数时,我也一脸懵逼,参数中居然没有可以输入要打包文件的地方??其实Unity是把这个参数移到Inspector面板中了,在调用BuildAssetBundles函数时,只要Inspector面板中设置了AssertBundle名字的文件都会被打包。
设置完成以后,点击菜单AssetBundle→Package (Default),你会看到出现了一个现实进度的窗口,这就是Unity正在打包文件。
去你选择的文件夹下,你可以看到多了四个文件,AssetBundle包已经打包好了,下面解释下这四个文件,看图↓
我是将它们打包在ksvk_prefab文件夹下,ksvk_prefab和ksvk_prefab.manifest是和文件夹相关的,没啥用;ksvk_prefab.assetbundle和ksvk_prefab.assetbundle.manifest是我选择的文件打出的包,加载的时候直接加载ksvk_prefab.manifest文件就行了。.manifest是清单文件,里面记录了循环冗余校验(CRC)数据和捆绑文件的依赖信息等。
今天的教程就到这里了,这才是刚刚开始,后面才是高能开启。
实力封装:Unity打包AssetBundle(一)的更多相关文章
- 实力封装:Unity打包AssetBundle(大结局)
→→前情提要:让用户选择要打包的文件←← 大结局:更多选择 Unity打包AssetBundle从入门到放弃系列终于要迎来大结局了[小哥哥表示实在写不动了o(╥﹏╥)o]... 经过上一次的教程,其实 ...
- 实力封装:Unity打包AssetBundle(三)
前情提要:第二种打包方式 窗口初现 通过前面的两篇教程和一篇番外,我们已经完全实现了打包的功能.但是使用起来总是觉得有些晦涩别扭,如果不告诉别人怎么使用,对方肯定是一头雾水. What?你给我的这是啥 ...
- 实力封装:Unity打包AssetBundle(二)
→前情提要:Unity最基本的AssetBundle打包方式. 第二种打包方式 Unity提供的BuildAssetBundles API还有一个重载形式,看下面↓↓ public static As ...
- 实力封装:Unity打包AssetBundle(四)
→→前情提要:窗口初现←← 让用户选择要打包的文件 时至今日,我们选择打包文件的方式依然是在Project面板或Hierarchy面板中用鼠标点选.现在既然有了窗口,我们自然希望可以将所有文件罗列在窗 ...
- 实力封装:Unity打包AssetBundle(番外篇)
前情提要:第二种打包方式. 自定义AssetBundle包扩展名 在之前的教程中,我们已经多次提到过扩展名了,并且也已经说明了如何设置自定义的AssetBundle扩展名.至于为什么还要把它单独拿出来 ...
- Unity手游之路<十一>资源打包Assetbundle
http://blog.csdn.net/janeky/article/details/17652021 在手游的运营过程中,更新资源是比不可少的.资源管理第一步是资源打包.传统的打包可以将所有物件制 ...
- Unity 5.X扩展编辑器之打包assetbundle
5.x的assetbundle与4.x以及之前的版本有些不同,不过本质是一样的,只不过5.x打包assetbundle更为简单和人性化了,总体来说只需要三个步骤: 第一步:创建打包资源 //这里是一个 ...
- Unity打包/读取AssetBundle资源全教程
Unity 资源AssetBundle打包 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar ...
- 【Unity】AssetBundle的使用——打包/解包
最近参考了各位大神的资源,初步学习了Unity的资源管理模式,包括在编辑器管理(使用AssetDatabase)和在运行时管理(使用Resources和AssetBundle).在此简单总结运行时用A ...
随机推荐
- LeetCode--006--Z字型变换(java)
将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I R E T ...
- python基础之生成器,生成器函数,列表推导式
内容梗概: 1. 生成器和生成器函数. 2. 列表推导式. 1.生成器函数1.1 生成器函数. 就是把return换成yield def gen(): print("爽歪歪") y ...
- implode
$names = implode('|', array_column($categoryBackNameArr, 'name'));
- 【MySQL】【1】表中存在重复记录,删除保留其中一条
--删除题库(TABLE_Q )中,标题(TITLE )和类型(TYPE )都相同的数据,仅保留ID最小的一条 DELETE TABLE_Q FROM TABLE_Q, ( ) T2 WHERE TA ...
- python BeautifulSoup 介绍--安装
Python中,专门用于HTML/XML解析的库: 特点是: 即使是有bug,有问题的html代码,也可以解析. BeautifulSoup主要有两个版本 BeautifulSoup 3 之前的,比较 ...
- Oracle 11.2.0.4.0 Dataguard部署和日常维护(4)-Datauard Gap事件解决篇
Oracle dataguard主库删除备库需要的归档时,会导致gap事情的产生,或者备库由于网络或物理故障原因,倒是备库远远落后于主库,都会产生gap事件,本例模拟gap事件的产生以及处理. 1. ...
- ECharts 报表事件联动系列二:柱状图,饼状图添加事件
代码如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...
- 《高性能SQL调优精要与案例解析》一书谈SQL调优(SQL TUNING或SQL优化)学习
<高性能SQL调优精要与案例解析>一书上市发售以来,很多热心读者就该书内容及一些具体问题提出了疑问,因读者众多外加本人日常工作的繁忙 ,在这里就SQL调优学习进行讨论并对热点问题统一作答. ...
- PyCharm+QTDesigner+PyUIC使用教程
我们在PyCharm安装配置Qt Designer+PyUIC教程中已配置好了PyCharm+QTDesigner+PyUIC环境 这里在此基上我们演示如何使用这些工具,编写一个图形界面程序: 程序主 ...
- openssl安装/更新教程(CentOS)
1.下载openssl 下载链接:https://www.openssl.org/source/snapshot/ 里边是当前仍支持版本的快照:同版本不同日期内容可能不同的,所以下载一般下对应版本的最 ...