1.协程概念
2.协程函数的定义
3.协程函数的使用
4.协程函数的停止
1.协程概念
协程就是“协同程序”,并不是多线程(虽然在使用上与多线程有一定相似地方,但本质上不是一个东西)
既然叫协同,所以还有一个主程序,那么这个主程序其实就是我们目前学习到的各种生命周期函数(一个游戏物体产生有Start,Update,OnDestory一些生命周期函数,这个协同是在生命周期外的存在)
为什么需要协程?
主程序已经在执行某个任务,希望“同时运行”其他逻辑,这里的同时,并不是多线程意义上的同时,只是感官上是同时
2.定义协程函数
public IEnumerator Demo() //IEnumerator 协程特定返回值类型
{
Debug.Log("先做一些事情");
yield return new WaitForSecond(1.0f); //等待1秒钟
Debug.Log("后做一些事情"); //这里正常执行,协程不会因为前面返回则不执行后面的代码。协程函数必须有返回值,但可以不走到那,比如if(2<1)yield return new WaitForSeconds(5.0f);
yield return null; //下一帧继续执行
Debug.Log("最后做一些事情");
}
这么写会立刻按顺序打印出"abc123" "1.0s"
一些英语翻译:使用百度翻译
IEnumerator 迭代器;枚举器;列举器;接口
yield 提供;让步;
普通函数里不能用yield,迭代器(协程)函数不能用return。
break;和yield break;一个效果,都中断循环。
不过yield break是中断整个协程。
break只是跳出while。
yield return可以返回另一个协程。比如:yield return Demo2();
通过这样来调用另一个协程。不过这样会跳出当前协程。
3.使用协程函数
Coroutine StartCoroutine(Demo("这是参数"))
Coroutine是返回值类型。翻译为:协同程序。
执行一个协程,参数直接调用协程方法即可。可以用一个变量接受返回值用于后续停止该协程
我们在生命周期函数中调用协程,但是协程的运行顺序和主程序无关,可以理解成开了一个分支专门运行这个协程,如果我们打开了多个协程,这些协助之间也无关
例1:两种执行协程方法
void Start()
{
StartCoroutine("Demo"); //执行协程,无法有参数
StartCoroutine(Demo());//执行协程,可以有参数。主要用这种方法
}
例2:每隔0.1秒旋转一次
void Start()
{
StartCoroutine(Demo());
}
public IEnumerator Demo()
{
while(true)
{
yield return new WairForSeconds(0.1f);//暂停0.1秒,协程yield return不结束函数。
transform.Rotate(new Vector3(5,0,0));
}
}
例3:
效果是先打印“1.0s”,过5秒再打印"abc123"。如果直接写Demo();调用协程没有效果。
例4:
break;和yield break;一个效果,都中断循环。
不过yield break是中断整个协程。
break只是跳出while。
例5:yield return另一个协程函数来执行它
例6:位移一下后,中断自己执行Demo2()
yield return可以返回另一个协程。比如:yield return Demo2();
通过这样来调用另一个协程Demo1。不过这样会跳出当前协程Demo2。
4.停止协程函数
协程如果运行到最后一行,意味着停止,但是如果我们想主动停止。
StopAllCoroutines():结束全部协程
StopCoroutines:结束某个协助程序:有三种用法如下:
StopCoroutine(IEnumerator routine);和调用协程一样使用,但是如果协程有参数不要使用这个
StopCoroutine(Coroutine routine):参数填写协程变量
StopCoroutine(string methodName):参数填写协程方法的名
while(true)会一直执行下去,要停止它,一个方法是加入一个终止条件,另一个办法是停止协程函数。
StopCoroutine(Demo())这种写法会结束所有Demo同名协程。
而用返回值可以关掉指定的协程,因为开始协程函数会返回一个Coroutine类型的返回值。
Coroutine StartCoroutine(Demo("这是参数"));
比如Coroutine cor1 = Demo();StopCoroutine(cor1);可关掉Demo这个协程。
而且由他调用的协程也会在执行所有代码后关闭。
例1:协同程序Demo3将在5s后结束所有协同程序
例2:5s后方块不再旋转,且在打印一遍“结束了”后不会再打印了。
例3:只关掉了一个Demo,另一个还在正常工作:旋转方块、打印消息