函数如下,不知道有没有更简洁的写法:
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;
}
}
附言。 WWW 是原生统一类:https://docs.unity3d.com/ScriptReference/WWW.html
最佳答案
你真的在使用 WWW
和 isDone
错误的。如果必须使用isDone
,则必须将它放在while 循环中。您还必须在 while 循环中使用 yield return null;
yield 否则游戏将卡住,直到下载完成。这整件事需要 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));
编辑:
How do I set a timeout for the coroutine?
大多数 WebRequest
教程都使用计时器。在使用 WWW
API 的 Unity 中,您不需要这样做。这里没有必要,因为这是一个非阻塞操作。如果您一定要看下面的代码。
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解释如何做到这一点的帖子。
关于c# - Unity - 等待 HTTP 请求解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44682376/