当 iPhone 用户退出到主屏幕或应用程序切换器时,如何让我的计时器保持 运行?
How can I make my timer keep running when the iPhone user quits to the home screen or the App Switcher?
我正在制作问答游戏,并希望确保用户不会通过退出应用程序(而不是关闭应用程序)而获得额外的回答时间。
我当前的计时器使用 Time.deltaTime
。我正在考虑用 DateTimeOffset.Now.ToUnixTimeMilliseconds()
(纪元时间)或 Time.realtimeSinceStartup
(不确定这是否有效)之类的东西替换它。检测用户何时关闭应用程序的解决方案也可以。
有三个内置函数可以满足您的需求。有OnApplication.Quit
(does not work on mobile), OnApplication.Pause
, and OnApplicationFocus
.
我个人喜欢使用 OnApplicationPause
而不是 OnApplicationFocus
,因为在调出键盘时会在某些 phone 上调用焦点。我发现每当用户按下主页按钮、关闭应用程序、他们的 phone 死亡、关闭他们的 phone 等时,都会调用暂停。
关于 OnApplicationFocus
和 OnApplicationPause
的重要部分是有一个 bool 参数传入,让您知道您是未专注还是专注/未暂停或暂停。
如果你只是想知道自上次打开应用程序以来已经过了多长时间,你可以在 bool 为 true
时调用 OnApplicationPause
后轻松地在本地存储一个变量, 那么当它是 false
时,你可以检测到经过了多少时间。由于如果用户退出游戏,局部变量将不会保留,因此您还需要研究某种 save/load 实现。 Whosebug 上已经有很多关于如何在 Unity 中保存数据的好答案,所以如果您需要帮助,我可以添加 link.
至于 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
.
结合使用
我正在制作问答游戏,并希望确保用户不会通过退出应用程序(而不是关闭应用程序)而获得额外的回答时间。
我当前的计时器使用 Time.deltaTime
。我正在考虑用 DateTimeOffset.Now.ToUnixTimeMilliseconds()
(纪元时间)或 Time.realtimeSinceStartup
(不确定这是否有效)之类的东西替换它。检测用户何时关闭应用程序的解决方案也可以。
有三个内置函数可以满足您的需求。有OnApplication.Quit
(does not work on mobile), OnApplication.Pause
, and OnApplicationFocus
.
我个人喜欢使用 OnApplicationPause
而不是 OnApplicationFocus
,因为在调出键盘时会在某些 phone 上调用焦点。我发现每当用户按下主页按钮、关闭应用程序、他们的 phone 死亡、关闭他们的 phone 等时,都会调用暂停。
关于 OnApplicationFocus
和 OnApplicationPause
的重要部分是有一个 bool 参数传入,让您知道您是未专注还是专注/未暂停或暂停。
如果你只是想知道自上次打开应用程序以来已经过了多长时间,你可以在 bool 为 true
时调用 OnApplicationPause
后轻松地在本地存储一个变量, 那么当它是 false
时,你可以检测到经过了多少时间。由于如果用户退出游戏,局部变量将不会保留,因此您还需要研究某种 save/load 实现。 Whosebug 上已经有很多关于如何在 Unity 中保存数据的好答案,所以如果您需要帮助,我可以添加 link.
至于 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
.