【问题标题】:Time.unscaledDeltaTime still counting even when app is in background即使应用程序在后台,Time.unscaledDeltaTime 仍然计数
【发布时间】:2017-09-30 14:48:32
【问题描述】:

我只是使用一个通用代码来计算玩家在更新功能中玩了多长时间:

float time;

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

问题来了:

当我按下我的 Android 设备上的主页按钮或浏览过去的应用程序时,计时器仍然计数。因此,如果我在家里或其他应用程序屏幕中等待一段时间并返回游戏,即使我已经退出应用程序,计时器也会包括时间。游戏状态保持原样,但只有计时器发生变化。

可能是什么原因,当应用程序没有焦点时,如何防止计时器计数?

【问题讨论】:

  • 你执行的是哪个函数:time += Time.unscaledDeltaTime;?当你使用Time.deltaTime 时会发生什么?
  • 代码在更新中执行。我在游戏中有减慢时间的能力,我不希望计时器受此影响。
  • 我知道这就是人们使用 unscaledDeltaTime 的原因。我不会告诉你用它作为你的解决方案。你用它会发生什么?请记住,问了两个问题,你只回答了一个。
  • 你是在问我如果我使用增量时间,这个错误是否仍然发生,或者你是在问游戏前置问题。很抱歉,我无法理解您的问题。
  • 我问你如果你使用增量时间,这个错误是否仍然会发生。

标签: c# android unity3d timer game-engine


【解决方案1】:

来自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(或者只使用我使用的浮点值而不是 currentTime),还是我需要在更新时将 currentTime 添加到我的计时器中?我对如何在我的代码中实现这一点感到困惑。
  • 您无需做其他任何事情。只需将其复制并粘贴到您的代码中即可。我将您的 time 重命名为 currentTime 并使用 currentTime 作为应用程序打开的总时间。就是这样。
  • 我尝试对倒数计时器使用相同的代码(它应该从 15 开始倒数),但只是在计时器和 unscaledDeltaTime 之间添加一个“-”不起作用。有什么建议吗?
  • 相同的代码应该适用于倒计时。 currentTime -= Time.unscaledDeltaTime;如果你可以用你的代码创建一个新问题并描述计数问题,我会看看它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 2012-05-27
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多