我只是使用通用代码来计算玩家在更新功能中玩了多长时间:
float time;
void Update()
{
time += Time.unscaledDeltaTime;
}
这是问题所在:
当我按下Android设备上的主页按钮或浏览过去的应用程序时,计时器仍然有效。因此,如果我在家中或其他应用程序屏幕中等待一段时间并返回游戏,即使我已经退出应用程序,计时器也会包含时间。游戏状态保持原样,但只有计时器发生变化。
可能是什么原因以及如何在应用程序没有焦点时阻止计时器计数?
来自Time.unscaledDeltaTime
的正常值通常在0.01687395
附近。使用Time.unscaledDeltaTime
时,当您将焦点移出应用程序时,它仍会在后台加起来。返回应用程序后,Time.unscaledDeltaTime
的值将是您退出应用程序的x秒。
例如,如果您将焦点移出应用程序15秒然后返回,Time.unscaledDeltaTime
的输出将在第一帧中为15,然后跳回0.01687395
附近。 Time.deltaTime
变量没有这个问题,但它也不是一个选项,因为更改Time.timeScale
会影响它。
解决方案是使用OnApplicationFocus
和OnApplicationPause
检测应用程序何时再次运行,然后跳过在第一帧中添加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;
}
}