实力封装: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 ...
随机推荐
- 20170921xlVBA_SQL蒸发循环查询2
'ARRAY("1991","1992","1993","1994","1996","19 ...
- (GoRails)链接link_to到当前页current Page 并使用参数 (类ActionController::Parameters)
https://gorails.com/episodes/rails-link-to-current-page-with-params?autoplay=1 如何链接到当前页并增加,移除,或者修改UR ...
- DRF之接口文档以及Xadmin
1. 自动生成接口文档 REST framework可以自动帮助我们生成接口文档. 接口文档以网页的方式呈现. 自动接口文档能生成的是继承自APIView及其子类的视图. 1.1. 安装依赖 REST ...
- phpmyadmin getshell
执行SQL语句:SET GLOBAL general_log = ON
- (一)从设计的角度来看ADT(Java)
<数据结构与抽象——Java语言描述>第一章学习笔记 感想:以前学数据结构关注于方法及实现,为了完成作业和手写代码,没有从设计层面考虑过,第一章设计一个bag ADT,借助于Java in ...
- Convert PIL Image to byte array?
1.import io img = Image.open(fh, mode='r') roiImg = img.crop(box) imgByteArr = io.BytesIO() roiImg.s ...
- 推荐系统评测指标—准确率(Precision)、召回率(Recall)、F值(F-Measure)
下面简单列举几种常用的推荐系统评测指标: 1.准确率与召回率(Precision & Recall) 准确率和召回率是广泛用于信息检索和统计学分类领域的两个度量值,用来评价结果的质量.其中精度 ...
- vs 2017 Integrated Security 为sspi 含义
关于sql连接语句中的Integrated Security=SSPI解决方法:即:Security Support Provider Interface设置Integrated Security为 ...
- ECharts饼状图添加事件
和柱状图添加事件没有区别,详情如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content ...
- 利用ML&AI判定未知恶意程序——里面提到ssl恶意加密流检测使用N个payload CNN + 字节分布包长等特征综合判定
利用ML&AI判定未知恶意程序 导语:0x01.前言 在上一篇ML&AI如何在云态势感知产品中落地中介绍了,为什么我们要预测未知恶意程序,传统的安全产品已经无法满足现有的安全态势.那么 ...