其实就是yield在unity3d里面的用法,yield是javascript 1.7版本引进的新的特性,借鉴了c#的一些做法,网上大部分的教程都是关于迭代器跟生成器(iterator&generator)的。Unity3d的脚本里面(无论是js还是c#)大量使用了这个关键字,作为一个以前没开发过脚本的土鳖猿看得似懂非懂。找了些资料,总结如下。
先解释下协同函数:一种可以中途停止执行等待某种条件吻合再继续执行的函数。
一般如下:
-
function TestCoroutines()
-
{
-
doSomething();
-
yield;
-
doOtherthing();
-
}
当调用这个函数的时候,它的执行跟普通函数类似,正常执行,直到到达yield语句,然后返回到调用该函数的代码段;从这点来说,yield跟return类似。区别就在于,yield后面的代码部分将在一定延迟后继续执行(上面代码中的doOtherthing
()部分),而return将永远不会执行后面的了。而具体延迟多少取决与sdk。对与unity3d来说,delay为下一帧(对于iterator来说,delay为下一次调用next方法)。
测试代码:
-
function test()
-
{
-
Debug.Log("2nd step");
-
yield WaitForSeconds(2);
-
Debug.Log("4th step");
-
}
-
-
void Start()
-
{
-
Debug.Log("1st step");
-
yield;
-
test();
-
Debug.Log("3rd step");
-
}
假设每一帧间隔0.1秒,上面代码的Log将如下:
-
0.00:1st step
-
0.10:2nd step
-
0.10:3rd step
-
2.10:4th step
yield可以什么都不带,也可以返回另一个协同函数,或者一个WaitForSeconds函数,各表示不同的延时:
什么都不带:延时一帧
带另一个协同函数:延时到另一个协同函数完全执行完毕
带WaitForSeconds:延时对应秒数。
还是上面的例子,稍微改变下:
-
function test()
-
{
-
Debug.Log("2nd step");
-
yield WaitForSeconds(2);
-
Debug.Log("4th step");
-
}
-
-
void Start()
-
{
-
Debug.Log("1st step");
-
yield test(); //这是改变的地方
-
Debug.Log("3rd step");
-
}
新的Log将如下:
-
0.00:1st step
-
0.00:2nd step
-
2.00:4th step
-
2.00:3rd step
看到差别了吧。
阅读(4001) | 评论(0) | 转发(0) |