Comment conserver la référence de temps pendant le changement de fenêtre mobile? (Unity) [dupliquer]
J'ai un jeu où j'ai un système de correspondance de file d'attente. Je voudrais montrer au joueur depuis combien de temps il est dans la file d'attente actuelle. Cela fonctionne bien, jusqu'à ce que le joueur appuie sur le bouton d'aperçu du menu / application de son téléphone, ce qui gèle essentiellement le minuteur, et il ne continue de compter que lorsque le joueur repasse en mode plein écran sur son téléphone.
J'ai essayé de rechercher une méthode de cycle de vie d'application (un peu comme onApplicationPause, mais cela n'a pas fonctionné pour moi)
J'ai également essayé de synchroniser l'heure en l'enregistrant dans la base de données, puis en la chargeant à partir de la base de données, mais Firebase met un certain retard, donc ce ne sera pas exact. Comment pourrais-je résoudre ce problème, afin qu'il continue à compter lorsque l'utilisateur appuie sur le bouton de présentation / menu de son application sur son téléphone?
Pour l'instant, j'ai ce code qui compte le temps d'attente de l'utilisateur:
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);
}
}
Réponses
Il existe différentes approches, certaines utilisant une classe statique ou un modèle singleton. Il est préférable de ne pas mettre à jour cette variable de temps à chaque fois Update()
car cela prend le temps de calcul à chaque mise à jour (si vous n'avez besoin de cette fois pour rien d'autre). De plus, l'utilisateur n'a pas besoin d'avoir l'heure exacte par images afin que vous puissiez éviter des choses comme l'ajout Time.deltaTime
.
Je vais vous montrer un exemple avec une classe statique, il peut contenir ces informations. Notez également que ce script est uniquement ajouté en tant que fichier C #, mais vous ne le joignez à aucun 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}";
}
}
Usage
//On 1st time enter lobby
QueueTimerInformation.Start();
//In update method
var result = QueueTimerInformation.GetTimeElapsed();