Unity - 等待HTTP请求解析

时间:2017-06-21 17:15:00

标签: c# unity3d

这是函数,我想知道是否有更简洁的编写方式:

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

2 个答案:

答案 0 :(得分:3)

您确实使用WWWisDone错误。如果必须使用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;
}