Kojote Geschrieben 17. August 2017 Melden Share Geschrieben 17. August 2017 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 More sharing options...
Zer0Cool Geschrieben 17. August 2017 Melden Share Geschrieben 17. August 2017 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 More sharing options...
Kojote Geschrieben 17. August 2017 Autor Melden Share Geschrieben 17. August 2017 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 More sharing options...
Zer0Cool Geschrieben 17. August 2017 Melden Share Geschrieben 17. August 2017 Hatte ich doch schon was zu geschrieben, siehe oben. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 17. August 2017 Autor Melden Share Geschrieben 17. August 2017 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? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 17. August 2017 Melden Share Geschrieben 17. August 2017 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 More sharing options...
Kojote Geschrieben 17. August 2017 Autor Melden Share Geschrieben 17. August 2017 Funktioniert, danke! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 13. September 2017 Autor Melden Share Geschrieben 13. September 2017 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 More sharing options...
Zer0Cool Geschrieben 13. September 2017 Melden Share Geschrieben 13. September 2017 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 More sharing options...
Kojote Geschrieben 13. September 2017 Autor Melden Share Geschrieben 13. September 2017 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 More sharing options...
Zer0Cool Geschrieben 13. September 2017 Melden Share Geschrieben 13. September 2017 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 More sharing options...
Kojote Geschrieben 13. September 2017 Autor Melden Share Geschrieben 13. September 2017 Würde ich auch noch mal austesten. Glaube rein Performance-technisch dürfte deins auch besser sein, als meine Coroutine. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
malzbie Geschrieben 13. September 2017 Melden Share Geschrieben 13. September 2017 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. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 14. September 2017 Autor Melden Share Geschrieben 14. September 2017 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 More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.