手机窗口切换时如何保持时间参考? (统一)[重复]

Posted

技术标签:

【中文标题】手机窗口切换时如何保持时间参考? (统一)[重复]【英文标题】:How to keep time reference during mobile window switch? (Unity) [duplicate] 【发布时间】:2020-11-23 09:43:52 【问题描述】:

我有一个游戏,我有一个队列匹配系统。 我想向玩家展示他们在当前队列中的时间。它运行良好,直到玩家按下手机上的菜单/应用概览按钮,这基本上会冻结计时器,并且只有当玩家在手机上切换回全屏模式时才会继续计数。 我尝试寻找应用程序生命周期方法(有点像 onApplicationPause,但它对我不起作用) 我还尝试通过将时间保存在数据库中然后实际从数据库中加载来同步时间,但是 Firebase 会产生一些延迟,因此并不准确。 我该如何解决这个问题,这样当用户按下手机上的应用概览/菜单按钮时它会继续计数?

目前,我有这段代码可以计算用户的排队时间:

private void Update() 
    if(startedCounting) 
        timer += Time.deltaTime;
        int seconds = Mathf.FloorToInt(timer % 60);
        int minutes = Mathf.FloorToInt(timer / 60);
        queueStatusText.text = "You are in the queue\n"
                               + string.Format("0:00:1:00", minutes, seconds);
    

【问题讨论】:

【参考方案1】:

有不同的方法,一些使用静态类或单例模式。最好不要在Update() 上每次都更新这个时间变量,因为每次更新都需要计算时间(如果你不需要这个时间来做其他事情)。此外,用户不需要按帧有确切的时间,因此您可以避免添加Time.deltaTime 之类的事情。

我将向您展示静态类的示例,它可以保存这些信息。另请注意,此脚本仅作为 C# 文件添加,但您不要将它附加到任何 GameObject

public static class QueueTimerInformation //It is not inheriting from MonoBehavior!

    private static DateTime dt;
    private static bool isRunning = false;

    //Save current DateTime when user did the action
    public static void Start()
    
        if(!isRunning)
        
            dt = DateTime.Now;
            isRunning = true;
        
    

    public static void Reset()
    
        isRunning = false;
    

    // This gets the actual time in String value
    // Usually it is better to return just `elapsedTime` and format it later
    public static string GetTimeElapsed()
    
        if(!isRunning) return "00:00"; //Not running, return some default

        var elapsedTime = (DateTime.Now - dt);
        return $"elapsedTime:mm\\:ss";
    

用法

//On 1st time enter lobby
QueueTimerInformation.Start();

//In update method
var result = QueueTimerInformation.GetTimeElapsed();

【讨论】:

当应用在后台时它会工作吗? @SaadAnees 我会说是的,因为你在调用Start() 时会存储时间,结果你只在需要时减去它。您不会持续增加值(如 OP 示例),这可能会因应用程序进入后台而中断。 在这种情况下,这可能会起作用,但一般来说,您不能将 Unity Time 替换为 DateTime 或也可以使用例如StopWatch,因为 Unity timeScale 可以更改,因此虚拟时间运行得更快或更慢;) @derHugo 感谢您指出这一点(我什至不知道有这样的东西,不错的新信息)。 :-)

以上是关于手机窗口切换时如何保持时间参考? (统一)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

css - 如何在调整窗口大小时连续制作弹性项目3并保持1:1的比例[重复]

OPPO微信直播课怎么设置小窗口播放视频?

如何根据浏览器大小切换 CSS 样式表(更改网站的外观)[重复]

在窗口外单击时自动关闭模态,但如果在模态窗口内单击则保持打开状态[重复]

怎样设置kmplayer 关闭时能保持之前播放时的窗口大小?

如何统一平移动画窗口?