有关协程的理解

转自:https://blog.csdn.net/u013477973/article/details/55804729

IEnumerator Wait(float waitTimeValue){

//things before wait

yield return new WaitForSeconds(waitTimeValue);

//thigs after wait;

}

SatrtCoroutine(Wait(5.0f));

刚接触StartCoroutine时,只知道可以通过这种方式进行延时操作,至于IEnumerator类型,yield return这种奇怪的语句以及

调用的时候要在StartCoroutine()里进行这几个问题,一直是一脸蒙蔽,什么鬼嘛这是,

在慢慢看了一些博主的文章后,对这几个问题有了初步的认识,就在这里记录下来:

1.IEnumerator

IEnumerator和yield return会构造出一个迭代器,迭代器几乎经常在用,例如:

int[] array=new int[]{1,2,3};

foreach(int i in array){

print(i);

}

数组的遍历过程实际上就是一个迭代器应用过程,只不过这个迭代器是由编译器帮我们实现,在编译器的内部,上面的代码类似这个样子(真正的比下面的要复杂):

int[] array=new int[]{1,2,3};

IEnumerator e=array.GetEnumerator();

while(e.MoveNext()){

print(Current);

}

至于迭代器内的方法MoveNext()和属性Current是IEnumerator这个接口定义的,这里是IEnumerator的完整声明:

public interface IEnumerator
{
//
// 摘要:
// 获取集合中的当前元素。
//
// 返回结果:
// 集合中的当前元素。
//
// 异常:
// T:System.InvalidOperationException:
// 枚举数定位在该集合的第一个元素之前或最后一个元素之后。
object Current { get; }

    //
    // 摘要:
    //     将枚举数推进到集合的下一个元素。
    //
    // 返回结果:
    //     如果枚举数成功地推进到下一个元素,则为 true;如果枚举数越过集合的结尾,则为 false。
    //
    // 异常:
    //   T:System.InvalidOperationException:
    //     在创建了枚举数后集合被修改了。
    bool MoveNext();
    //
    // 摘要:
    //     将枚举数设置为其初始位置,该位置位于集合中第一个元素之前。
    //
    // 异常:
    //   T:System.InvalidOperationException:
    //     在创建了枚举数后集合被修改了。
    void Reset();
}

2.yield return是干什么的

yield return 是C#2.0以后引入的现实迭代器的一种简便语法,在之前如果要实现一个完整的迭代器
需要实现IEnumerable和IEnumerator这两个接口,而使用yield retrun可以省略这两个步骤:
例如:
IEnumerator Test(){
yield return 1;
yield retutn 2;
yield retrun 3;
}
编译器会生成类似代码:
public class InnerEnumerable:IEnumerable{
public class InnerEnumerator:IEnumerator{
int[] array=new int[]{1,2,3};
int currentIndex=-1

public bool MoveNext(){
++currentIndex;
return current

你可能感兴趣的:(游戏开发)