【问题标题】:how to return audioClip from yield return?如何从产量返回中返回音频剪辑?
【发布时间】:2020-08-11 19:30:58
【问题描述】:

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

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# unity3d coroutine


    【解决方案1】:

    由于协程在 Unity 中实现的方式,从技术上讲你不能。 有几种解决方法。以下是我脑海中的 2 个:

    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);
            }
        }
    

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

    【讨论】:

    • 谢谢,调用这些方法有什么需要注意的吗?
    • @eomer 对不起,我不明白你的问题
    • 另外,如果这回答了您的问题,请将其标记为已解决
    • 我已经问过你如何为第二种方式调用这些方法 audioClip = GetAudio(filepath);没用我选择了你的第一种方式,并称之为 StartCoroutine(GetAudioClip(filePath, (result) =>{audioClip = result;}));再次感谢
    • 第二个方法需要从异步函数中调用并且应该等待。 public async void Foo() { var r = await GetAudio(filepath); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2014-03-10
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    相关资源
    最近更新 更多