当 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 等时,都会调用暂停。

关于 OnApplicationFocusOnApplicationPause 的重要部分是有一个 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));
    }
}

如果你愿意,你也可以将OnApplicationFocusOnApplicationPause一起使用。类似于:

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.

结合使用