在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,然后是服务器响应。
如何首先从服务器获得响应,然后继续程序?我做错了什么?
看看:
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();
}
}
希望有所帮助