即使app在后台,Time.unscaledDeltaTime仍在计算中

时间:2017-09-30 14:48:33

标签: c# android unity3d timer game-engine

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

float time;

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

问题在于:

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

可能是什么原因以及如何在应用程序没有焦点时阻止计时器计数?

1 个答案:

答案 0 :(得分:3)

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;
    }
}