shengyingwang 2010-04-16
Coroutines & Yield是Unity3D编程中重要的概念,它可以实现将一段程序延迟执行或者将其各个部分分布在一个时间段内连续执行,但是在Javascript与C#中实现Coroutines & Yield,在语法上却有一些区别:
yield不可单独使用
需要与return配合使用,例如:
1yieldreturn0;//等0帧
2yieldreturn1;//等1帧
3yieldreturnWaitForSeconds(3.0);//等待3秒
所有使用yield的函数必须将返回值类型设置为IEnumerator类型,例如:
1IEnumeratorDoSomeThingInDelay(){...}
最后,也是在”UsingC#”这个章节中没有讲到的关键一点是,所有IEnumerator类型函数必须使用”StartCoroutine”这个函数触发,不能单独使用,例如:
1StartCoroutine(DoSomeThingInDelay());
最后附上学习Coroutines&Yield时所做的小例子,脚本的作用是不断随机改变材质的颜色,演示demo使用”V字仇杀队”中的面具。
01usingUnityEngine;
02usingSystem.Collections;
03
04publicclassRandomColor:MonoBehaviour{
05
06publicfloatdelayInSecond=1;
07publicMaterialtargetMaterial;
08
09//Usethisforinitialization
10voidStart(){
11StartCoroutine(AutoChangeColor());
12}
13
14//Updateiscalledonceperframe
15voidUpdate(){
16}
17
18IEnumeratorAutoChangeColor()
19{
20yieldreturn0;//确保Time.deltaTime为0
21
22ColorcolorNew=GenerateRandomColor();
23ColorcolorNow=targetMaterial.GetColor("_Color");
24floattimeEclapsed=0;
25for(timeEclapsed=0;timeEclapsed<delayInSecond;timeEclapsed+=Time.deltaTime)
26{
27floatprogress=timeEclapsed/delayInSecond;
28ColorcolorTween=newColor(
29(colorNew.r-colorNow.r)*progress+colorNow.r,
30(colorNew.g-colorNow.g)*progress+colorNow.g,
31(colorNew.b-colorNow.b)*progress+colorNow.b
32);
33targetMaterial.SetColor("_Color",colorTween);
34yieldreturn1;
35}
36
37StartCoroutine(AutoChangeColor());
38}
39
40ColorGenerateRandomColor(){
41Colorcolor=newColor();
42color.r=Random.value;
43color.g=Random.value;
44color.b=Random.value;
45
46returncolor;
47}
48}
<object type="application/x-shockwave-flash" style="outline:none;" data="http://cdn.abowman.com/widg