首先,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