问题描述
我正在制作一个问答游戏,并希望确保用户不会因为退出该应用(而不将其关闭)而获得额外的回答时间。
我当前的计时器使用 Time.deltaTime
。我正在考虑用 DateTimeOffset.Now.ToUnixTimeMilliseconds()
(纪元时间)或 Time.realtimeSinceStartup
(不确定这是否有效)之类的东西替换它。检测用户何时关闭应用的解决方案也可以使用。
解决方法
有三个内置函数可以满足您的需求。有 OnApplication.Quit
(不适用于移动设备)、OnApplication.Pause
和 OnApplicationFocus
。
我个人喜欢使用 OnApplicationPause
而不是 OnApplicationFocus
,因为当键盘被调出时会在某些手机上调用焦点。我发现每当用户点击主页按钮、关闭应用程序、手机死机、关闭手机等时,都会调用暂停。
OnApplicationFocus
和 OnApplicationPause
的重要部分是传入了一个 bool 参数,让您知道您是未聚焦还是聚焦/未暂停或已暂停。
如果您只想知道自上次打开应用程序以来已经过去了多长时间,您可以在 bool 为 OnApplicationPause
时调用 true
后轻松在本地存储一个变量,然后当它是 false
时,您可以检测已经过去了多少时间。由于如果用户退出游戏,局部变量将不会持续存在,因此您还需要研究某种保存/加载实现。 StackOverflow 上已经有很多关于如何在 Unity 中保存数据的好答案,所以如果您需要帮助,我可以添加一个链接。
至于 OnPause
示例,我将如何使用它。
private long lastTimePaused = 0;
private void Awake
{
// setting our paused time to the start time
lastTimePaused = DateTimeOffset.Now.ToUnixTimeMilliseconds();
}
void OnApplicationPause(bool pauseStatus)
{
if(pauseStatus)
{
lastTimePaused = DateTimeOffset.Now.ToUnixTimeMilliseconds();
// save this lastTimePaused if you want the data to persist between a user quitting the app
// and coming back
}
else
{
Debug.Log("Our elapsed miliseconds is: " + (DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastTimePaused));
}
}
如果您愿意,也可以将 OnApplicationFocus
与 OnApplicationPause
一起使用。类似的东西:
private long lastTimePaused = 0;
private void Awake
{
// setting our paused time to the start time
lastTimePaused = DateTimeOffset.Now.ToUnixTimeMilliseconds();
}
void OnApplicationPause(bool pauseStatus)
{
HandlePause(pauseStatus);
}
void OnApplicationFocus(bool hasFocus)
{
HandlePause(!hasFocus);
}
private void HandlePause(bool isPaused)
{
if(isPaused)
{
lastTimePaused = DateTimeOffset.Now.ToUnixTimeMilliseconds();
// save this lastTimePaused if you want the data to persist between a user quitting the app
// and coming back
}
else
{
Debug.Log("Our elapsed miliseconds is: " + (DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastTimePaused));
}
}
我不确定您希望在用户暂停时检测哪些情况,但首先,请尝试 OnApplicationPause
以查看它是否可以处理您需要的所有内容。如果没有,您也可以将其与 OnApplicationFocus
结合使用。