C# Start例程和IEnumerator(Unity 3D)

C# Start例程和IEnumerator(Unity 3D),c#,unity3d,ienumerator,C#,Unity3d,Ienumerator,这是我的密码 public void myFuntion(){ JsonFx.Json.JsonWriter writer =new JsonFx.Json.JsonWriter(); string jsondata2=writer.Write(fps); WWWForm form = new WWWForm(); form.AddField("facprodstrans", jsondata2); string url="127.0.0.1/f

这是我的密码

public void myFuntion(){
     JsonFx.Json.JsonWriter writer =new JsonFx.Json.JsonWriter();
     string jsondata2=writer.Write(fps);
     WWWForm form = new WWWForm();
     form.AddField("facprodstrans", jsondata2);
     string url="127.0.0.1/few/get_trans.php"; 
     www = new WWW(url,form);
     StartCoroutine(WaitForRequest(www));
     print ("<<<<<<<<<<<<<"+fpts.time_remaining);
 }
 IEnumerator WaitForRequest(WWW www){ 
     yield return www;
     string facpdata = www.text;
     JsonFx.Json.JsonReader reader = new JsonFx.Json.JsonReader ();
     fpts = reader.Read<FactoryProdTransS> (facpdata);
     print(">>>>>>>>>>>>>"+fpts.time_remaining);
 }  
public void myfunition(){
JsonFx.Json.JsonWriter=new JsonFx.Json.JsonWriter();
字符串jsondata2=writer.Write(fps);
WWWForm form=新WWWForm();
表格.AddField(“facprodstrans”,jsondata2);
string url=“127.0.0.1/now/get_trans.php”;
www=新的www(url、表格);
启动例行程序(WaitForRequest(www));
打印(“>”+fpts.剩余时间);
}  

函数“myFunction”中的print语句在IEnumerator中的print语句之前执行,由于它先打印旧值,然后打印更新值,因此无法找出原因。

myFunction启动时,它会遇到Start例程,这是一种方法,因此它会跳到那里。 此时MyFunction处于暂停状态

统一有点自己,很少有人真正意识到,因为它发生在C++端。不知何故,您可能认为它将该方法放在了一个协程列表中

它开始运行WaitForRequest中的内容,直到找到一个成品。由于返回类型为IEnumerator,因此预期收益率

当发现收益率时,它退出协同例程并返回到停止的位置,因此返回MyFunction并在Start例程之后继续。在你的情况下,它打印

下一帧,Unity检查这个假设的协同程序列表,看看是否还剩下一些,在您的例子中,它会找到WaitForRequest。它回到那里,首先退出,收益回报。程序会询问www是否完成,如果未完成,则执行与前一帧相同的操作。如果完成了www,它将跳过成品并继续进行所有json解析。在协程结束时,我假设编译器在协程列表中搜索该方法并将其删除,这样就不会再次发生

如果需要在协同程序完成后执行操作,则需要传递一个委托:

void OnComplete(){ Debug:Log("Done"); }

IEnumerator WaitForRequest(Action onComplete){ 
     WWW www = new WWW(url);
     yield return www;
     string facpdata = www.text;
     JsonFx.Json.JsonReader reader = new JsonFx.Json.JsonReader ();
     fpts = reader.Read<FactoryProdTransS> (facpdata);
     print(">>>>>>>>>>>>>"+fpts.time_remaining);
     onComplete();
 }
IEnumerator WaitForRequest(Action<string> onComplete){ 
     WWW www = new WWW(url);
     yield return www;
     string facpdata = www.text;
     JsonFx.Json.JsonReader reader = new JsonFx.Json.JsonReader ();
     fpts = reader.Read<FactoryProdTransS> (facpdata);
     print(">>>>>>>>>>>>>"+fpts.time_remaining);
     onComplete(www.text);
 }

void Start(){
    string text= null;
    StartCoroutine(WaitForRequest(result=> text = result));
}
void OnComplete(){Debug:Log(“Done”);}
IEnumerator WaitForRequest(完成操作){
WWW=新的WWW(url);
收益率;
字符串facpdata=www.text;
JsonFx.Json.JsonReader=new JsonFx.Json.JsonReader();
fpts=读卡器读取(facpdata);
打印(“>>>>>>>>”+fpts.剩余时间);
onComplete();
}
如果需要从协同程序中获得结果,最好传递一个委托:

void OnComplete(){ Debug:Log("Done"); }

IEnumerator WaitForRequest(Action onComplete){ 
     WWW www = new WWW(url);
     yield return www;
     string facpdata = www.text;
     JsonFx.Json.JsonReader reader = new JsonFx.Json.JsonReader ();
     fpts = reader.Read<FactoryProdTransS> (facpdata);
     print(">>>>>>>>>>>>>"+fpts.time_remaining);
     onComplete();
 }
IEnumerator WaitForRequest(Action<string> onComplete){ 
     WWW www = new WWW(url);
     yield return www;
     string facpdata = www.text;
     JsonFx.Json.JsonReader reader = new JsonFx.Json.JsonReader ();
     fpts = reader.Read<FactoryProdTransS> (facpdata);
     print(">>>>>>>>>>>>>"+fpts.time_remaining);
     onComplete(www.text);
 }

