协程的作用一共有两点:
1)延时(等待)一段时间执行代码;
2)等某个操作完成之后再执行后面的代码。
简单来说,协程就是:你可以写一段顺序的代码,然后标明哪里需要暂停,然后在下一帧或者一段时间后,系统会继续执行这段代码。
Unity一个协程函数的返回值是IEnumerator,它是一个迭代器。
下面是协程实现的原理
for(float timer = 3; timer >= 0; timer -= Time.deltaTime)
{
//空,什么都不执行
Just do nothing...
}
Debug.Log("三秒过去了");
协程的代码
using UnityEngine;
using System.Collections;
public class CoroutineCountdown : MonoBehaviour
{
void Start()
{
//启用协程的代码,不写的话协程不会执行
//必须在Start里启用
StartCoroutine(Countdown());
}
//协程的接口,直接在里面实现即可
IEnumerator Countdown()
{
//表示延迟的时间,延时两秒
yield return new WaitForSeconds(2);
}
}
//终止掉所有协程
StopAllCoroutines();
//终止掉一个协程
StopCoroutine();//传入方法名或者方法的"字符串"
下面是解释yield的作用
void Start()
{
StartCoroutine(Countdown());
}
IEnumerator Countdown()
{
for(float timer = 3; timer >= 0; timer -= Time.deltaTime)
//告诉上面停止这个方法,然后重新开始
//循环三次后for循环条件无法满足就无法执行这条代 // 码,然后三秒过去了
yield return 0;
//可以直接这样写比较精简
//yield return new WaitForSeconds(3);
Debug.Log("三秒过去了");
}
为了能在连续的多帧中(在这个例子中,3秒钟等同于很多帧)调用该方法,Unity必须通过某种方式来存储这个方法的状态,这是通过IEnumerator 中使用yield return语句得到的返回值,当你“yield”一个方法时,你相当于说了,“现在停止这个方法,然后在下一帧中从这里重新开始!”。
注意:用0或者null来yield的意思是告诉协程等待下一帧,直到继续执行为止。当然,同样的你可以继续yield其他协程。
有什么不对的地方欢迎指出 ,一起学习