Unity StartCoroutine 和 yield return 深入研究
来源:互联网 发布:软件培训ppt模板 编辑:程序博客网 时间:2024/06/06 22:58
转自:http://www.cnblogs.com/fly-100/p/3910515.html
StartCoroutine和yield return表面意思很好理解,StartCoroutine就是开启一个协程,yield return 是迭代器块返回调用迭代的地方。
是吧?不知道你什么感觉,反正我觉得,还是需要深入研究一下的。OK,here we go!
首先,先看一下StartCoroutine在Unity官方的解释。
意思是:一个协程的执行可以在任何地方用yield语句来暂停,yield return的值决定了什么时候协程恢复执行。协程在协调在几帧中执行的操作时有极大的用处.协程几乎没有任何性能开销。
StartCoroutine一般都会立即返回,然而你也可以获得返回结果的值。但是这一步会等到协程结束执行才能生效。
OK,意思应该不难理解,根据他的意思我们来分析一段程序。
运行结果是:
start1
test1
start2
test2
这下就一目了然了,当StartCoroutine刚调用的时候,可以理解为正常的函数调用,然后接着看调用的函数里面。
当被调用函数执行到yield return null;(暂停协程,等待下一帧继续执行)时,根据Unity解释协同程序就会被暂停,其实我个人认为他这个解释不够精确,先返回开始协程的地方,然后再暂停协程。也就是先通知调用处,“你先走吧,不用管我”,然后再暂停协程。。怎么?不信?那我们再写个demo验证一下。
执行结果:
start1
test1
start2
test2 (这个test2是等待三秒后才打印出来的)
正好顺便验证了“yield return的值决定了什么时候协程恢复执行”这句,其实yield return后面的值可以后很多用法,可以看这个帖子:http://blog.sina.com.cn/s/blog_aaa4ce8d010131kr.html
其实再回过头来想想,协程->协同程序->其实就是协同两个任务,表面看起来很简单,但是在一些稍微大点的项目中用起来,对于新手来说还是会有些晦涩。。。
比如说
IEnumerator Init()
{
yield
return
StartCoroutine(init1());
Debug.Log(
"init1 finish"
);
yield
return
StartCoroutine(init2());
Debug.Log(
"init2 finish"
);
yield
return
StartCoroutine(init3());
Debug.Log(
"init3 finish"
);
}
IEnumerator init1()
{
// 模拟初始化
yield
return
new
WaitForSeconds(2);
//
}
IEnumerator init2()
{
// do somthing..
yield
return
new
WaitForSeconds(2);
//
}
IEnumerator init2()
{
// do somthing..
yield
return
new
WaitForSeconds(2);
//
}
其实就是一个执行顺序的问题,这样调用能保证,init1,init2,init3一个一个的执行,不至于出现后面执行的代码引用一个前面未初始化的变量。。。
那么,接着这个执行顺序的话题,我们在来研究一个话题,看下面代码
void Start () { Debug.Log("start1"); StartCoroutine(Test()); Debug.Log("start2"); } IEnumerator Test() { Debug.Log("test1"); yield return StartCoroutine(DoSomething()); Debug.Log("test2"); } IEnumerator DoSomething() { Debug.Log("load 1"); yield return null; Debug.Log("load 2"); }
执行结果:
start1
test1
load1
start2
load2
test2
这种StartCoroutine中嵌套一个yield return StartCoroutine,第一个StartCoroutine会等到第二个StartCoroutine中所有代码结束后再继续执行,而第二个StartCoroutine中的yield语句会先返回第一个,然后立即返回他的调用处,也就是调用处会继续执行,而第一个StartCoroutine会等待第二个执行完再继续执行。
如果还想继续深入,可以看一下C#中的迭代器,那里面说明了yield和IEnumerator根本到底是什么。
OK,今天就说到这。Good Luck!
» 下一篇:Protobuf语言指南
</div>
- Unity StartCoroutine 和 yield return 深入研究
- Unity3D: StartCoroutine 和 yield return 深入研究
- Unity StartCoroutine 和 yield return
- 在Unity中StartCoroutine/yield return的原理和模式
- 【学习笔记】Unity StartCoroutine 中 yield return 总结
- 只谈 Unity中 yield return/ StartCoroutine 的使用
- IEnumerator/ IEnumerable/ yield return/ StartCoroutine 详解
- 在Unity中StartCoroutine/yield return这个模式到底是怎么应用的?其中的原理是什么?
- Unity协程(一):彻底了解yield return null 和 yield return new WaitForSeconds
- unity StartCoroutine
- C# yield return 和 yield break
- Unity中 yield return 1 的误区
- 3.比较yield和return
- yield return null和yield return 0 验证
- Unity StartCoroutine 协同程序
- yield return
- yield return
- Yield Return
- mysql常用命令
- [leetcode]: 234. Palindrome Linked List
- springboot+Multipart文件上传获取失败
- jmap,jhat,jstat
- Nginx开发从入门到精通
- Unity StartCoroutine 和 yield return 深入研究
- python中递归的使用
- 同步失败阿里云代理
- redis做分布式锁 java demo
- 移动站点网页设计如何打造才能更好的吸引客户呢
- salt-api 安装使用
- PAT乙级真题及训练集(11)--1004. 成绩排名 (20)
- java中 String.format与StringBuilder、String+的比较
- Java中遍历Map的四种方法