Chinaunix首页 | 论坛 | 博客
  • 博客访问: 184497
  • 博文数量: 13
  • 博客积分: 265
  • 博客等级: 二等列兵
  • 技术积分: 402
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-16 17:19
文章分类

全部博文(13)

文章存档

2014年(2)

2013年(2)

2012年(9)

我的朋友

分类: C#/.net

2014-07-22 14:51:33

其实就是yield在unity3d里面的用法,yield是javascript 1.7版本引进的新的特性,借鉴了c#的一些做法,网上大部分的教程都是关于迭代器跟生成器(iterator&generator)的。Unity3d的脚本里面(无论是js还是c#)大量使用了这个关键字,作为一个以前没开发过脚本的土鳖猿看得似懂非懂。找了些资料,总结如下。

先解释下协同函数:一种可以中途停止执行等待某种条件吻合再继续执行的函数。

一般如下:
  1. function TestCoroutines()
  2. {
  3.     doSomething();
  4.     yield;
  5.     doOtherthing();
  6. }
当调用这个函数的时候,它的执行跟普通函数类似,正常执行,直到到达yield语句,然后返回到调用该函数的代码段;从这点来说,yield跟return类似。区别就在于,yield后面的代码部分将在一定延迟后继续执行(上面代码中的doOtherthing()部分),而return将永远不会执行后面的了。而具体延迟多少取决与sdk。对与unity3d来说,delay为下一帧(对于iterator来说,delay为下一次调用next方法)。

测试代码:
  1. function test()
  2. {
  3.     Debug.Log("2nd step");
  4.     yield WaitForSeconds(2);
  5.     Debug.Log("4th step");
  6. }

  7. void Start()
  8. {
  9.     Debug.Log("1st step");
  10.     yield;
  11.     test();
  12.     Debug.Log("3rd step");
  13. }
假设每一帧间隔0.1秒,上面代码的Log将如下:
  1. 0.00:1st step
  2. 0.10:2nd step
  3. 0.10:3rd step
  4. 2.10:4th step

yield可以什么都不带,也可以返回另一个协同函数,或者一个WaitForSeconds函数,各表示不同的延时:
什么都不带:延时一帧
带另一个协同函数:延时到另一个协同函数完全执行完毕
带WaitForSeconds:延时对应秒数。

还是上面的例子,稍微改变下:
  1. function test()
  2. {
  3.     Debug.Log("2nd step");
  4.     yield WaitForSeconds(2);
  5.     Debug.Log("4th step");
  6. }

  7. void Start()
  8. {
  9.     Debug.Log("1st step");
  10.     yield test(); //这是改变的地方
  11.     Debug.Log("3rd step");
  12. }
新的Log将如下:
  1. 0.00:1st step
  2. 0.00:2nd step
  3. 2.00:4th step
  4. 2.00:3rd step
看到差别了吧。

阅读(4010) | 评论(0) | 转发(0) |
0

上一篇:ffmpeg学习笔记(一):解码篇

下一篇:没有了

给主人留下些什么吧!~~