文章链接
异步操作处理
AddressablesAPI的几种方法返回一个AsyncOperationHandle结构。此句柄的主要目的是允许访问操作的状态和结果。在您调用Addressables.Release或Addressables.ReleaseInstance进行该操作之前,该操作的结果是有效的(有关释放资产的更多信息,请参阅有关内存管理的文档。
操作完成后,该AsyncOperationHandle.Status属性为AsyncOperationStatus.Succeeded或AsyncOperationStatus.Failed。如果成功,则可以通过AsyncOperationHandle.Result属性访问结果。
您可以定期检查操作状态,也可以使用AsyncOperationHandle.Complete事件注册完成的回调。当不再需要返回的AsyncOperationHandle结构提供的资产时,应使用方法释放它Addressables.Release。
类型与无类型的句柄
大多数AddressablesAPI方法都返回通用AsyncOperationHandle
请注意,如果您尝试将非泛型句柄转换为错误类型的泛型句柄,则会发生运行时异常。例如:
AsyncOperationHandle<Texture2D> textureHandle = Addressables.LoadAssetAsync<Texture2D>("mytexture");
// Convert the AsyncOperationHandle<Texture2D> to an AsyncOperationHandle:
AsyncOperationHandle nonGenericHandle = textureHandle;
// Convert the AsyncOperationHandle to an AsyncOperationHandle<Texture2D>:
AsyncOperationHandle<Texture2D> textureHandle2 = nonGenericHandle.Convert<Texture2D>();
// This will throw and exception because Texture2D is required:
AsyncOperationHandle<Texture> textureHandle3 = nonGenericHandle.Convert<Texture>();
AsyncOperationHandle用例示例
使用AsyncOperationHandle.Completed回调为完成事件注册侦听器:
private void TextureHandle_Completed(AsyncOperationHandle<Texture2D> handle) {
if (handle.Status == AsyncOperationStatus.Succeeded) {
Texture2D result = handle.Result;
// The texture is ready for use.
}
}
void Start() {
AsyncOperationHandle<Texture2D> textureHandle = Addressables.LoadAsset<Texture2D>("mytexture");
textureHandle.Completed += TextureHandle_Completed;
}
AsyncOperationHandle实现了IEnumerator,因此可以在协程中yielded:
public IEnumerator Start() {
AsyncOperationHandle<Texture2D> handle = Addressables.LoadAssetAsync<Texture2D>("mytexture");
yield return handle;
if (handle.Status == AsyncOperationStatus.Succeeded) {
Texture2D texture = handle.Result;
// The texture is ready for use.
// ...
// Release the asset after its use:
Addressables.Release(handle);
}
}
可寻址对象通过该AsyncOperationHandle.Task属性还支持异步await:
public async Start() {
AsyncOperationHandle<Texture2D> handle = Addressables.LoadAssetAsync<Texture2D>("mytexture");
await handle.Task;
// The task is complete. Be sure to check the Status is successful before storing the Result.
}
该AsyncOperationHandle.Task属性不可用于WebGL,因为该平台不支持多线程操作。
请注意,加载场景并将SceneManager.LoadSceneAsync其allowSceneActivation设置为false或使用Addressables.LoadSceneAsync并将activateOnLoad参数设置为false会导致随后的异步操作被阻止并且无法完成。请参阅allowSceneActivation文档。
加载可寻址场景
加载可寻址场景时,将通过场景加载操作期间加载的AssetBundle访问场景中GameObjects的所有依赖关系。假设没有其他对象引用关联的AssetBundle,则在卸载Scene时,将卸载Scene以及依赖项所需的所有AssetBundle。
注意:如果在可寻址加载的场景中将GameObject标记为DontDestroyOnLoad或将其移动到另一个已加载的场景,然后卸载原始场景,则仍将卸载GameObject的所有依赖项。
如果您遇到这种情况,可以使用多种选择。
- 使您要成为DontDestroyOnLoad的游戏对象成为单个可寻址预制体。在需要时实例化预制件,然后将其标记为DontDestroyOnLoad。
- 在卸载包含您标记为DontDestroyOnLoad的GameObject的场景之前,请调用AsyncOperationHandle.Acquire()场景加载句柄。这会增加场景上的引用计数,并保持加载它及其依赖项,直到在acquired的句柄上调用Release它为止。
定制操作
该IResourceProviderAPI允许您通过以数据驱动的方式定义位置和依赖性来扩展加载过程。
在某些情况下,您可能想创建一个自定义操作。该IResourceProviderAPI在内部基于这些自定义操作构建。
创建自定义操作
通过从AsyncOperationBase类派生并覆盖所需的虚拟方法来创建自定义操作。您可以将派生的操作传递给ResourceManager.StartOperation方法以启动操作并接收AsyncOperationHandle结构。以这种方式启动的操作已注册到ResourceManager并出现在Addressables Event Viewer中。
执行操作
一旦可选的依赖操作完成,ResourceManager为您的自定义操作调用AsyncOperationBase.Execute方法
完成处理
自定义操作完成后,在自定义操作对象调用AsyncOperationBase.Complete。您可以在Execute方法中调用此方法,也可以将其推迟到调用之外。调用AsyncOperationBase.Complete会通知ResourceManager操作已完成,并将调用关联的AsyncOperationHandle.Completed事件。
终止操作
当你释放AsyncOperationHandle引用它,ResourceManager为您的自定义操作调用AsyncOperationBase.Destroy方法。您应该在此处释放与自定义操作关联的所有内存或资源。