Dav*_*aiz 7 c# coroutine unity-game-engine
我正在进行团结游戏并遇到一个我无法解决的问题.我通过标准的WWW对象连接到Web服务器并使用协程来执行POST请求.
代码本身可以工作,但是我需要更新变量值并在协程完成后返回该变量,这是我无法做到的.
public int POST(string username, string passw)
{
WWWForm form = new WWWForm();
form.AddField("usr", username);
form.AddField("pass", passw);
WWW www = new WWW(url, form);
StartCoroutine(WaitForRequest(www));
//problem is here !
return success_fail;
}
private IEnumerator WaitForRequest(WWW www)
{
yield return www;
if (www.error == null)
{
if(www.text.Contains("user exists"))
{
success_fail = 2;
}
else
{
success_fail=1;
}
} else {
success_fail=0;
}
}
Run Code Online (Sandbox Code Playgroud)
协程使用相关值更新'success_fail'的值.但'返回success_fail;' POST方法中的行在协同程序完成之前运行,这会导致它返回false值.
我试图使用额外的协程,但没有成功,假设我也有错误.如何在协程完成后返回'success_fail'值?
谢谢.
小智 14
函数不会在返回之前等待协同程序,但是您可以使用Action来提供某种返回.
把它放在你的启动功能中
WWW www = new WWW("http://google.com");
StartCoroutine(WaitForRequest(www,(status)=>{
print(status.ToString());
}));
Run Code Online (Sandbox Code Playgroud)
并添加此.
private IEnumerator WaitForRequest(WWW www,Action<int> callback) {
int tempInt = 0;
yield return www;
if (string.IsNullOrEmpty(www.error)) {
if(!string.IsNullOrEmpty(www.text)) {
tempInt = 3;
}
else {
tempInt=2;
}
} else {
print(www.error);
tempInt=1;
}
callback(tempInt);
}
Run Code Online (Sandbox Code Playgroud)
尝试一下,虽然函数可以更改一个值但它不返回值并且只有一个参数.所以本质上这不是返回你的协同程序的解决方案,但是一旦从协程程序接收到int,我们就可以证明如何处理它甚至在回调中调用其他函数.
StartCoroutine(WaitForRequest(www,(status)=>{
print(status.ToString());
Awake(); // we can call other functions within the callback to use other codeblocks and logic.
if(status != 0)
print("yay!");
}
));
Run Code Online (Sandbox Code Playgroud)
这可能对你有用. http://answers.unity3d.com/questions/744888/returning-an-ienumerator-as-an-int.html
只有一个协程可以等待另一个协程。由于你需要等待你启动的协程(WaitForRequest),这意味着你必须将 POST 转换为协程,并且它将无法返回 int。
看起来 success_fail 是一个成员变量,因此如果它暴露给启动 POST (作为协程)的人,则无论如何都不需要返回它。
public int success_fail
IEnumerator POST(string username, string passw)
{
WWWForm form = new WWWForm();
form.AddField("usr", username);
form.AddField("pass", passw);
WWW www = new WWW(url, form);
yield return StartCoroutine(WaitForRequest(www));
}
private IEnumerator WaitForRequest(WWW www)
{
yield return www;
if (www.error == null)
{
if(www.text.Contains("user exists"))
{
success_fail = 2;
}
else
{
success_fail=1;
}
} else {
success_fail=0;
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,如果您希望代码“等待”,它必须是协程。您无法在不阻塞整个引擎的情况下进行等待调用(没有某种类型的循环黑客)。
该线程提供了一种方法,如果您确实需要,您可以从协程返回 int,但 POST 仍然不能是阻塞调用......
http://answers.unity3d.com/questions/24640/how-do-i-return-a-value-from-a-coroutine.html
| 归档时间: |
|
| 查看次数: |
17453 次 |
| 最近记录: |