CRIWARE Unity Plugin Manual  Last Updated: 2024-07-12
[Asset Support] Addressables

范例内容

概述

cri4u_samples_addon_asset02_addressables.png

通过Addressables參照包含ACB/AWB Asset的资源并播放Cue的范例。
通过按下画面的按钮,从服务器获取对应的prefab,并对其进行实例化。

注意
要正常运行本范例,需要在运行前进行Addressables的内容构建。

场景信息


中间件 CRI ADX (CRI Atom)
范例 Asset Support 范例
存储位置 CRIWARE/SDK/unity/samples/UnityProject/Assets/CriAssetSamples/Scenes/
场景文件 Scene_02_Addressables.unity
ACF Asset CRIWARE/SDK/unity/samples/UnityProject/Assets/CriAssetSamples/Data/DemoProj.acf
ACB Asset CRIWARE/SDK/unity/samples/UnityProject/Assets/CriAssetSamples/Data/CueSheet_0.acb
AWB Asset CRIWARE/SDK/unity/samples/UnityProject/Assets/CriAssetSamples/Data/CueSheet_0.awb


程序说明


首先通过Addressables获取持有prefab的列表信息的Asset,并显示各按钮。
按下按钮时,将从Addressables获取相对的prefab后进行实例化。
在各prefab上挂载有CriAtomSourceForAsset,会自动进行Cue Sheet的加载和播放。

初始化和目录信息的修改

在CRI Addressables初始化Addressables后需要调用目录信息的修改处理。
在完成所有内容目录的加载后调用 CriWare.Assets.CriAddressables.ModifyLocators

// 确认有否远程目录后初始化Addressables
var catalogs = await Addressables.CheckForCatalogUpdates().Task;
if (catalogs.Count > 0)
await Addressables.UpdateCatalogs(catalogs).Task;
else
await Addressables.InitializeAsync().Task;
// 修改目录内的 CriAddressables 信息
// 调用此处理后 Addressables.GetDownloadSizeAsync 等将返回正确的结果

注意
注意即使不正确调用CriWare.Assets.CriAddressables.ModifyLocators ,
也可以获取内容。但在获取下载大小的API(例如 Addressables.GetDownloadSizeAsync 等)将不能正常运作。

实例化包含CRI Asset的Prefab

对各Prefab所对应的按钮的点击事件注册Prefab的实例化处理。

// 在点击时设置进行实例化的处理
obj.GetComponentInChildren<UnityEngine.UI.Button>().onClick.AddListener(() => {
// 存在其他Prefab实例时销毁
Unload();
currentInfo = info;
// 无论是否包含CRIWARE的Asset,都可以作为通常的Addressable Asset加载
info.prefab.InstantiateAsync().Completed += e => {
currentLoaded = e.Result;
UpdateView();
};
});

此时,如果依赖CRI Asset,则所需的资源将使用Addressables自动在缓存文件夹中获取。
换句话说,无论CRI Asset是否存在,也可以作为通常的Addressables内容使用。

在某些平台上,Unity规范禁用了AssetBundle缓存。
在这种情况下,CRIWARE数据将下载到临时区域中,而不是缓存文件夹。

缓存的清除

按下“Clear Cache”按钮时不存在实例化的Prefab时,则删除缓存。

foreach (var info in prefabList.prefabs)
Addressables.ClearDependencyCacheAsync(info.prefab);

Addressables的API会清除通常的AssetBundle缓存和CRI Asset的实际数据的缓存。

[备注]
对于Addressables 1.16.1以前的包,由于Addressables的缺陷, 所有包含CRI Asset资源的Addressables内容的缓存可能无法正常删除。