构建AssetBundles

AssetBundle工作流程的文档中,我们有一个示例代码,它将三个参数传递给BuildPipeline.BuildAssetBundles函数。让我们更深入地了解我们实际上在说什么。

Assets/AssetBundles:这是AssetBundles将被输出到的目录。您可以将其更改为所需的任何输出目录,只需在尝试构建之前确保文件夹实际存在。

BuildAssetBundleOptions

有多种不同的BuildAssetBundleOptions选项可以选择。相关的各个选项可以参阅脚本API文档中的关于BuildAssetBundleOptions的内容。

虽然随着需求的变化和增加,您可以自由组合BuildAssetBundleOptions选项,但有三个特定的BuildAssetBundleOptions是用来处理AssetBundle压缩:

  • BuildAssetBundleOptions.None:此bundle选项使用LZMA格式压缩,这种压缩是序列化的数据文件的单一压缩的LZMA流。 LZMA压缩的文件在使用前需要对整个bundle解压缩。这导致最小的文件大小和由于解压缩而稍微增加的加载时间。值得注意的是,当使用此BuildAssetBundleOptions时,为了使用捆绑包中的任何资源,必须首先解压缩整个捆绑包。一旦bundle解压缩后,将使用LZ4在磁盘上重新压缩,LZ4压缩在使用bundle中的资产时,不需要提前对整个bundle进行解压缩。这最适合用于bundle中的资产,以便从bundle中使用一个资产将意味着所有资产将被加载。打包角色或场景的所有资源都是可能使用的捆绑包的一些示例。由于较小的初始文件大小,利用LZMA压缩仅推荐用于从异地主机下载资源包。一旦文件被下载,它会缓存为lz4压缩包。
  • BuildAssetBundleOptions.UncompressedAssetBundle: 此bundle选项以数据完全未压缩的方式构建bundle。未压缩的缺点是较大的文件下载大小。但是,一旦下载的加载时间会更快。
  • BuildAssetBundleOptions.ChunkBasedCompression: 此bundle选项使用称为LZ4的压缩方法,这导致比LZMA更大的压缩文件大小,但不像LZMA那样在使用之前不需要整个捆绑包解压缩。 LZ4使用基于块的算法,允许将AssetBundle以切片(pieces)或“块”(chunks)的形式加载。解压缩单个块允许使用包含的资产,即使AssetBundle的其他块未被解压缩。

使用ChunkBasedCompression与未压缩的bundle具有可比较的加载时间,还具有减小磁盘大小的附加优势。

BuildTarget

BuildTarget.Standalone: 在这里,我们正在告诉构建管道,我们将使用这些AssetBundles的目标平台。

您可以在BuildTarget的API的脚本参考文档中找到可用的显式构建目标的列表。但是,如果您不希望在构建目标中进行硬编码,则可以随时利用EditorUserBuildSettings.activeBuildTarget,这将自动找到你目前的设置构建和构建AssetBundles基于的目标 平台。

一旦正确设置了构建脚本,就可以构建bundles了。如果您按照上述脚本示例,请单击Assets > Build AssetBundles以启动该过程。

现在你已经成功构建了AssetBundles,你可能会注意到你的AssetBundles目录有可能比你预期更多的文件。确切地说,是2 *(n + 1)个文件。让我们花一点时间来看看BuildPipeline.BuildAssetBundles的产量。

对于你在编辑器中指定的每个AssetBundle,你将注意到一个包含AssetBundle nameAssetBundle name +.manifest的文件。

将会有一个额外的bundle和manifest,它不会与您创建的任何AssetBundle共享一个名称。而是以它位于的目录(AssetBundles构建到的目录)命名。这是Manifest Bundle。我们将在以后讨论更多的内容以及如何使用它。

The AssetBundle File

这是缺少.manifest扩展名的文件,以及你在运行时加载的内容,以加载你的资产。

AssetBundle文件是一个在内部包含多个文件的存档。此存档的结构可能会稍有变化,具体取决于它是AssetBundle还是场景AssetBundle。这是一个正常的AssetBundle的结构:

场景AssetBundle更改自标准的AssetBundles,因为它针对场景及其内容的流加载进行了优化。该图像显示场景bundle的内部结构:

The Manifest File

对于生成的每个包,包括附加的清单包,都会生成关联的清单文件。清单文件可以使用任何文本编辑器打开,并且包含诸如循环冗余校验(CRC)数据和包的依赖性数据的信息。对于正常的AssetBundles,他们的清单文件将如下所示:

ManifestFileVersion: 0
CRC: 2422268106
Hashes:
AssetFileHash:
serializedVersion: 2
Hash: 8b6db55a2344f068cf8a9be0a662ba15
TypeTreeHash:
serializedVersion: 2
Hash: 37ad974993dbaa77485dd2a0c38f347a
HashAppended: 0
ClassTypes:
- Class: 91
Script: {instanceID: 0}
Assets:
Asset_0: Assets/Mecanim/StateMachine.controller
Dependencies: {} Which shows the contained assets, dependencies, and other information. The Manifest Bundle that was generated will have a manifest, but it’ll look more like this: ManifestFileVersion: 0
AssetBundleManifest:
AssetBundleInfos:
Info_0:
Name: scene1assetbundle
Dependencies: {}

