Version: 6000.3
语言: 中文
使用 AssetBundles 在运行时加载资产
创建资产包

AssetBundles简介

AssetBundle 是一个存档文件,可用于将资产组合在一起以创建可下载内容 (DLC),或减小应用程序的初始安装大小。您还可以使用AssetBundles加载优化的特定于平台的资产,或在运行时降低内存使用量。

AssetBundle 可以包含特定于平台的非代码资源,例如模型、纹理、预制件一种资产类型,允许您存储包含组件和属性的游戏对象。预制件充当模板,你可以从中在场景中创建新的对象实例。更多信息
请参阅术语表
,音频剪辑Unity 中音频数据的容器。Unity 支持单声道、立体声和多声道音频资产(最多 8 个声道)。Unity 可以导入 .aif、.wav、.mp3 和 .ogg 音频文件格式,以及 .xm、.mod、.it 和 .s3m 跟踪器模块格式。更多信息
请参阅术语表
或整个场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,你放置你的环境、障碍物和装饰品,基本上是将你的游戏设计和构建成碎片。更多信息
请参阅术语表
然后 Unity 在运行时加载。AssetBundle 是特定于平台的,因为 Unity 将资产数据构建为基于BuildTarget您选择构建配置文件目标平台创建构建时使用的一组可自定义配置设置。更多信息
请参阅术语表
.例如,为 iOS 构建的 AssetBundle 与 Android 不兼容。

您还可以使用 LZMA 或 LZ4 压缩 AssetBundle,以有效地分发存档。

要构建和定义 AssetBundle,您可以使用高级 Addressables 包,它提供了一种从 Unity 编辑器定义和构建 AssetBundle 的方法。如果您更喜欢低级 API 控制,可以使用BuildPipeline.BuildAssetBundles,AssetBundleUnityWebRequestAssetBundle原生 API。

使用AssetBundle的原因

使用 AssetBundles 有助于内容分发和优化应用程序的性能。以下是使用 AssetBundle 系统的好处:

  • 动态内容交付:您可以使用 AssetBundles 按需加载资产,这对于具有可下载内容 (DLC)、剧集更新或实时服务模型的游戏特别有用。它还有助于有效管理内存,确保仅将应用程序所需的资产加载到内存中。
  • 减小构建大小:将资产移动到 AssetBundles 可以减小初始应用程序构建大小,这对于具有严格大小限制的移动游戏或平台非常重要。
  • 平台兼容性:您可以为不同的平台创建 AssetBundle,从而减少在应用程序构建中包含特定于平台的资产的需要。

如果你想优化资产加载,例如仅流送角色位置附近的内容、仅加载相关的本地化内容或在后台加载资产,则资产包非常有用。但是,AssetBundle 系统提供低级资产管理,因此您可能需要考虑使用 Addressables 包,它提供了管理项目中 AssetBundle 的更高级别方法。

如果您正在进行原型设计,或者有一个特别小的项目,您可能需要考虑使用资源系统

AssetBundle 的结构

AssetBundle 是一种容器文件格式,类似于 zip 文件。它在二进制格式标头中包含以下文件类型:

  • 序列化文件:包含序列化的 Unity 对象。这与播放器构建中使用的二进制文件格式相同。输出取决于 AssetBundle 包含的内容:
    • 仅资产:Unity 创建一个序列化文件。
    • 仅场景:Unity 为每个场景创建两个序列化文件。一个文件包含场景层次结构中的对象,第二个文件包含任何引用的对象。
  • 资源文件:包含为某些资产(如纹理和音频)单独存储的二进制数据块。这种分离允许 Unity 使用多线程代码有效地从磁盘加载资产。

AssetBundle 文件始终包含序列化的AssetBundle对象,它的作用类似于 AssetBundle 内容的目录。您可以使用AssetBundle实例,从代码中的特定 AssetBundle 存档加载资产。

Unity 版本之间的 AssetBundle 支持

您使用旧版本的 Unity 创建的任何 AssetBundle 通常都与较新版本的 Unity 兼容。但是,如果版本之间存在较大更改,Unity 可能无法加载数据,您必须使用较新版本的 Unity 重新构建 AssetBundle。

Unity 不支持 AssetBundle 的向前兼容性,因此您无法将使用较新版本的 Unity 构建的 AssetBundle 加载到较旧版本的 Unity 中。

Unity 根据 Unity 版本和创建过程中存在的 C# 类型序列化 AssetBundle。Unity 将信息存储在类型树结构中,并在从不同版本的 Unity 编辑器加载对象时使用此信息。

提示:默认情况下,Unity 在 AssetBundle 标头中包含用于构建 AssetBundle 的 Unity 编辑器版本。此信息可能会导致不必要地重建资产包。为避免这种情况,您可以从标头中排除编辑器版本。有关更多信息,请参阅BuildAssetBundleOptions.AssetBundleStripUnityVersion.

脚本支持

AssetBundle 不能包含程序集,因此不能使用它们来分发新的 C# 类或对现有类的更改。但是,您可以使用 AssetBundle 来分发预编译的对象实例,例如ScriptableObject资产。

Unity 根据对象的程序集、命名空间和类名称匹配对象。然后,它创建一个对象,该对象是该类的实例,使用序列化值来设置对象的字段。它使用类型树中存储的信息来调整不同版本的 Unity 的字段映射。

Unity 使用代码中的条件编译信息来确定要包含在 AssetBundle 中的字段。如果字段的编译已设置为条件,则使用#if指令,并且关联的符号未在 AssetBundle 构建时定义,则 Unity 不会在 AssetBundle 中包含该字段。

例如,在以下代码片段中,always字段无条件地包含在 AssetBundle 中,但experimental仅当EXPERIMENTAL_FEATUREsymbol 在构建时定义:

public class MyData : ScriptableObject
{
    public int always;
#if EXPERIMENTAL_FEATURE
    public int experimental;
#endif

public int ConditionalDataValue()
{
#if EXPERIMENTAL_FEATURE
    return experimental;
#else  
    return always;
#endif 
}

}

构建资产包

您可以使用以下方法构建 AssetBundle:

  • 可寻址对象Addressables 包是一种从 Unity 编辑器定义和构建 AssetBundle 的用户友好方式。它通过高级 API 简化了 AssetBundle 的创建和管理。
  • 原生 APIBuildPipeline.BuildAssetBundles,AssetBundleUnityWebRequestAssetBundle是可用于构建 AssetBundle 的原生 API,但它们需要手动依赖项管理,并且您必须编写自己的构建脚本才能使用它们。

有关更多信息,请参阅将资产构建到资产包中。

构建多个资产包

构建或重新构建 AssetBundle 时,最佳做法是使用单个AssetBundleAPI 调用,以一起构建项目的所有 AssetBundle。AssetBundle可以引用其他AssetBundle并依赖于其他AssetBundle。例如,一个AssetBundle中的材质可以引用另一个AssetBundle中的纹理。当您一起构建 AssetBundle 时,Unity 会自动管理它们之间的引用和依赖关系。

其他资源

使用 AssetBundles 在运行时加载资产
创建资产包