这是函数,我想知道是否有更简洁的编写方式:
private static WWW WaitUntilResolved (WWW request)
{
bool success = true;
float timeout = 5000, timer = 0;
while (!request.isDone) {
if (timer > timeout) {
success = false;
break;
}
timer += Time.deltaTime;
}
if (success && request.error == null)
return request;
else {
request.Dispose ();
return null;
}
}
PS。 WWW是一个本地统一类:https://docs.unity3d.com/ScriptReference/WWW.html
答案 0 :(得分:3)
您确实使用WWW
和isDone
错误。如果必须使用isDone
,则必须将其置于while循环中。您还必须使用yield return null;
在while循环中屈服,否则游戏将冻结,直到下载完成。整个过程需要coroutine,因此必须使函数成为协程函数。
你真的不需要isDone
。当您想知道下载进度时,会使用 。
以下是使用isDone
的正确方法:
private static IEnumerator WaitUntilResolved(WWW request)
{
while (!request.isDone)
{
Debug.Log("Download Stat: " + request.progress);
//Wait each frame in each loop OR Unity would freeze
yield return null;
}
if (string.IsNullOrEmpty(request.error))
{
//Success
}
}
如果您不需要知道下载的进度,那么您应该使用以下内容:
private static IEnumerator WaitUntilResolved(WWW request)
{
yield return request;
if (string.IsNullOrEmpty(request.error))
{
//Success
}
}
最后,你无法直接调用协程函数。您必须使用StartCoroutine
函数来执行此操作:
WWW www = new WWW("www.yahoo.com");
StartCoroutine(WaitUntilResolved(www));
修改强>
如何为协程设置超时?
大多数WebRequest
教程都使用计时器。您不需要在Unity中使用WWW
API执行此操作。这里没有必要,因为这是一个非阻塞操作。如果你必须看到下面的代码。
private static IEnumerator WaitUntilResolved(WWW request)
{
float timeout = 5000, timer = 0;
while (!request.isDone)
{
Debug.Log("Download Stat: " + request.progress);
timer += Time.deltaTime;
if (timer >= timeout)
{
Debug.Log("Timeout happened");
//Break out of the loop
yield break;
}
//Wait each frame in each loop OR Unity would freeze
yield return null;
}
if (string.IsNullOrEmpty(request.error))
{
//Success
}
}
如果您需要返回下载状态,请参阅this帖子,了解如何执行此操作。
答案 1 :(得分:0)
这里是等待异步呼叫的示例。
string WebGet()
{
Response result = new Response();
IEnumerator e = GetStuff(result);
// blocks here until UnityWebRequest() completes
while (e.MoveNext());
Debug.Log(result.result);
}
public class Response
{
public string result = "";
}
IEnumerator GetStuff(Response res)
{
UnityWebRequest www = UnityWebRequest.Get("http://some.add.com/");
yield return www.SendWebRequest();
while (!www.isDone)
yield return true;
if (www.isNetworkError || www.isHttpError)
res.result = www.error;
else
res.result = www.downloadHandler.text;
}