上一章:【Unity3D技术文档翻译】第1.2篇 为打包 AssetBundles 准备资产

本章原文所在章节:【Unity Manual】→【Working in Unity】→【Advanced Development】→【AssetBundles】→【Building AssetBundles】

创建 AssetBundles

在【AssetBundles 工作流】一节中,我们使用了一个有3个参数的方法:BuildPipeline.BuildAssetBundles。这一节我们更深入一点,来了解这个方法的真正作用。

Assets/AssetBundles:这是一个目录,创建好的 AssetBundles 将输出到该目录下。你可以将该目录更改为任何你想要的目录,只要确保在创建 AssetBundles 前该目录真实存在。

BuildAssetBundleOptions

BuildAssetBundleOptions 有几个不同的选项可供选择,每个选项都有各自的效果。可以通过 BuildAssetBundleOptions 的 API 来浏览这些选项(截止2017.2版本共有12个属性选项)。

当项目需求改变或者增加时,你可以自由地改变或组合使用

BuildAssetBundleOptions 的不同选项。这里介绍3个涉及 AssetBundle 压缩方式的选项:

  • BuildAssetBundleOptions.None

这个选项使用 LZMA 算法压缩文件,把序列化数据文件压缩为一个 LZMA 流。如果使用了该算法,在使用 AssetBundle 内的资源前,需要将 AssetBundle 完全解压。这就导致了即便使用了尽可能小的文件,仍然需要长一些的加载时间。再次提醒:当使用

BuildAssetBundleOptions.None 选项时,想要使用任何 AssetBundle 中的资源,整个 AssetBundle 必须处于未压缩状态。

一旦 AssetBundle 被解压,它将再次被 LZ4 压缩算法压缩,并存储在磁盘中。与 LZMA 算法不同的是,使用 LZ4 算法压缩的 AssetBundle,不需要等待整个 AssetBundle 被解压,就可以使用其中的任何资源。这种算法最好的使用场景是:一个 AssetBundle 包含了很多资源,当我们获取并使用其中的某个资源后,其他资源也将被陆续加载。比如:打包一个角色或者一个场景的所有资源。

LZMA 压缩算法只被推荐用于从远程服务器下载的小文件,作为初始化之用。一旦文件被下载下来,它们就会被缓存为 LZ4 算法压缩的 AssetBundle。

(三思题外话:LZ4 压缩算法是 Unity 5.3 版本新增的压缩格式。LZMA 算法的压缩比更大,相应的解压时间更长;LZ4 算法的压缩比稍小,但是解压时间大幅缩短。因此除了上段推荐的“从远程服务器下载小文件用于初始化”,其他场景建议使用 LZ4 算法压缩 AssetBundle。使用 LZ4 算法压缩的选项在下面有介绍。)

  • BuildAssetBundleOptions.UncompressedAssetBundle

使用这个选项创建的 AssetBundle,其中的资源将完全不压缩。这会导致下载大文件时耗时较长,但是相应的,一旦下载完成,加载资源会很快。

  • BuildAssetBundleOptions. ChunkBasedCompression

这个选项使用 LZ4 算法压缩资源,和 LZMA 压缩算法相比,压缩后的 AssetBundle 更大,但是在使用其中资源的时候不需要整个 AssetBundle 被解压。LZ4 使用一种基于数据块的算法, AssetBundle 在被加载时,会被当成一片片“数据块”依次加载。因此当一片“数据块”被解压后,其中包含的资源就可被使用,就算 AssetBundle 中的其他“数据块”还没有被解压。

ChunkBasedCompression选项拥有与完全不压缩的 AssetBundle 相近的加载时间,同时降低了存储在磁盘上的大小。(这里可以看作是官方钦定了)

BuildTarget

BuildTarget.Standalone:这个参数是用来告诉“构建流水线”(build pipeline)我们想要在哪个平台使用这些 AssetBundles。你可以在 BuildTarget 的 API 引用中查看详细的选项列表。当然,如果你不愿意硬编码 BuildTarget ,你可以使用 EditorUserBuildSettings.activeBuildTarget ,它会根据你当前设置的编译平台,来自动找到对应的平台创建 AssetBundle。

