(六)unity加载AssetBundle清单和卸载AssetBundle

1、加载清单

如果一个AB包对另一个AB包有依赖关系,那么在从原始捆绑包加载任何资源之前,你怎么指定那些需要加载的依赖项?

Editor模式下:可以通过AssetDatabaseAPI查询AssetBundle依赖项。AssetBundles分配和依赖项可以通过AssetImportAPI访问和更改。https://docs.unity3d.com/ScriptReference/AssetDatabase.html

运行环境下:有了清单对象,就可以动态地查找加载依赖项。

假设我们想要为名为“assetBundle”的 AssetBundle 加载所有依赖项。


现在,可以通过上面示例中的清单对象访问 AssetBundleManifest API 调用。从这里,可以使用清单获取所构建的 AssetBundle 的相关信息。此信息包括 AssetBundle 的依赖项数据、哈希数据和变量数据。

从图中可以看出,要获得可用的 AssetBundleManifest 对象,需要加载另外的 AssetBundle(与其所在的文件夹名称相同的那个)并从中加载 AssetBundleManifest 类型的对象。加载清单本身的操作方法与 AssetBundle 中的任何其他资源完全相同:

AssetBundle assetBundle = AssetBundle.LoadFromFile(manifestFilePath);

AssetBundleManifest manifest = assetBundle.LoadAsset("AssetBundleManifest");


2、卸载和重新加载AssetBundle

 这里涉及到AssetBundle.Unload(bool);了解何时加载和卸载 AssetBundle 非常重要。不正确地卸载 AssetBundle 会导致在内存中复制对象或其他不良情况,例如缺少纹理。

AssetBundle.Unload(true): 卸载从 AssetBundle 加载的所有游戏对象(及其依赖项)。这不包括复制的游戏对象(例如实例化的游戏对象),因为它们不再属于 AssetBundle。发生这种情况时,从该 AssetBundle 加载的纹理(并且仍然属于它)会从场景中的游戏对象消失,因此 Unity 将它们视为缺少纹理。

示例:假设材质 M 是从 AssetBundle AB 加载的,那么如果调用 AB.Unload(true),活动场景中的任何 M 实例也将被卸载并销毁;如果调用 AB.Unload(false),那么将会中断 M 和 AB 当前实例的链接关系;就算稍后再次加载 AB 并且调用 AB.LoadAsset(),Unity 也不会将现有 M 副本重新链接到新加载的材质,而是将加载 M 的两个副本。

大多数项目应使用AssetBundle.Unload(true)配合其它方法来确保游戏对象不重复生成。两种常见方法是:在应用程序的生命周期中具有明确定义的时间点卸载AssetBundle,例如在游戏不同关卡切换间隙或在加载屏幕期间;在没有使用Assetbundle中的所有对象时,保持单个对象的依赖关系计数并卸载AssetBundle。这才能允许应用程序在内存中不重复生成相同对象的情况下卸载和重新加载单个对象。

如果应用程序必须使用AssetBundle.Unload(false),则只能以两种方式卸载单个对象:

消除场景和代码中对不需要的对象的所有引用。完成此操作后,调用Resources.UnloadUnusedAssets。

非累加地加载场景。这将销毁当前场景中的所有对象,并自动调用Resources.UnloadUnusedAssets。

你可能感兴趣的:((六)unity加载AssetBundle清单和卸载AssetBundle)