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的对象进行迭代