Unity StartCoroutine 和 yield return 深入研究

转自: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

其实再回过头来想想,协程->协同程序->其实就是协同两个任务,表面看起来很简单,但是在一些稍微大点的项目中用起来,对于新手来说还是会有些晦涩。。。

比如说

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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!

 

分类: .Net C#, Unity3D
谢谢推荐! 关注我 收藏该文
0
0
请先 登录

« 上一篇: Unity3D在NGUI中使用mask
» 下一篇: Protobuf语言指南
    </div>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容使用说明 YOLO高分设计资源源码,详情请查看资源内容使用说明 YOLO高分设计资源源码,详情请查看资源内容使用说明 YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值