发布时间:2017-06-26责任编辑:朱明 浏览:2017
协程,即协同程序,它是一个函数,能够在执行到yield语句时将执行挂起,直到满足yield指令的条件时,再执行下面的内容.让我们看一下一个简单协程的代码:
IEnumerator MyCoroutine()
{
yield return WaitForSeconds(1f);
Debug.Log("Call Coroutine!!!");
}
上面的协程开始执行后,会在等待1秒钟之后执行yield return 语句下面的代码。
对于协程的基本使用,Unity为我们提供了3个方法,可以实现:
1 开始一个协程 StartCoroutine()
2 结束一个协程 StopCoroutine()
3 结束在一个behaviour上运行的全部协程 StopAllCoroutine()
在实际使用协程之前,对于协程的执行机制,我们首先要认识的一点是,协程不是线程,并不是异步执行的。协程与Update函数一样,也是在MainThread中执行的。协程是一个分部执行,在遇到yield语句时会将函数的执行挂起,直到yield指令的条件满足时才会被唤醒继续执行后面的代码。就像Update函数的处理一样,Unity在每一帧都会去处理对象上的协程。在对象上运行的协程,它的执行是在Update函数之后,LateUpdate函数之前进行的,验证协程执行顺序的测试代码如下所示:
void Start()
{
StartCoroutine(Test());
}
void Update()
{
Debug.Log("Call Update()!!!");
}
void LateUpdate()
{
Debug.Log("Call LateUpdate()!!!");
}
IEnumerator Test()
{
yield return null;
while (true)
{
Debug.Log("Call Coroutine!!!");
yield return null;
}
}
代码执行时后台的打印信息如图所示:
接下来,让我们结合测试代码及后台的输出结果,验证一下协程在每一帧的调用顺序。首先,我们在Start函数中开始了一个协程Test,进入Test函数内部,yield 语句会在执行到这行代码之后,将控制权立即交还给外部调用的方法。所以,我们在第一帧并没有看到“Call Coroutine!!!”信息的输出。yield return null,会让协程在同一帧被再次唤醒。因此从下一帧开始,我们可以清楚地看到,后台的输出信息按照Update-Coroutine-LateUpdate的顺序,循环出现,这也验证了我们一开始所说的协程在每一帧的调用顺序。
通过对协程的使用,我们可以方便的实现经验条、血条增减的渐变,以及倒计时数字递减的效果等。
战国工作室 供稿