在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