***************** 更新 *******************
今天发现原来UnityEngine里有自带的unscale time的WaitForSecondsRealtime
所以要用的真实事件的Coroutine,直接用官方的就好啦!
***************原文如下:
原文地址:https://blogs.unity3d.com/cn/2015/12/01/custom-coroutines/
这里做一下简单的翻译和解释:
Time.timeScale会影响Unity3d和时间有关的东西,比如FixUpdate。
当Time.timeScale = 0时,FixUpdate不执行,Update和LateUpdate会执行,但是Time.deltaTime是0;
如果你在Coroutine里使用到了yield return new WaitForSeconds方法,当Time.scaleTime为0的时候,很遗憾,Coroutine的时间不会累加,因为WaitForSeconds是和timeScale挂钩的。
所以当我们需要使用真实时间的时候,我们可以这样:
public class WaitForSecondsRealtime : CustomYieldInstruction
{
private float waitTime;
public override bool keepWaiting
{
get
{
return Time.realtimeSinceStartup < waitTime;
}
}
public WaitForSecondsRealtime(float time)
{
waitTime = Time.realtimeSinceStartup + time;
}
}
这边继承了CustomYieldInstruction这个类来实现自定义Coroutine
然后在我们的代码出进行更换:
//yield return new WaitForSeconds(5f);
yield return new WaitForSecondsRealtime(5f);
当然我们这帮码农的时间很宝贵要用来打打Dota和LOL,所以我们可能只有几个地方要换一下或者我们压根不想写这个自定义Coroutine,那我们可以在你的Coroutine代码里这样写:
float endPauseTime = Time.realtimeSinceStartup + waitTime;
yield return new WaitWhile(() => Time.realtimeSinceStartup < endPauseTime);