Jump to content
Unity Insider Forum
  • Announcements

    • Lars

      Allgemeine Forenregeln   03/13/2017

      Forenregeln Nimm dir bitte einen Moment um die nachfolgenden Regeln durchzulesen. Wenn du diese Regeln akzeptierst und die Registration fortsetzen willst, klick einfach auf den "Mit der Registrierung fortfahren"-Button. Um diese Registration abzubrechen, klick bitte einfach auf den "Zurück" Button deines Browsers. Wir garantieren nicht für die Richtigkeit, Vollständigkeit und Brauchbarkeit der Nachrichten und sind auch nicht dafür verantwortlich. Die Beiträge drücken die Meinung des Autors des Beitrags aus, nicht zwangsläufig das, wofür die Forensoftware steht. Jeder Nutzer, der denkt, dass ein veröffentlichter Beitrag unzulässig bzw. störend ist, ist aufgefordert uns unverzüglich per E-Mail zu kontaktieren. Wir haben das Recht störende Beiträge zu löschen und bemühen uns, das in einem realistischem Zeitraum zu erledigen (sofern wir beschlossen haben, dass die Löschung notwendig ist). Du akzeptierst, durchgehend während der Nutzung dieses Services, dass du dieses Forum nicht dazu missbrauchen wirst, Inhalte zu veröffentlichen, welche bewusst falsch und/oder verleumderisch, ungenau, beleidigend, vulgär, hasserfüllt, belästigend, obszön, sexuell belästigend, bedrohlich, die Privatsphäre einer Person verletzend oder in irgend einer Art und Weise das Gesetz verletzen. Des Weiteren akzeptierst du, dass du keine urheberrechtlich geschützte Inhalte ohne Erlaubnis des Besitzers in diesem Forum veröffentlichst. Mit dem Klick auf den "Mit der Registrierung fortfahren"-Button, akzeptierst du zudem unsere Datenschutzerklärung und stimmst der Speicherung deiner IP-Adresse und personenbezogenen Daten zu, die dafür benötigt werden, um dich im Falle einer rechtswidrigen Tat zurückverfolgen zu können bzw. permanent oder temporär aus dem Forum ausschließen zu können. Es besteht keine Pflicht zur Abgabe der Einwilligung, dies erfolgt alles auf freiwilliger Basis.   Zusatzinformationen Der Forenbetreiber hat das Recht, Nutzer ohne Angabe von Gründen permanent aus dem Forum auszuschließen. Des Weiteren hat er das Recht, Beiträge, Dateianhänge, Umfrage, Blogeinträge, Galleriebilder oder Signaturen ohne Angabe von Gründen zu entfernen. Mit der Registrierung verzichtest du auf alle Rechte an den von dir erstellten Inhalten, bzw. treten diese an das Unity-Insider.de und Unity-Community.de ab. Dies bedeutet im Klartext, dass das Unity-Insider.de und Unity-Community.de frei über deine Texte verfügen kann, sofern diese nicht wiederum die Rechte anderer verletzen. Es besteht weiterhin kein Anspruch von registrierten Nutzern bzw. ehemaligen registrierten Nutzern darauf, dass erstellte Inhalte und/oder die Mitgliedschaft (User) wieder gelöscht werden (Erhaltung der Konsistenz dieses Forums).   Einwilligungserklärung Wenn du mit der Speicherung deiner personenbezogenen Daten sowie den vorstehenden Regeln und Bestimmungen einverstanden bist, kannst du mit einem Klick auf den Mit der Registrierung fortfahren-Button unten fortfahren. Ansonsten drücke bitte Zurück. Stand: 07.03.2011
Sign in to follow this  
Kojote

Timer Problem

Recommended Posts

Kojote    5

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

Share this post


Link to post
Share on other sites
Zer0Cool    178

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

 

Share this post


Link to post
Share on other sites
Kojote    5

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.

Share this post


Link to post
Share on other sites
Kojote    5

Ach so, ok, schau ich mir mal an.

Mal noch eine Frage, auch wenn sie vermutlich recht einfach zu beantworten ist. Wie kann ich den Timer wieder auf 0 setzen? Reicht es dazu aus, die Variablen wieder auf 0 zu setzen?

Share this post


Link to post
Share on other sites
Zer0Cool    178

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

 

  • Like 1

Share this post


Link to post
Share on other sites
Kojote    5

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

 

Edited by Kojote
Lösung gefunden

Share this post


Link to post
Share on other sites
Zer0Cool    178

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

 

Share this post


Link to post
Share on other sites
Kojote    5

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

 

Share this post


Link to post
Share on other sites
Zer0Cool    178

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;

 

Share this post


Link to post
Share on other sites
Kojote    5

Würde ich auch noch mal austesten. Glaube rein Performance-technisch dürfte deins auch besser sein, als meine Coroutine.

Share this post


Link to post
Share on other sites
malzbie    1,332

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

Share this post


Link to post
Share on other sites
Kojote    5
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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

×