这将显示AssetBundles如何关联以及它们的依赖关系。现在,只要明白这个bundle包含了AssetBundleManifest对象,这对于找出在运行时加载哪个bundle依赖是非常有用的。要了解有关如何使用此bundle和manifest对象的更多信息,请参阅使用本地AssetBundles的文档。

原文链接:

Building AssetBundles


同系列文章

「翻译」Unity中的AssetBundle详解(一)

「翻译」Unity中的AssetBundle详解(二)

「翻译」Unity中的AssetBundle详解(三)

「翻译」Unity中的AssetBundle详解(四)


本文作者: Sheh伟伟

本文链接: http://davidsheh.github.io/2017/08/21/「翻译」Unity中的AssetBundle详解(三)/

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!

[翻译]Unity中的AssetBundle详解(三)的更多相关文章

  1. 「翻译」Unity中的AssetBundle详解(二)

    为AssetBundles准备资源 使用AssetBundles时,您可以随意将任何Asset分配给所需的任何Bundle.但是,在设置Bundles时,需要考虑一些策略.这些分组策略可以使用到任何你 ...

  2. 「翻译」Unity中的AssetBundle详解(一)

    AssetBundles AssetBundle是一个存档文件,其中包含平台在运行时加载的特定资产(模型,纹理,预制,音频剪辑,甚至整个场景).AssetBundles可以表示彼此之间的依赖关系;例如 ...

  3. Android中Intent组件详解

    Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件.Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙 ...

  4. scons用户指南翻译(附gcc/g++参数详解)

    scons用户指南 翻译 http://blog.csdn.net/andyelvis/article/category/948141 官网文档 http://www.scons.org/docume ...

  5. ArcGIS Engine中的Symbols详解

    转自原文ArcGIS Engine中的Symbols详解 本文由本人翻译ESRI官方帮助文档.尊重劳动成果,转载请注明来源. Symbols ArcObjects用了三种类型的Symbol(符号样式) ...

  6. js插件---videojs中文文档详解

    js插件---videojs中文文档详解 一.总结 一句话总结: js插件网上都有很多参考资料,使用起来也非常简单 二.lavarel中使用实例 <video id="example_ ...

  7. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  8. 【转载】C/C++中extern关键字详解

    1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...

  9. oracle中imp命令详解 .

    转自http://www.cnblogs.com/songdavid/articles/2435439.html oracle中imp命令详解 Oracle的导入实用程序(Import utility ...

随机推荐

  1. Selenium+Chrome+PhantomJS 爬取淘宝

    https://github.com/factsbenchmarks/taobao-jingdong 一 简单铺垫 Selenium负责驱动浏览器与python对接 PhantomJS负责渲染解析Ja ...

  2. TYVJ4623 球球大作战·生存

    时间: 500ms / 空间: 65536KiB / Java类名: Main 背景 小天很喜欢玩球球大作战这个游戏,大家也应该都玩过.游戏规则是:移动自己的球,移动到别人的球(一定要比自己的球小)的 ...

  3. Codeforces 432D Prefixes and Suffixes kmp

    手动转田神的大作:http://blog.csdn.net/tc_to_top/article/details/38793973 D. Prefixes and Suffixes time limit ...

  4. Laravel 5.1的多路由文件的配置

    Laravel 5.1的多路由文件的配置 默认的路由配置文件只有一个,\app\Http\routes.php.在同一个文件中写路由容易起冲突,文件会越来越大,就需要定义多个路由文件.找到加载\app ...

  5. 2018 ICPC 沈阳网络预赛 Fantastic Graph (优先队列)

    [传送门]https://nanti.jisuanke.com/t/31447 [题目大意]:有一个二分图,问能不能找到它的一个子图,使得这个子图中所有点的度数在区间[L,R]之内. [题解]首先我们 ...

  6. Java8 本地DateTime API

    原文:http://www.yiibai.com/java8/java8_localdateapi.html 使用Java8,新的日期时间API引入覆盖旧的日期时间API的以下缺点. 非线程安全 - ...

  7. 转: Code Review 程序员的寄望与哀伤

    转自: http://www.cnblogs.com/mindwind/p/5639008.html 一个程序员,他写完了代码,在测试环境通过了测试,然后他把它发布到了线上生产环境,但很快就发现在生产 ...

  8. Android锁屏或灭屏状态下,高速按两次音量下键实现抓拍功能(1.2Framework层使用startService形式实现)

        如前一篇博文所分析.我们能够使用广播的形式在高速按下两次音量下键的时候发出广播,以方便client进行捕捉. 既然有两种方式能够实现该Issue那么哪种方式是首选呢?     我个人推荐使用启 ...

  9. 【C#】高级语言特有的单例模式

    public class Singleton { private Singleton () { } // 变量标记为 readonly.第一次引用类的成员或创建实例时,仅仅实例化一次instance对 ...

  10. 【转载】一分钟了解两阶段提交2PC(运营MM也懂了)

    上一期分享了"一分钟了解mongoDB"[回复"mongo"阅读],本期将分享分布式事务的一种实现方式2PC. 一.概念 二阶段提交2PC(Two phase ...