首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StartCoroutine和IEnumerator (Unity 3D)

StartCoroutine和IEnumerator (Unity 3D)
EN

Stack Overflow用户
提问于 2016-04-26 14:25:39
回答 1查看 1.5K关注 0票数 0

这是我的代码

代码语言:javascript
复制
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);
 }  

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

EN

回答 1

Stack Overflow用户

发布于 2016-04-26 15:55:11

MyFunction启动,它命中一个StartCoroutine,这是一个方法,所以它跳到那里。在这一点上,MyFunction被搁置了。

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

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

当找到StartCoroutine时,它退出协程并返回到它停止的地方,因此返回到MyFunction,并在StartCoroutine之后继续。在您的情况下,它打印出来。

下一帧,Unity检查协程的假设列表,看看是否还剩下一些,在你的例子中,它会找到WaitForRequest。它返回到之前退出的地方,收益率返回。该程序查询www是否已完成,如果未完成,则与上一帧相同。如果www已完成,它将跳过输出并继续执行所有的json解析。在协程的末尾,我假设编译器在协程列表中搜索该方法并删除它,这样它就不会再次发生。

如果你需要在协程完成后执行一个动作,你需要传递一个委托:

代码语言:javascript
复制
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();
 }

如果你需要从你的协程中得到结果,传递一个委托也是更好的方法:

代码语言:javascript
复制
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));
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36856829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档