一旦你正确建立了脚本,你就可以创建你的 AssetBundles 了。如果你按照上面的例子写脚本,点击 Assets > Build AssetBundles 就可以开始创建 AssetBundles。

现在你已经成功创建了你的 AssetBundles,你可能注意到你的 AssetBundles 目录下比你预期的要多了其他的文件。准确的说,一共有 2*(n+1) 个多出来的其他文件。让我们来花点时间,更准确地复习一下 BuildPipeline.BuildAssetBundles 字段。

对于编辑器中的每个 AssetBundle,你将会注意到一个以该 AssetBundle 名称命名、以“.manifest”为后缀的文件。

另外还有一个额外的 bundle,并且 manifest 的名字没有和任何一个你创建的 AssetBundle 同名。它实际上是以所在的目录命名(即 AssetBundles 被创建到的目录)。这就是 Manifest Bundle。我们将讨论更多关于 Manifest Bundle 以及如何使用的内容。

AssetBundle 文件

这是指没有 “.manifest” 后缀名的文件,我们将在运行时加载它,并获取利用其中的资源。

AssetBundle 文件是一个包含了多种多样文件的归档(压缩)文件。归档的结构会有轻微的变化,这取决于它是一个普通的 AssetBundle 还是一个场景的

AssetBundle。下面是一个普通 AssetBundle 的结构图:

场景的 AssetBundle 和普通 AssetBundle 的结构有轻微不同,是因为场景数据流的加载和它所包含的内容都有所优化。下面是一个场景 AssetBundle 的结构图:(然而官方手册并没有给图片...)

Manifest 文件

对于每个生成的 AssetBundle,包括额外的 Manifest Bundle,都会有个相关联的 manifest 文件同时生成。manifest 文件可以被任何文本编辑器打开,里面包含了 AssetBundle 相关的一些信息,比如循环冗余检查(CRC:cyclic redundancy check)以及其他依赖数据。普通 AssetBundle 的 manifest 文件内容看起来像是下面的样子:

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 的联系性以及它们的依赖。目前,只需要知道它包含了 AssetBundleManifest 对象,该对象对在运行时加载哪个依赖的 AssetBundle 有显著帮助。想要学习了解更多关于如何使用 AssetBundle 和 manifest 对象的内容,可查看【本地使用 AssetBundles】一节。

如果本文对你有帮助的话,点个赞或者评论一下吧!

