【Unity3D】三分钟掌握unity3D中的协程(Coroutine)

    xiaoxiao2022-07-13  192

    前言

         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也能完成,具体取舍还是要看项目需要哦。

    (如果有技术问题,随时欢迎在下面留言咨询)

    最新回复(0)