是否可以使用async/await在Unity中加载资源



在Unity中有可能这样做吗?

private async void LoadSomethingAsync()
{
AudioClip clip = await Resources.LoadAsync<AudioClip>("path");
}

我知道我可以使用Unitys Coroutines,但它们有很多缺点,为什么我想使用上面的代码
在互联网上,我也没有找到适合我的东西,所以也许你们中的某个人知道上面的代码是否可行。

你可以试试这个。此库使所有Unity AsyncOperations和Coroutines都不可用:https://github.com/Cysharp/UniTask
此外,不建议像所讨论的代码中那样将async与void结合使用。

我从未使用过Addressables,但这里有一些相关文档:

Addressables also supports asynchronous await through the AsyncOperationHandle.Task property:
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. 
}

所以对我来说,你似乎可以切换到使用Addressables,然后这样做:

private async void LoadSomethingAsync()
{
AsyncOperationHandle<AudioClip> handle = Addressables.LoadAssetAsync<AudioClip>("path");
await handle.Task;
if (handle.Status == AsyncOperationStatus.Succeeded) 
{
AudioClip clip = handle.Result;
// use clip here
}
else 
{
// handle loading error
}
}

请注意,根据文档,此特定解决方案在WebGL上不可用。这对你来说可能无关紧要:

AsyncOperationHandle.Task属性在WebGL上不可用,因为该平台不支持多线程操作。

您可以使用Resources.LoadAsync(path)方法异步加载存储在Resources文件夹路径中的资产。

以下代码是从资源文件夹异步加载音频剪辑的示例,

private IEnumerator LoadAudioAsync(string path) {
ResourceRequest resourceRequest = Resources.LoadAsync<AudioClip>(path);
yield return resourceRequest;
AudioClip audioClip = resourceRequest.asset as AudioClip;
}

Use也可以使用Addressables来加载资源。但它只支持Unity 2019.3+版本。

public async void LoadAudioAsync(string path) {
AsyncOperationHandle<AudioClip> resourceRequest = Addressables.LoadAssetAsync<AudioClip>(path);
await resourceRequest.Task;
}

有关更多示例:https://csharp.hotexamples.com/examples/UnityEngine/ResourceRequest/-/php-resourcerequest-class-examples.html

最新更新