【Unity3D技术文档翻译】第1.3篇 创建 AssetBundles的更多相关文章

  1. 【Unity3D技术文档翻译】第1.8篇 AssetBundles 问题及解决方法

    上一章:[Unity3D技术文档翻译]第1.7篇 AssetBundles 补丁更新 本章原文所在章节:[Unity Manual]→[Working in Unity]→[Advanced Deve ...

  2. 【Unity3D技术文档翻译】第1.9篇 使用 Unity AssetBundle Browser tool (AssetBundle系列完结)

    上一章:[Unity3D技术文档翻译]第1.8篇 AssetBundles 问题及解决方法 本章原文所在章节:[Unity Manual]→[Working in Unity]→[Advanced D ...

  3. 【Unity3D技术文档翻译】第1.6篇 使用 AssetBundle Manager

    上一章:[Unity3D技术文档翻译]第1.5篇 使用 AssetBundles 本章原文所在章节:[Unity Manual]→[Working in Unity]→[Advanced Develo ...

  4. 【Unity3D技术文档翻译】第1.4篇 AssetBundle 依赖关系

    上一章:[Unity3D技术文档翻译]第1.3篇 创建 AssetBundles 本章原文所在章节:[Unity Manual]→[Working in Unity]→[Advanced Develo ...

  5. 【Unity3D技术文档翻译】第1.5篇 本地使用 AssetBundles

    上一章:[Unity3D技术文档翻译]第1.4篇 AssetBundle 依赖关系 本章原文所在章节:[Unity Manual]→[Working in Unity]→[Advanced Devel ...

  6. 【Unity3D技术文档翻译】第1.7篇 AssetBundles 补丁更新

    上一章:[Unity3D技术文档翻译]第1.6篇 使用 AssetBundle Manager 本章原文所在章节:[Unity Manual]→[Working in Unity]→[Advanced ...

  7. 【Unity3D技术文档翻译】第1.2篇 为打包 AssetBundles 准备资产

    本章原文所在章节:[Unity Manual]→[Working in Unity]→[Advanced Development]→[AssetBundles]→[Preparing Assets f ...

  8. 【Unity3D技术文档翻译】第1.1篇 AssetBundle 工作流

    译者前言:本章是关于从创建到加载,再到使用 AssetBundle 的整个流程的概述.阅读本章将对 AssetBundle 的工作流程有个简单而全面的了解. 本章原文所在章节:[Unity Manua ...

  9. 【Unity3D技术文档翻译】第1.0篇 AssetBundles

    前言 "Unity圣典"是目前对官方文档翻译比较详细的,然而文档的最新更新日期是2013年,已经远远落后最新版本,参考意义有限.官方文档.脚本手册是学习Unity3D最直接有效的途 ...

随机推荐

  1. hasResultError

    hasResultError 的作用是 让返回的对象可以报错误信息.

  2. Codeforces 448 E. Divisors (DFS,储存结构)

    题目链接:E. Divisors 题意: 给出一个X,f(X)是X所有约数的数列(例6:1 2 3 6),给出一个k,k是递归的次数(例:k=2 : f(f(X)) ; X=4,k=2: 1 1 2 ...

  3. beetl 配置多视图解析器

    如下配置,指定了三个视图解析器,一个用于beetl页面渲染,一个用于cms,采用了beetl技术,另外一个一些遗留的页面采用jsp <bean name="beetlConfig&qu ...

  4. Django实现组合搜索

    一.实现方法 1.纯模板语言实现 2.自定义simpletag实现(本质是简化了纯模板语言的判断) 二.基本原理 原理都是通过django路由系统,匹配url筛选条件,将筛选条件作为数据库查询结果,返 ...

  5. ScrollView(RecyclerView等)为什么会自动滚动原理分析,还有阻止自动滑动的解决方案

    引言,有一天我在调试一个界面,xml布局里面包含Scroll View,里面嵌套了recyclerView的时候,界面一进去,就自动滚动到了recyclerView的那部分,百思不得其解,上网查了好多 ...

  6. 006-接收键盘的输入(read)

    read  -ptns   变量名 -p 在等待read输入的时候,显示的提示信息 -t 秒数,read等待用户输入的时间 -n read接收用户输入的字符数,只接收指定字符数,就会执行 -s 隐藏输 ...

  7. arduino笔记

    接下来,初来博客,准备自己也写一系列的arduino的学习经验. http://zhongbest.com/2017/05/23/arduino%e4%b8%ad%e7%9a%84%e4%b8%ad% ...

  8. x64内核HOOK技术之拦截进程.拦截线程.拦截模块

    x64内核HOOK技术之拦截进程.拦截线程.拦截模块 一丶为什么讲解HOOK技术. 在32系统下, 例如我们要HOOK SSDT表,那么直接讲CR0的内存保护属性去掉. 直接讲表的地址修改即可. 但是 ...

  9. Netty初探

    匠心零度 转载请注明原创出处,谢谢! 说在前面 为什么我们需要学习netty?谈谈自己的看法,由于本人水平有限,如果有那里不对,希望各位大佬积极指出,欢迎在留言区进行评论交流.探讨. 由于移动互联网的 ...

  10. Linux下安装mysql(yum和源码编译两种方式)

    这里介绍Linux下两种安装mysql的方式:yum安装和源码编译安装. 1. yum安装 (1)首先查看centos自带的mysql是否被安装: # yum list installed |grep ...