Vaapad Geschrieben 14. Februar 2016 Melden Share Geschrieben 14. Februar 2016 Hallo zusammen, ich stecke noch in den Kinderschuhen, was das Scripten angeht. Aktuell versuche ich mein Spiel nach einer bestimmten Sekundenzahl automatisch in eine Szene wechseln zu lassen, in der lediglich eine "Spielende" Nachricht ausgegeben wird. Mein Skript sieht so aus: #pragma strict static var countdown : int; function Start () { countdown = 0; } function Update () { countdown += Time.deltaTime; if (countdown == 5) Application.LoadLevel("spielende"); } Ich bekomme zwar keine Fehlermeldung, jedoch wird das Level "Spielende" nicht geladen. Wo ist mein Fehler? Danke schonmal und schöne Grüße Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Djeurissen Geschrieben 14. Februar 2016 Melden Share Geschrieben 14. Februar 2016 countdown == 5 Update wird ja nicht immer exakt den gleichen Abständen aufgerufen, dementsprechend kann es sehr gut sein das dein countdown auch mal 5 überspringt. Dementsprechend musst du das auch abfragen... Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Vaapad Geschrieben 14. Februar 2016 Autor Melden Share Geschrieben 14. Februar 2016 countdown == 5 Update wird ja nicht immer exakt den gleichen Abständen aufgerufen, dementsprechend kann es sehr gut sein das dein countdown auch mal 5 überspringt. Dementsprechend musst du das auch abfragen... Mein voriger Versuch sah so aus: function Update () { countdown = countdown + (1 * Time.deltaTime); if (countdown == 5) Application.LoadLevel("spielende"); } Ich dachte, dass die Multiplikation 1 * Time.deltaTime genau das Problem löst, aber das hat auch nicht geklappt. Es soll am Ende nach der festgelegten Anzahl an Sekunden (im Beispiel 5) die neue Szene laden. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
GelegenheitsProgrammierer Geschrieben 14. Februar 2016 Melden Share Geschrieben 14. Februar 2016 Wenn du Sekunden abwarten möchtest. Wie währe es mit der Funktion WaitForSecond ?? Nur mal als tipp. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 14. Februar 2016 Melden Share Geschrieben 14. Februar 2016 Vaapad, du weißt schon, was Multiplikation mit 1 bedeutet, oder? Exakt gar nichts! WaitForSeconds ist ein guter Tipp und hier durchaus angebracht. Aber der Vollständigkeit halber: if(countdown >= 5) Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Vaapad Geschrieben 14. Februar 2016 Autor Melden Share Geschrieben 14. Februar 2016 Wenn du Sekunden abwarten möchtest. Wie währe es mit der Funktion WaitForSecond ?? Nur mal als tipp. Die Funktion kannte ich noch gar nicht. Hab mir dazu jetzt mal ein paar Sachen durchgelesen und folgende (funktionierende!) Lösung geschrieben: function Spielende () { yield WaitForSeconds(5); Application.LoadLevel("spielende"); } function Start () { Spielende(); } Vielen Dank für eure Hilfe! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sid Burn Geschrieben 14. Februar 2016 Melden Share Geschrieben 14. Februar 2016 countdown muss vom typ float sein nicht int. Time.deltaTime enthält die zeit die verstrichen ist als einen dezimalwert. Bei 60fps hat man also bei jedem update einen wert von ca. 0.01666 addiert man diesen zu einem int dann wird dieser wert zu 0 umgewandelt und man addiert zu countdown nichts hinzu. Ansonsten danach dann >, >=, <, <= nutzen da 5f nunmal überprungen werden kann. Aber dies sollte man grundsätzlich bei floating-point machen und niemals zwei floating point zahlen mit (==) vergleichen. Man kann sagen das ein vergleich zweier floating zahlen grundsätzlich ein bug ist. Möchte man wirklich zwei Floating vergleichen dann sollte man zumindest Mathf.Approximately nutzen. Alternativ subtrahiert man zwei floating zahlen und schaut ob diese innerhalb eines threshold ist, also zum Beispiel let x = a - b if x < 0.001f then // Zahlen sind identisch else // Nope nicht identisch Das einmal grundsätzlich zu floating-point zahlen. Ich würde aber ansonsten ebenfalls eine Coroutine in deinem fall nutzen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Vaapad Geschrieben 14. Februar 2016 Autor Melden Share Geschrieben 14. Februar 2016 countdown muss vom typ float sein nicht int. Time.deltaTime enthält die zeit die verstrichen ist als einen dezimalwert. Bei 60fps hat man also bei jedem update einen wert von ca. 0.01666 addiert man diesen zu einem int dann wird dieser wert zu 0 umgewandelt und man addiert zu countdown nichts hinzu. Ansonsten danach dann >, >=, <, <= nutzen da 5f nunmal überprungen werden kann. Aber dies sollte man grundsätzlich bei floating-point machen und niemals zwei floating point zahlen mit (==) vergleichen. Man kann sagen das ein vergleich zweier floating zahlen grundsätzlich ein bug ist. Möchte man wirklich zwei Floating vergleichen dann sollte man zumindest Mathf.Approximately nutzen. Alternativ subtrahiert man zwei floating zahlen und schaut ob diese innerhalb eines threshold ist, also zum Beispiel let x = a - b if x < 0.001f then // Zahlen sind identisch else // Nope nicht identisch Das einmal grundsätzlich zu floating-point zahlen. Ich würde aber ansonsten ebenfalls eine Coroutine in deinem fall nutzen. Danke für die Aufklärung. Ich hatte zwar zwischenzeitlich die Variable countdown zu float gewechselt, aber in der Funktion noch == statt >= etc. stehen, das hat natürlich auch nicht geklappt. Die Coroutine mit yield macht exakt das, was ich wollte. Finde den Weg auch weitaus übersichtlicher So nun ist Feierabend... Danke nochmal! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Djeurissen Geschrieben 14. Februar 2016 Melden Share Geschrieben 14. Februar 2016 Dafack habe das int bei countdown komplett übersehen O_o Tjoa das passiert wenn man nur auf den Datentyp achtet wenn er ganz am Anfang steht XD Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sid Burn Geschrieben 14. Februar 2016 Melden Share Geschrieben 14. Februar 2016 Hab da auch nur drauf geachtet da ich hauptsächlich F# nutze, und in F# wäre nahezu der komplette code ein Compiler-Fehler da man kein int/float addieren/multiplizieren oder vergleichen kann. Das führt dann dazu das man irgendwie nochmal zweimal nachschaut was Countdown eigentlich für ein typ ist. Den der code sieht für ein F# Programmier von vorne bis hinten fehlerhaft aus. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Torigas Geschrieben 15. Februar 2016 Melden Share Geschrieben 15. Februar 2016 http://docs.unity3d.com/ScriptReference/MonoBehaviour.StartCoroutine.html Da ist praktisch eine einfache Anleitung wie man etwas nach X Zeit ausführt. Elegant mit Coroutinen. 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.