Calmer的文章

  • 首页
  • 文章归档
  • 关于页面

  • 搜索
体验游戏 笔记 推荐 工具链 工具使用 小游戏 插件 UI 软件 教程

ADDRESSABLE ASSETS SYSTEM 翻译(六)

发表于 2020-10-13 | 分类于 游戏开发 | 0 | 阅读次数 943

文章链接

https://docs.unity3d.com/Packages/com.unity.addressables@1.14/manual/AddressableAssetsOverview.html#concepts

异步操作处理

AddressablesAPI的几种方法返回一个AsyncOperationHandle结构。此句柄的主要目的是允许访问操作的状态和结果。在您调用Addressables.Release或Addressables.ReleaseInstance进行该操作之前,该操作的结果是有效的(有关释放资产的更多信息,请参阅有关内存管理的文档。

操作完成后,该AsyncOperationHandle.Status属性为AsyncOperationStatus.Succeeded或AsyncOperationStatus.Failed。如果成功,则可以通过AsyncOperationHandle.Result属性访问结果。

您可以定期检查操作状态,也可以使用AsyncOperationHandle.Complete事件注册完成的回调。当不再需要返回的AsyncOperationHandle结构提供的资产时,应使用方法释放它Addressables.Release。

类型与无类型的句柄

大多数AddressablesAPI方法都返回通用AsyncOperationHandle结构,从而为AsyncOperationHandle.Completed事件和AsyncOperationHandle.Result对象提供类型安全性。还有一个非泛型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方法。您应该在此处释放与自定义操作关联的所有内存或资源。

  • 本文作者: Calmer
  • 本文链接: https://mytechplayer.com/archives/addressableassetssystem翻译六
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
# 笔记
ADDRESSABLE ASSETS SYSTEM 翻译(五)
FGUI渐变透明遮罩与粒子特效遮罩的支持
  • 文章目录
  • 站点概览
Calmer

Calmer

88 日志
7 分类
10 标签
RSS
Creative Commons
0%
© 2020 — 2025 Calmer
由 Halo 强力驱动
蜀ICP备20010026号-1川公网安备51019002006543
Copyright © 2020-2025 Calmer的文章