之前的“AssetBundle 工作流程”小节介绍了如何使用 BuildPipeline.BuildAssetBundles 构建 AssetBundle。该 API 调用会将构建过程的结果写入指定的输出目录,包括 AssetBundle 文件和每个 AssetBundle 的 .manifest 文件。本节介绍构建过程编写的文件的详细信息。
这是缺少 .manifest 扩展名的文件,其中包含在运行时为了加载资源而需要加载的内容。
AssetBundle 文件是一个存档,在内部包含多个文件。这是普通 AssetBundle 的示例结构:
主文件使用 Unity 的二进制 SerializedFile 格式。它包含 AssetBundle 对象,以及 AssetBundle 中包含(显式或隐式)的所有资源中的对象。所有音频、视频内容都将存储在 .resource 文件中,所有纹理数据都将存储在 .resS 文件中。
场景 AssetBundle 中的内容类似,但优化了单个场景的流加载。每个场景将包含两个 SerializedFile。
对于生成的每个 AssetBundle(包括额外的 Manifest Bundle),都会生成关联的清单文件。清单文件的扩展名为 .manifest,可使用任何文本编辑器打开。清单文件中包含循环冗余校验 (CRC) 数据和捆绑包的依赖项数据等信息。普通 AssetBundle 的清单文件将如下所示:
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: {}
其中显示了包含的资源、依赖项和其他信息。
该构建还生成了两个额外的文件。
第一个文件是小型 AssetBundle,以所在目录(即之前构建了 AssetBundle 的地方)命名。此文件名为 Manifest Bundle,其中包含 AssetBundleManifest 对象,该对象可用于指明要在运行时加载的捆绑包依赖项。要详细了解如何使用此捆绑包和清单对象,请参阅关于本机使用 AssetBundle 的文档。
此外还会为 Manifest Bundle 生成 .manifest 文件。内容如下所示:
ManifestFileVersion: 0
AssetBundleManifest:
AssetBundleInfos:
Info_0:
Name: scene1assetbundle
Dependencies: {}
Manifest Bundle 的 .manifest 文件将记录 AssetBundle 具有的关联性及依赖项。这类似于 AssetBundleManifest 对象在 Manifest Bundle 内记录的信息,并且因为是文本文件,所以便于人类阅读和外部工具解析。该 .manifest 文件很重要,可以针对在 AssetBundle 中使用的类型(如果运行版本中的内容没有使用这些类型)防止代码剥离 (code stripping)。如果在 Player Settings 中启用了代码剥离,则应在执行运行版本时通过设置 BuildPlayerOptions.assetBundleManifestPath 来传递此清单的路径。有关代码剥离的更多信息,请参阅分发大小和代码剥离。
注意:使用 Addressables 包而不是 BuildPipeline.BuildAssetBundles 进行构建时,会写入相同格式的 AssetBundle 文件,但没有清单文件,也不会生成 Manifest Bundle。请参阅 Addressables 文档,了解更多详细信息。