void Start(){
    string text= null;
    StartCoroutine(WaitForRequest(result=> text = result));
}
IEnumerator等待请求(完成操作){
WWW=新的WWW(url);
收益率;
字符串facpdata=www.text;
JsonFx.Json.JsonReader=new JsonFx.Json.JsonReader();
fpts=读卡器读取(facpdata);
打印(“>>>>>>>>”+fpts.剩余时间);
onComplete(www.text);
}
void Start(){
字符串文本=空;
start例程(WaitForRequest(result=>text=result));
}

MyFunction启动时,它会点击Start例程,这是一种方法,因此它会跳到那里。 此时MyFunction处于暂停状态

统一有点自己,很少有人真正意识到,因为它发生在C++端。不知何故,您可能认为它将该方法放在了一个协程列表中

它开始运行WaitForRequest中的内容,直到找到一个成品。由于返回类型为IEnumerator,因此预期收益率

当发现收益率时,它退出协同例程并返回到停止的位置,因此返回MyFunction并在Start例程之后继续。在你的情况下,它打印

下一帧,Unity检查这个假设的协同程序列表,看看是否还剩下一些,在您的例子中,它会找到WaitForRequest。它回到那里,首先退出,收益回报。程序会询问www是否完成,如果未完成,则执行与前一帧相同的操作。如果完成了www,它将跳过成品并继续进行所有json解析。在协程结束时,我假设编译器在协程列表中搜索该方法并将其删除,这样就不会再次发生

如果需要在协同程序完成后执行操作,则需要传递一个委托:

void OnComplete(){ Debug:Log("Done"); }

IEnumerator WaitForRequest(Action onComplete){ 
     WWW www = new WWW(url);
     yield return www;
     string facpdata = www.text;
     JsonFx.Json.JsonReader reader = new JsonFx.Json.JsonReader ();
     fpts = reader.Read<FactoryProdTransS> (facpdata);
     print(">>>>>>>>>>>>>"+fpts.time_remaining);
     onComplete();
 }
IEnumerator WaitForRequest(Action<string> onComplete){ 
     WWW www = new WWW(url);
     yield return www;
     string facpdata = www.text;
     JsonFx.Json.JsonReader reader = new JsonFx.Json.JsonReader ();
     fpts = reader.Read<FactoryProdTransS> (facpdata);
     print(">>>>>>>>>>>>>"+fpts.time_remaining);
     onComplete(www.text);
 }

void Start(){
    string text= null;
    StartCoroutine(WaitForRequest(result=> text = result));
}
void OnComplete(){Debug:Log(“Done”);}
IEnumerator WaitForRequest(完成操作){
WWW=新的WWW(url);
收益率;
字符串facpdata=www.text;
JsonFx.Json.JsonReader=new JsonFx.Json.JsonReader();
fpts=读卡器读取(facpdata);
打印(“>>>>>>>>”+fpts.剩余时间);
onComplete();
}
如果需要从协同程序中获得结果,最好传递一个委托:

void OnComplete(){ Debug:Log("Done"); }

IEnumerator WaitForRequest(Action onComplete){ 
     WWW www = new WWW(url);
     yield return www;
     string facpdata = www.text;
     JsonFx.Json.JsonReader reader = new JsonFx.Json.JsonReader ();
     fpts = reader.Read<FactoryProdTransS> (facpdata);
     print(">>>>>>>>>>>>>"+fpts.time_remaining);
     onComplete();
 }
IEnumerator WaitForRequest(Action<string> onComplete){ 
     WWW www = new WWW(url);
     yield return www;
     string facpdata = www.text;
     JsonFx.Json.JsonReader reader = new JsonFx.Json.JsonReader ();
     fpts = reader.Read<FactoryProdTransS> (facpdata);
     print(">>>>>>>>>>>>>"+fpts.time_remaining);
     onComplete(www.text);
 }

void Start(){
    string text= null;
    StartCoroutine(WaitForRequest(result=> text = result));
}
IEnumerator等待请求(完成操作){
WWW=新的WWW(url);
收益率;
字符串facpdata=www.text;
JsonFx.Json.JsonReader=new JsonFx.Json.JsonReader();
fpts=读卡器读取(facpdata);
打印(“>>>>>>>>”+fpts.剩余时间);
onComplete(www.text);
}
void Start(){
字符串文本=空;
start例程(WaitForRequest(result=>text=result));
}

是正确的。协同程序是另一项任务,您的协同程序正在等待www请求完成,而不是停止“myfunction”hi@joreldraw不,这是错误的。您考虑的是“收益-回报”不,您正在运行2个任务,这只是一个运行条件。产生返回当然延迟您在协同程序中的打印行。您混淆了
startcroutine(WaitForRequest(www))
生成返回起始例程(WaitForRequest(www))他们完全不同。是的。协同程序是另一项任务,您的协同程序正在等待www请求完成,而不是停止“myfunction”hi@joreldraw不,这是错误的。您考虑的是“收益-回报”不,您正在运行2个任务,这只是一个运行条件。产生返回当然延迟您在协同程序中的打印行。您混淆了
startcroutine(WaitForRequest(www))
生成返回起始例程(WaitForRequest(www))它们完全不同。可能是一个协程列表而不是堆栈?一个堆栈会建议您可以从堆栈顶部弹出协同路由