本系列文章翻译自: https://learn.unity.com/tutorial/assets-resources-and-assetbundles

这是一系列文章,深入讨论了Unity引擎中的资产(Asset)和资源管理(Resource Management)。旨在为高级开发人员提供Unity资产和序列化系统的深入原理的知识。研究了Unity的AssetBundle系统的技术基础和当前使用它们的最佳使用方法。

该指南分为四章:

  1. 资产,对象和序列化(Assets,Objects and serialization)讨论了Unity如何序列化资产和处理资产之间引用的底层细节。强烈建议读者从本章开始,因为它介绍了整个指南中使用的术语。
  2. Resources 文件夹 讨论了内置的Resources API。
  3. AssetBundle 基础知识 是建立在第1章的知识基础上,用于描述 AssetBundles 的运作方式,并讨论 AssetBundles 的加载和 AssetBundles 的资产加载。
  4. AssetBundle 使用指南 是一篇长篇文章,讨论 AssetBundles 实际使用的许多方式。包括将有关将资产分配给 AssetBundles 和管理已加载资产的部分,并描述了使用 AssetBundles 的开发人员遇到的许多常见问题。

注意:本指南的 ObjectsAssets 术语与Unity的API中命名有所不同。

本指南调用 Objects 的数据在许多Unity API 中称为Assets,例如AssetBundle.LoadAssetResources.UnloadUnusedAssets。本指南称之为 Assets 的文件很少暴露给任何公共API。当它们被公开时,通常只在与构建相关的代码中,例如AssetDatabaseBuildPipeline。在这些情况下,它们在公共API 中称为文件(files)

0×00 前言

本系列的上一步介绍了 AssetBundles基础知识,其中包括各种加载API的低级行为。本章讨论在实践中使用 AssetBundle 的各个方面的问题和可能的解决方案。

0×01 管理已加载的资产

在内存敏感的环境中仔细控制加载的对象的大小和数量至关重要。从活动场景中删除对象时,Unity 不会自动卸载对象。资产清理在特定时间触发,也可以手动触发。

必须谨慎管理 AssetBundles 本身。由本地存储上的文件(在Unity缓存中或通过 AssetBundle.LoadFromFile 加载的文件)支持的 AssetBundle 具有最小的内存开销,很少消耗超过几十千字节。但是,如果存在大量 AssetBundle,这种开销仍然会成为问题。

由于大多数项目允许用户重新体验内容(例如重放),因此了解何时加载或卸载 AssetBundle 非常重要。如果 AssetBundle 未正确卸载,则可能导致内存中的对象重复。不正确地卸载 AssetBundles 在某些情况下也会导致不良行为,例如导致纹理丢失。要了解为什么会发生这种情况,请参阅“ 资产”,“对象”和“序列化” 步骤的“ 对象间引用” 部分。

管理资产和 AssetBundles 时最重要的一点是,在调用 AssetBundle.Unload 时,对于 unloadAllLoadedObjects 参数,其值为 true 或 false。

此 API 将卸载正在调用的 AssetBundle 的标头信息。所述 unloadAllLoadedObjects 参数确定是否还需卸载这个 AssetBundle 实例化的所有对象。如果设置为 true ,那么源自 AssetBundle 的所有对象也将立即卸载,即使它们当前正在活动场景中使用。

例如,假设材料 M 是从 AssetBundle AB 加载的,并假设 M 当前处于活动场景中。

如果调用了 AssetBundle.Unload(true),则 M 将从场景中删除,销毁并卸载。但是,如果调用了 AssetBundle.Unload(false),那么 AB 的头信息将被卸载,但是 M 将保留在场景中并且仍然可以正常工作。调用 AssetBundle.Unload(false)会中断 MAB 之间的链接。如果稍后再次加载 AB ,则 AB 中包含的对象的新副本将被加载到内存中。