使用StartCoroutine / yield返回www在Unity 5中执行命令的顺序

时间:2016-08-26 10:08:40

标签: c# unity3d unity5

有2个c#脚本,附加到同一个游戏对象(Unity 5.4)

public class SignIn : MonoBehaviour
{
    private SendRequest sendRequest;

    void Start()
    {
        sendRequest = GetComponent<SendRequest>();
    }

    public void signInPressed()
    {
        WWWForm form = new WWWForm();
        form.AddField("key", "value");

        sendRequest.POST(mainSettings.appUrl, form);

        Debug.Log("SIGNIN");
    }
}

    public class SendRequest : MonoBehaviour {

    public WWW POST(string url, WWWForm form)
    {
        WWW www = new WWW(url, form);

        StartCoroutine(WaitForRequest(www));
        return www;
    }

    private IEnumerator WaitForRequest(WWW www)
    {
        yield return www;

        if (www.error == null)
        {
            Debug.Log("WWW Ok!: " + www.text);
        }
        else
        {
            Debug.Log("WWW Error: " + www.error);
        }
    }
}

当我尝试执行这些脚本时,首先显示行SIGNIN,然后显示服务器响应。

如何首先从服务器获取响应,然后继续该程序? 我做错了什么?

1 个答案:

答案 0 :(得分:3)

看看这里:

StartCoroutine(WaitForRequest(www));
return www;

您的方法返回www对象,而不等待WaitForRequest(www)完成。如果您没有使用从www方法返回的POST(),为什么要将其退回。

如何解决这个问题:

delegate完成时传递coroutine参数。

例如:

sendRequest.POST(mainSettings.appUrl, form, () => { Debug.Log("SIGNIN");});

POST() 的定义:

public WWW POST(string url, WWWForm form, Action callback = null)
{
    WWW www = new WWW(url, form);

    StartCoroutine(WaitForRequest(www, callback));
}

WaitForRequest() 的定义:

private IEnumerator WaitForRequest(WWW www, Action callback = null)
{
    yield return www;

    if (www.error == null)
    {
        Debug.Log("WWW Ok!: " + www.text);
    }
    else
    {
        Debug.Log("WWW Error: " + www.error);
    }

    if(callback != null)
    {
        callback();
    }
}

希望有所帮助