Unity中协程使用浅记-新闻详情

Unity中协程使用浅记


发布时间:2017-06-26责任编辑:朱明 浏览:2017


协程,即协同程序,它是一个函数,能够在执行到yield语句时将执行挂起,直到满足yield指令的条件时,再执行下面的内容.让我们看一下一个简单协程的代码:

    IEnumerator MyCoroutine()

    {

         yield return WaitForSeconds1f;

        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;

        }

    }

代码执行时后台的打印信息如图所示:

 

Unity中协程使用浅记-1.png

 

    接下来,让我们结合测试代码及后台的输出结果,验证一下协程在每一帧的调用顺序。首先,我们在Start函数中开始了一个协程Test,进入Test函数内部,yield 语句会在执行到这行代码之后,将控制权立即交还给外部调用的方法。所以,我们在第一帧并没有看到“Call Coroutine!!!”信息的输出。yield return null,会让协程在同一帧被再次唤醒。因此从下一帧开始,我们可以清楚地看到,后台的输出信息按照Update-Coroutine-LateUpdate的顺序,循环出现,这也验证了我们一开始所说的协程在每一帧的调用顺序。

    通过对协程的使用,我们可以方便的实现经验条、血条增减的渐变,以及倒计时数字递减的效果等。



战国工作室   供稿