当 iPhone 用户退出主屏幕或 App Switcher 时,如何让我的计时器继续运行?

问题描述

我正在制作一个问答游戏,并希望确保用户不会因为退出该应用(而不将其关闭)而获得额外的回答时间。

我当前的计时器使用 Time.deltaTime。我正在考虑用 DateTimeOffset.Now.ToUnixTimeMilliseconds() (纪元时间)或 Time.realtimeSinceStartup (不确定这是否有效)之类的东西替换它。检测用户何时关闭应用的解决方案也可以使用。

解决方法

有三个内置函数可以满足您的需求。有 OnApplication.Quit(不适用于移动设备)、OnApplication.PauseOnApplicationFocus

我个人喜欢使用 OnApplicationPause 而不是 OnApplicationFocus,因为当键盘被调出时会在某些手机上调用焦点。我发现每当用户点击主页按钮、关闭应用程序、手机死机、关闭手机等时,都会调用暂停。

OnApplicationFocusOnApplicationPause 的重要部分是传入了一个 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));
    }
}

如果您愿意,也可以将 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 结合使用。