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

本文关键字:return yield 命令 顺序 执行 StartCoroutine Unity | 更新日期: 2023-09-27 18:04:12

有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,然后是服务器响应。

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

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

看看:

StartCoroutine(WaitForRequest(www));
return www;

你的方法返回www对象没有等待WaitForRequest(www)完成。如果您没有使用POST()方法返回的www,为什么要返回它。

如何绕过它:

传递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();
    }
}

希望有所帮助