
本文介绍如何使用Unity的Addressbles资产系统同步加载资源。
同步加载?
Addressable资源系统使用异步API来加载资源。
var handle = Addressables.LoadAssetAsync<GameObject>("FooPrefab");
await handle.Task;
var prefab = handle.Result;
Addressables.Release(handle);
现在考虑同步加载该资源,如果Task可以如下所示使用Wait()那就太好了,但Addressable不支持它。
// 如果你这样做,Unity就会更加坚定*
var handle = Addressables.LoadAssetAsync<GameObject>("FooPrefab");
handle.Task.Wait();
var prefab = handle.Result;
Addressables.Release(handle);
预载
第一个标准解决方案是预加载资源,如下所示,Addressables的设计目的是让已经读取过一次的资源无需等待即可同步获取。
// 预加载 FooPrefab
var handle1 = Addressables.LoadAssetAsync<GameObject>("FooPrefab");
await handle1.Task;
Debug.Log(handle1.Result);
// 预加载的无需等待即可使用
var handle2 = Addressables.LoadAssetAsync<GameObject>("FooPrefab");
Debug.Log(handle2.Result);
// 实例化也一样
var handle3 = Addressables.InstantiateAsync("FooPrefab");
Debug.Log(handle3.Result);
Addressables.Release(handle1);
Addressables.Release(handle2);
Addressables.Release(handle3);
因此,可以在加载屏幕上预加载所需的资源,并在需要时同步获取它们。
使用专门的Provider
第二种方法是替换加载AssetBundles的Provider,从AssetBundles中加载Assets,关于这一点,Unity的官方示例发布在以下存储库中,可以从这里参考。
在SyncAddressables文件夹中导入一组脚本后,可以通过以下过程确认资源可以同步加载。
- 将要同步加载的资源分组到任何Addressables组中
- 将AssetProvider和AssetBundleProvider替换为来自组检查器的同步(下图)
- 建造
- 设置播放模式脚本以使用现有构建
- 用SyncAddressables.LoadAsset()读取

现在可以同步加载资源了。

不过如果直接使用这个示例的话,还是有一些需要注意的地方和问题的,所以总结如下。
注意事项
使用同步Provider的Group无法异步读取
第一个是Provider只能针对每个Addressables组进行设置。也就是说,设置了Sync-type Providers的组中的资源将始终被同步读取。
即使使用Addressables.LoadAssetAsync(),它也会被同步读取,因此加载大量资源会冻结。
无法下载
本来,Addressables有一个加载资源时,如果资源不在存储中则下载的功能。
Addressables.LoadAssetAsync()将在内部使用UnityWebRequest来下载资源。
认为这是Addressables API,最初只是异步的主要原因之一。
不兼容Android
另一个重要的警告,或者更确切地说是一个问题,是官方示例与Android不兼容。
这是因为Android上加载应用程序嵌入的资源的方法有点复杂,是一个技术上可以解决的问题,应该重写为以下形式。
支持版本
第三种是使用Addressbles 1.17.4及更高版本,正式支持同步加载,以前的版本不行。
…
以上是关于如何使用Unity的Addressable资源系统同步加载资源的全部内容,如果你有任何反馈,请随时在本页面下方留言。