Jump to content
Unity Insider Forum

Szene nach x Sekunden automatisch laden


Vaapad

Recommended Posts

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

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

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

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

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

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

Archiviert

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

×
×
  • Neu erstellen...