问题描述
我想写一种从我的加载音频剪辑的方法
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 我该怎么做?我调查了一些,有一些复杂的类我没听懂
解决方法
从技术上讲,由于协程在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的新异步等待集成
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);
}
}
请记住,这是我在浏览器中编写的伪代码,因此它可能无法通过复制粘贴直接编译。