纳金网

标题: Unity3D之协程(Coroutines & Yield ) [打印本页]

作者: star-小虎    时间: 2013-10-12 15:21
标题: Unity3D之协程(Coroutines & Yield )
写游戏代码,往往最终需要代码为连续的事件.结果会像这样:
[它可以实现将一段程序延迟执行或者将其各个部分分布在一个时间段内连续执行。]
[csharp] view plaincopyprint?




往往使用yield语句更为方便.yield语句是一个特殊的返回类型,它确保函数从yield语句的下一行继续执行.
[csharp] view plaincopyprint?



你也可以传递时间值到yield语句,Update函数会在yield结束后执行下一语句.
[csharp] view plaincopyprint?



你可以入栈并连接协程.
这个例子将执行Do,但是do函数之后的print指令会立刻执行.
[csharp] view plaincopyprint?



这个例子将执行Do,并等待,直到Do完成再执行其他语句.【注:这里的等待是把线程时间交给其他任务,而不是阻塞式等待】
[csharp] view plaincopyprint?



任何事件处理程序都可以是协同程序 。
注意你不能在Update或FixedUpdate函数内使用yield,但是你能使用 StartCoroutine  开始一个函数.
查看 YieldInstruction , WaitForSeconds , WaitForFixedUpdate , Coroutine  and MonoBehaviour.StartCoroutine  可以获得更多使用yield的信息.
yield return可以看做是一种特殊的return,会返回到父类继续执行,但是yield return后面的类型或方法会有一个执行条件,当条件满足时会回调包含yield的子函数,例如下面代码
例1:
[csharp] view plaincopyprint?



在执行yield return new WaitForSeconds(waitTime)时暂停的条件没有满足,故返回到start函数中继续执行,直到满足条件后再回调WaitAndPrint,所以输出为:
Starting:0
Before WaiAndPrint:0
WaitAndPrint:2.12291
例2:
[csharp] view plaincopyprint?




因为start为顶级函数,所以会阻塞在这里,直到StartCoroutine(WaitAndPrint(2.0F))执行完毕,输出为:
starting:0
WaitAndPrint:2.00315
done:2.00315
[csharp] view plaincopyprint?





作者: nts    时间: 2013-10-13 11:14
这个应该是C#专用吧
作者: 幸福小猪    时间: 2013-10-28 10:57
感谢楼主分享




欢迎光临 纳金网 (http://c-www.narkii.com/club/) Powered by Discuz! X2.5