Unity Coroutine 协程 (一)

首先,C#里function我们在调用的时候,是会在一帧中全部执行完。所以如果一个方法类似于这样

private void ScaleChangeFx() {
            float timeStart = Time.time;
            while (Mathf.Abs(Time.time-timeStart) <= scaleRecoverIntervalTime)
            {
                transform.localScale = Vector3.Lerp(transform.localScale, baseScale, (Time.time - timeStart) / scaleRecoverIntervalTime);
            }
        }

那么这个方法在你调用的时候就会在这一帧中反复循环,然后Unity就卡住了。(嗯,这时候就只能用任务管理器把Unity关闭了,别问我为啥知道)

那么问题来了,我们知道这样一个插值的功能需要使用协程这样的东西来实现,那么到底怎么实现呢。

IEnumerator ScaleChangeFx()
        {
            while (Mathf.Abs(Time.time - timeStart) <= scaleRecoverIntervalTime)
            {
                transform.localScale = Vector3.Lerp(transform.localScale, baseScale, (Time.time - timeStart) / scaleRecoverIntervalTime);
                yield return null;
            }
        }

这段代码中可以看到,ScaleChangeFx里面是一个while循环,在执行transform变换后,有一个yield return null,这个就是每一个IEnumerator中都需要返回的一个东西。这里因为我没有需要返回的东西,所以就直接写了null。

前面function也就是方法method是必须在一帧之内全部完成的指令,但是协程这段代码的执行可以跨帧执行。既然跨帧执行,那么我们怎么判定这段代码中哪些要这一帧执行,哪些要下一帧执行呢。yield return 这个代码相当于是一个标志,标志着执行到这个地方停一下,咱下一帧继续。

所以整个IEnumerator中的代码的执行顺序其实就和function的执行顺序是一样的,就是yield return 造成了一种时间上的间隔罢了。

参考资料:file:///D:/Program%20Files/Unity/Editor/Data/Documentation/en/Manual/Coroutines.html

猜你喜欢

转载自blog.csdn.net/qq_14812585/article/details/85161658