应用在后台时,Time.unscaledDeltaTime 仍在计算。

4
我只是使用一段通用的代码在更新函数中计算玩家已经玩了多长时间:
float time;

void Update()
{
    time += Time.unscaledDeltaTime;
}

以下是问题:

当我在安卓设备上按home键或浏览其他应用程序时,计时器仍然在计数。因此,如果我在主屏幕或其他应用程序屏幕中等待一段时间,然后回到游戏中,计时器会包括即使我已经离开了该应用程序的时间。游戏状态保持不变,但只有计时器改变。

可能的原因是什么?如何防止应用程序失去焦点时计时器继续计数?


你在哪个函数中执行这个操作:time += Time.unscaledDeltaTime;?当你使用 Time.deltaTime 时会发生什么? - Programmer
代码是在更新中执行的。我有一些游戏能力可以减慢时间,但我不希望计时器受到影响。 - Bagumus
我知道这就是人们使用unscaledDeltaTime的原因。我不会告诉你把它作为解决方案来使用。如果你使用它会发生什么?记得我问了两个问题,你只回答了一个。 - Programmer
你是在问我如果我使用增量时间,这个错误是否仍然会发生,还是在问游戏问题。很抱歉,我无法理解你的问题。 - Bagumus
刚刚测试了一下,看起来当使用deltatime时,游戏停止的情况并不是由于bug引起的。你有什么想法,如何使减速时间能力在使用deltatime时不影响计时器呢? - Bagumus
显示剩余2条评论
1个回答

4
Time.unscaledDeltaTime的正常值通常在0.01687395左右。当使用Time.unscaledDeltaTime时,即使将焦点移出应用程序,它仍在后台累加。一旦返回应用程序,Time.unscaledDeltaTime的值将是您离开应用程序的秒数x。
例如,如果您将焦点从应用程序中移出15秒钟,然后返回,第一帧中Time.unscaledDeltaTime的输出将为15,然后跳回到大约0.01687395。变量Time.deltaTime没有这个问题,但它也不是一个选项,因为更改Time.timeScale会影响它。
解决方案是使用OnApplicationFocusOnApplicationPause来检测应用程序何时再次运行,然后在第一帧中跳过添加Time.unscaledDeltaTime,因为那个第一帧实际上是Time.unscaledDeltaTime是您离开应用程序的秒数x。
以下是一个可行的解决方案:
public Text text;
float currentTime = 0;
private bool skipFrame = false;

void Update()
{
    //Add only when we don't need to skip frame
    if (!skipFrame)
    {
        currentTime += Time.unscaledDeltaTime;
        text.text = currentTime.ToString();
    }

    //We need to skip frame. Don't use Time.unscaledDeltaTime this frame
    else
    {
        skipFrame = false;
        Debug.LogWarning("Filtered accumulated Time when Paused: " + Time.unscaledDeltaTime);
    }
}


void OnApplicationFocus(bool hasFocus)
{
    //Enable skipFrame when focoused in app
    if (hasFocus)
    {
        //Debug.Log("Has focus");
        skipFrame = true;
    }
}

void OnApplicationPause(bool pauseStatus)
{
    //Enable skipFrame when coming back from exiting app
    if (!pauseStatus)
    {
        //Debug.Log("UnPaused");
        skipFrame = true;
    }
}

我有几个问题:在所有基于时间的事件中,我是否应该使用currentTime(还是只需使用我使用的浮点值)?或者我需要在update中将currentTime添加到我的计时器中吗?我对如何将其实现到我的代码中感到困惑。 - Bagumus
只需将以下内容复制并粘贴到您的代码中即可。我将您的“time”重命名为“currentTime”,并使用“currentTime”作为应用程序已打开的总时间。就这样。 - Programmer
我尝试使用相同的代码来制作一个倒计时器(它应该从15开始倒数),但仅仅在timer和unscaledDeltaTime之间加上“-”并没有起作用。有什么提示吗? - Bagumus
1
相同的代码应该适用于倒计时。currentTime -= Time.unscaledDeltaTime; 如果你能创建一个新的问题,附上你的代码并描述倒计时的问题,我会帮你看一下。 - Programmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接