Jump to content
Unity Insider Forum

Timer Problem


Kojote

Recommended Posts

Grüße

Ich habe mir einen kleinen Timer gebaut:

private void Update() {
    if (pause == false) {
        timer = Time.time;
        stunden = Mathf.FloorToInt(timer);
        minuten = Mathf.FloorToInt(timer / 60f);
        sekunden = Mathf.FloorToInt(timer - minuten * 60);
        zeitAnzeige.text = string.Format("{00:00:00}:{00:01:00}:{00:00:02}", stunden, minuten, sekunden);
    }     
}

Das gute Stück funktioniert sogar, jedoch nur in der Anzeige Minuten und Sekunden. Ich finde den Fehler einfach nicht, sehr ihr ihn?

Des weiteren ich lasse den Timer in einem GUI Text anzeigen, jedoch sieht das zur Zeit recht unschön aus, da die Anzeige bei jeder Änderung der Zeit hin und her wackelt, bedingt durch die unterschiedlich breiten Zahlen. Gibt es da hier eine Möglichkeit, dies zu unterbinden?

 

Danke schon mal und Grüße von Kojote

Link zu diesem Kommentar
Auf anderen Seiten teilen

Schau mal, ob daß dein Problem löst. Ansonsten musst du einen Monospace Font verwenden, oder es gibt wohl auch einen Tag bei TextMeshPro, der einen Text in Monospace verwandelt:
http://digitalnativestudios.com/textmeshpro/docs/rich-text/#mspace
 

   private void Update()
    {
            float timer = Time.time;
            int stunden = Mathf.FloorToInt(timer / 60f / 60f);
            int minuten = Mathf.FloorToInt(timer / 60f);
            int sekunden = Mathf.FloorToInt(timer - minuten * 60 - stunden * 60 * 60);
            Debug.Log(string.Format("{0:00}:{1:00}:{2:00}", stunden, minuten, sekunden));
    }

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erst mal Danke für die Antwort, ZerOCool. :)

Das Script funktioniert ohne Probleme. Leider habe ich immer noch das Problem das der Text herum wackelt, da zum Beispiel die 1 wesendlich schmaler ist als die 9. Man könnte nun mit drei Textanzeigen arbeiten. Aber gibt es da auch einen eleganteren Weg?

Nagut möglichkeit wäre auch den Text nicht zu zentrieren und anstelle dessen ihn linksbündig zu machen. Da ist aber auch wieder das Problem wenn von 00:00:59 auf 00:01:00 gewechselt wird, es wieder eine Breitenänderung gibt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zurücksetzen müsste so gehen:

private float resetTimeStamp = 0f;

private void Reset()
{
   resetTimeStamp = Time.time;
}

private void Update()
    {
            timer = Time.time - resetTimeStamp;
            int stunden = Mathf.FloorToInt(timer / 60f / 60f);
            int minuten = Mathf.FloorToInt(timer / 60f);
            int sekunden = Mathf.FloorToInt(timer - minuten * 60 - stunden * 60 * 60);
            Debug.Log(string.Format("{0:00}:{1:00}:{2:00}", stunden, minuten, sekunden));
    }

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 4 weeks later...

Was ich gerade beim Testen bemerke, der Timer geht im Hintergrund weiter.

Wenn ich z.B. 2 min gespielt habe und auf Pause gehe, eine Minute warte und dann weiter spiele, zählt der Timer nicht bei 2 min weiter sondern bei 3 min.

So sieht der Code aus:

    private void Update() {
        if (pause == false) {
            timer = Time.time - resetTimer;
            zeitStunden = Mathf.FloorToInt(timer / 60f / 60f);
            zeitMinuten = Mathf.FloorToInt(timer / 60f);
            zeitSekunden = Mathf.FloorToInt(timer - zeitMinuten * 60 - zeitStunden * 60 * 60);
            anzeigeZeitStunden.text = string.Format("{0:00}:", zeitStunden);
            anzeigeZeitMinuten.text = string.Format("{0:00}", zeitMinuten);
            anzeigeZeitSekunden.text = string.Format(":{0:00}", zeitSekunden);
        }
    }

Problem ist, dass er mit der realen Zeit rechnet. Für mich nun etwas ungünstig, da ich die Zeit richtig stoppen will und nicht nur die Anzeige.

Gibt es da noch eine andere Möglichkeit? Über eine Coroutine wäre eine Möglichkeit, find ich aber weniger gut.

 

EDIT:

Lösung gefunden:

Time.timeScale = 1; // Standardzeit

Time.timeScale = 0; // Zeit anhalten

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Alternativ müsstest du die Zeit ermitteln, die das Spiel in der Pause war (z.b. pauseTime = Time.time - pauseStartTime = 120 = 2 min) und diese Pausenzeit dann einem Pausenzähler (pauseTimeSum) hinzufügen, der dann immer die gesamte Pausenzeit von der aktuellen Zeit abzieht:

void EnterPause() {
  pauseStartTime = Time.time;
}

void ExitPause() {
  pauseTime = Time.time - pauseStartTime;
  pauseTimeSum += pauseTime; 
}

 

private void Update() {
  ..
  timer = Time.time - resetTimeStamp - pauseTimeSum;
  ..
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wäre auf jeden Fall eine gute Idee für die Pause. Das Problem wäre jedoch dann, was mache ich, wenn das Spiel ausgeschalten wird? Ich lasse mein Spiel in eine XML Datei speichern, ebenfalls lasse ich da die Sekundenwerte speichern und errechne mir aus denen wieder Minuten und Stunden, wenn das Spiel geladen wird. Problem wäre nun, wie lange war das Spiel aus, wenn es fortgesetzt wird?

Habs nun mit einer Coroutine gelöst:

    IEnumerator ZeitLoop() {
        while(pause == false) {
            yield return new WaitForSeconds(1.0f);
            zeitSekunden++;
            if(zeitSekunden >= 60) {
                zeitMinuten++;
                zeitSekunden = 0;
            }
            if (zeitMinuten >= 60) {
                zeitStunden++;
                zeitMinuten = 0;
            }
            anzeigeZeitSekunden.text = string.Format(":{0:00}", zeitSekunden);
            anzeigeZeitMinuten.text = string.Format("{0:00}", zeitMinuten);
            anzeigeZeitStunden.text = string.Format("{0:00}:", zeitStunden);
        }
    }

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das wäre nicht so das Problem. da Time.time ja bei jedem Spielstart zurückgesetzt wird. Time.time ist also keine Echtzeit, sondern enthält die Sekunden seit Spielstart. Du müsstest aber "timer" (der ja die aktuellen Sekunden enthält, die vom Spieler verbraucht wurden) speichern und den dann wieder nach dem Laden auf "timer" draufaddieren (hehe die Berechnung wird immer länger).

timer = loadedTimer + Time.time - resetTimeStamp - pauseTimeSum;

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 12 Stunden schrieb malzbie:

Wie, Performancetechnisch?
Hast du auch schon mal etwas Grafik ins Spiel gebracht?

Ich meine ja nur, wenn du schon bei solchen Dingen an Performance denkst. ;)

Ich denk vom ersten Mausklick an die Performance, manchmal glaube ich, ich bin da etwas übervorsichtig. ^^

Grafik bzw. das Spiel funktioniert rein über das UI, also viel mit Performanceproblemen ist da nicht. Obwohl ich mich immer wieder über Leistungsspitzen wundere, wo die Framerate ganz schön nach unten geht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...