unity中协程的简单使用

StartCoroutine(MoveToPath());//开始协程
StartCoroutine("MoveToPath");
private IEnumerator MoveToPath()//返回IEnumerator
{	
	//先执行
	yield return new WaitForSeconds(1);//协程执行时间
	//1秒后执行
}
StopCoroutine("MoveToPath");//暂停协程
**

yield return null:协程将在下一帧所有脚本的Update执行之后,再继续执行.
yield return WaitForSeconds:协程在延迟指定时间,且当前帧所有脚本的 Update全都执行结束后才继续执行.
yield return WaitForFixedUpdate:协程在所有脚本的FixedUpdate执行之后,再继续执行.
yield return WWW:协程在WWW下载资源完成后,再继续执行.
yield return StartCoroutine:协程在指定协程执行结束后,再继续执行.
WaitForSecondsRealtime:与WaitForSeconds类似,但不受时间缩放影响.
WaitWhile:当返回条件为假时才执行后续步骤.
注意事项
在程序中调用StopCoroutine()方法只能终止以字符串形式启动(开始)的协程

多个协程可以同时运行,它们会根据各自的启动顺序来更新

协程可以嵌套任意多层

如果你想让多个脚本访问一个协程,那么你可以定义静态的协程

协程不是多线程,它们运行在同一线程中,跟普通的脚本一样

协程主要是update()方法之后,lateUpdate()方法之前调用的

如果你的程序需要进行大量的计算,那么可以考虑在一个随时间进行的协程中处理它们

IEnumerator类型的方法不能带ref或者out型的参数

我的理解
协程的作用不只是暂停,它可以用来在加载大量资源的时候分步执行,可以更快的进入游戏,随着游戏的进行逐步加载,而不用在进入游戏时长时间等待。

C#yield return

yield return 的作用是保存当前函数状态(就是当前函数执行到什么地方,也就上下文)退出当前函数,下次调用时继续从当前位置处理。
yield break就是退出迭代。
实际上是返回了自动实现了IEnumerator中的方法的对象

C#迭代器

只要类继承了IEnumerable接口或者实现了GetEnumerator()方法,就可以使用foreach去遍历

其中IEnumerable是迭代类成员(方法),GetEnumerator()是迭代类

而C#2.0之后就可以使用yield return了,就不用实现IEnumerator接口中的方法

迭代器结合上yield return,就可以分步调用方法中的语句了

IEnumerable和IEnumerator接口具体为:

public interface IEnumerable
    {
    	//返回循环访问集合的枚举数。
        IEnumerator GetEnumerator();
    }
   
    public interface IEnumerator
    {
        //获取集合中的当前元素。
        object Current { get; }
		//如果枚举数已成功地推进到下一个元素,则为 true;如果枚举数传递到集合的末尾,则为 false。
        bool MoveNext();
        // 将枚举数设置为其初始位置,该位置位于集合中第一个元素之前。
        void Reset();
    }

IEnumerable简单使用

//这是迭代方法,迭代对象要实现GetEnumerator()方法,在GetEnumerator()使用yield return
public static IEnumerable SimpleList()
{
	yield return"string 1";
	yield return"string 2";
	yield return"string 3";
}
static void Main(string[]args)
{
	foreach(string item in SimpleList())
		Console.WriteLine(item);
	Console.ReadKey();
}

IEnumerator简单使用

//要迭代的类
    class Class1
    {
        public IEnumerator GetEnumerator()
        {
            yield return "string 1";
            yield return "string 2";
            yield return "string 3";
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Class1 class1 = new Class1();
            foreach(string item in class1)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }
    }

协程的原理

当开启一个IEnumerator(迭代器),协同程序开始执行,在执行到yield return 之前和一般的程序没有任何区别,遇到yield return 之后立即返回,并将之后的代码挂起。在下一帧遇到FixedUpdate或者Update之后判断yield return后边的条件是否满足,如果满足,向下继续执行。

目前不懂的地方:如何根据条件判断是否满足和迭代器在哪里进行的调用

StartCoroutine其实是向某个对象中的IEnumerator数组添加一个实现了IEnumerator接口的对象(yield自动实现了),迭代器中有个可以存放多个类似WaitForSeconds的数组,在存放IEnumerator数组的对象中通过类似update这种更新函数中对IEnumerator数组进行统一的判断和管理,根据类似WaitForSeconds类型的不同,执行不同的条件判断,根据判断的结果来确定IEnumerator对象是否进行MoveNext(),不满足条件进行下次更新,满足就对下一个类似WaitForSeconds的对象进行迭代