首页 > 解决方案 > 如何从产量返回中返回音频剪辑?

问题描述

我想写一个从我的加载音频剪辑的方法

IEnumerator GetAudioClip(string filePath)
{
    using (UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(filePath, AudioType.MPEG))
    {
        yield return www.SendWebRequest();

        if (www.isNetworkError)
        {
            Debug.Log(www.error);
        }
        else
        {
            AudioClip ac= DownloadHandlerAudioClip.GetContent(www);

        }
    }
}

我希望我的方法返回 audioClip 我该怎么做?我研究了一些,有一些复杂的类我不明白

标签: c#unity3dcoroutine

解决方案


从技术上讲,您不能,因为在 Unity 中实现协程的方式。有几种解决方法。这是我脑海中的两个:

1.IEnumerator 协程接收变量委托作为返回方法

IEnumerator GetAudioClip(string filePath, Action<AudioClip> callback)
{
    if (callback == null) { yield break; }
    using (UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(filePath, AudioType.MPEG))
    {
        yield return www.SendWebRequest();

        if (www.isNetworkError)
        {
            Debug.Log(www.error);
            callback(null);
        }
        else
        {
            AudioClip ac= DownloadHandlerAudioClip.GetContent(www);
            callback(ac);
        }
    }
}

2.使用 Unity 新的 async-await 集成

public async Task<AudioClip> GetAudioClip(string filePath){

    using (UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(filePath, AudioType.MPEG))
    {
        var result = www.SendWebRequest();

        while (!result.isDone) { await Task.Delay(100); }

        if (www.isNetworkError)
        {
            Debug.Log(www.error);
            return null;
        }
        else
        {
            return DownloadHandlerAudioClip.GetContent(www);
        }
    }

请注意,这是我在浏览器中编写的伪代码,因此它可能无法通过复制粘贴直接编译。


推荐阅读