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

前言

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

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

你可能感兴趣的:(协程,Unity3D,U3D,游戏开发,Unity3D)