gpt4 book ai didi

c# - 移动窗口切换时如何保持时间引用? (统一)

转载 作者:行者123 更新时间:2023-12-04 08:32:09 29 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How to pass data between scenes in Unity

(5 个回答)


9 个月前关闭。




我有一个游戏,我有一个队列匹配系统。
我想向玩家展示他们在当前队列中的时间。它运行良好,直到玩家按下手机上的菜单/应用程序概览按钮,这基本上会卡住计时器,并且只有当玩家在手机上切换回全屏模式时才会继续计数。
我尝试寻找应用程序生命周期方法(有点像 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);
}
}

最佳答案

有不同的方法,有些使用静态类或单例模式。最好不要在 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();

关于c# - 移动窗口切换时如何保持时间引用? (统一),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64965966/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com