Wie kann ich die Zeitreferenz während des mobilen Fensterwechsels beibehalten? (Einheit) [Duplikat]

Nov 23 2020

Ich habe ein Spiel, in dem ich ein Warteschlangen-Matchup-System habe. Ich möchte dem Spieler zeigen, wie lange er in der aktuellen Warteschlange war. Es funktioniert gut, bis der Player die Menü- / App-Übersichtstaste auf seinem Telefon drückt, wodurch der Timer im Grunde eingefroren wird. Die Zählung wird erst fortgesetzt, wenn der Player auf seinem Telefon wieder in den Vollbildmodus wechselt.
Ich habe versucht, nach einer App-Lebenszyklusmethode zu suchen (ähnlich wie bei onApplicationPause, aber sie hat bei mir nicht funktioniert).
Ich habe auch versucht, die Zeit zu synchronisieren, indem ich sie in der Datenbank gespeichert und dann tatsächlich aus der Datenbank geladen habe, aber Firebase hat eine gewisse Verzögerung es wird nicht genau sein. Wie könnte ich das lösen, damit es weiter zählt, wenn der Benutzer seine App-Übersicht / Menütaste auf seinem Telefon drückt?

Im Moment habe ich diesen Code, der die Wartezeit des Benutzers zählt:

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);
    }
}

Antworten

2 Tatranskymedved Nov 23 2020 at 17:36

Es gibt verschiedene Ansätze, einige verwenden statische Klassen oder Singleton-Muster. Es ist besser, diese Zeitvariable nicht jedes Mal zu aktualisieren, Update()da die Rechenzeit bei jedem Update benötigt wird (wenn Sie diese Zeit für nichts anderes benötigen). Außerdem muss der Benutzer keine genaue Zeit für Frames haben, damit Sie Dinge wie das Hinzufügen vermeiden können Time.deltaTime.

Ich zeige Ihnen ein Beispiel mit einer statischen Klasse, die diese Informationen enthalten kann. Beachten Sie auch , dass dieses Skript nur als C # Datei hinzugefügt wird, aber Sie nicht legen es zu einem 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}";
    }
}

Verwendung

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

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