前言
Unity3D中的协程一直是我心目中最好用最优雅的部分,今天就花三分钟时间总结一下协程相关的知识,方便各位初学者快速入门
什么是协程?
在unity3D中,协程可以理解为MonoBehaviour中另一个Update函数,但不同的是他可以分帧执行,就是说我们可以在第一帧执行一次,然后在第N帧再执行一次,最终完成整个函数。
怎么用?
一般来说就两步
(1)写一个返回值类型为IEnumerator的函数,相比一般函数,return要替换为yield return xxx。
(2)在该脚本的真正逻辑中调用这个函数。调用方法是StartCoroutine(“方法名”)或者StartCoroutine( 方法名( [参数] ) )。
一段最简的携程代码如下:
void Start (){StartCoroutine(CoroutineFunction());}IEnumerator CoroutineFunction(){Debug.Log("调用了协程");yield return null;}
当然这一段代码是没实际作用的,只是让初学者明白协程的使用方法。下面介绍应用场景时会有更有用的代码。
为什么要用协程?一般应用场景是什么?
根据本人经验,协程的应用场景一般有三
1,定时器。有的代码不需要也不允许每帧执行一次,只需定时执行,这时就可以用协程来实现。
void Start (){StartCoroutine( TimeCounter() );}int count = 0;IEnumerator TimeCounter(){while (true){yield return new WaitForSeconds(3);Debug.Log("第" + ++count + "个三秒");}}
2,分帧执行复杂逻辑
有的计算(比如大数的运算、图片模型的处理)一帧计算不完,不能放在update中;但放在start中又会导致程序卡死,这个时候就可以用协程来解决问题。
下面是一段程序实例,每帧只执行100次循环,最终逐步执行完整个代码。
void Start (){StartCoroutine(ComplexCalculater() );}IEnumerator ComplexCalculater(){for(long i = 0;i < 10000000; i++){if(i % 100 == 0)yield return null;Debug.Log(i);}}
3,按序执行程序逻辑
这个例子我想了一会,觉得玩过《和平精英》的读者很容易理解:玩家死之后不能立刻消失,要把自己的装备盒放到地上再默默升天~
这个时候如果用普通的程序逻辑,你要时刻检测是不是把盒子放到地上了,是不是动画播放完了,是不是该归西了。。。很麻烦,而协程只需几句代码就能完成,伪码如下:
void Start (){if(health == 0)StartCoroutine( Die() );}IEnumerator Die(){把装备盒放到地上();yield return null;挥挥手();yield return null;升天();yield return null;销毁对象();yield return null;}
注意事项
怎么样,协程是不是很方便?但是协程虽好,也不能乱用。每个协程函数至少要执行两帧才能完成,性能肯定略差于普通函数,定时器的话用Invoke、InvokeRepeat也能完成,具体取舍还是要看项目需要哦。
(如果有技术问题,随时欢迎在下面留言咨询)