Automatischer Szenenwechsel

Hallo,

ich programmiere zur Zeit ein kleines 2D-Spiel.

Ich habe einen Startszene und möchte nach z.B. 20 Sekunden automatisch auf meine Menüszene kommen.

Könnt ihr mir helfen, ich versuche die ganze Zeit Application.LoadLevel(1); 1 ist die Instanz von meinem Menü beim Build & Run. Das Skript mit dem "LoadLevel" habe ich an meine Startszene eingepflegt.

Mein Startbildschirm erscheint perfekt, wechselt aber nicht.

 

Ich danke Euch für die Hilfe...

gefragt21.05.2015
Christine10
Christine

3 Antworten

Diese Antwort wurde von ihrem Autor als akzeptierte Antwort gewählt.

Du möchtest also auf jeden Fall immer 20 Sekunden, nachdem die Startszene geladen wurde die Menüszene laden, oder?

Dazu würdest du dann in der Startszene das gewünschte Script (z.B. "MenuLoader") an ein beliebiges Objekt hängen (wobei ich empfehlen würde, das Objekt so zu nennen, wie das Script heisst, in dem Fall also auch MenuLoader).

Bei der Implementierung von MenuLoader hast du dann in der Methode Awake() oder Start() (Start() finde ich in dem Fall geeigneter, funktioniert aber beides) einen Aufruf StartCoroutine(LoadLevelDelayed()); ... wobei "LoadLevelDelayed()" wieder ein beliebiger Methodenname ist. Das kann also auch anders heissen, wenn dir das lieber ist.

Bei der Implementierung von LoadLevelDelayed() ist dann wichtig, dass der Rückgabetyp ein IEnumerator ist, also public IEnumerator LoadLevelDelayed() { ... }.

Und in dieser Methode hast du dann deinen Aufruf "Application.LoadLevel(1);" ... der ist an sich korrekt. Ich persönlich finde es lesbarer, den Level über den Namen zu laden. Das hat auch den Vorteil, dass du dann keine Probleme bekommst, wenn du z.B. noch einen zusätzlichen Startlevel davor hängst. Aber das kann auch Nachteile haben - ist also eher Geschmacksfrage.

beantwortet21.05.2015 Jashan Chittesh 301
Jashan Chittesh
  • Ooops, genau - das wichtigste hatte ich vergessen (das hat dann breez hinzugefügt): vor dem Application.LoadLevel(1) muss natürlich das yield return new WaitForSeconds(20F) stehen ... - Jashan Chittesh 22.05.2015

IEnumerator ist ein Interface das bei Generischen Collections standartmäßig implementiert ist. Dies bewirkt im Grunde, dass man durch zum Beispiel eine List<T> mit foreach iterieren kann. Dies Funktioniert so, dass die Wert aus z.b. einer List<T> mit foreach iteriert wird, sprich jeder Wert einzeln zürückgegeben und verarbeitet wird (ein Wert nach dem anderen Wert).

 Bei Unity benutzt du ihn bei Coroutinen, damit im Prinzip durch die Funktion "iteriert" werden kann. Das geht wie folgt:

Funktion:

public IEnumerator LoadLevelDelayed()
    {
        yield return new WaitForSeconds(20F); // 20 Sekunden in deinem fall
        Application.LoadLevel(1);
    } 

 Aufruf als Coroutine:

 StartCoroutine(LoadLevelDelayed());

 Hier returned deine Funktion sequentiel erst die 20 Sekunden warten, dann wir wieder in die Funktion gesprungen zur Zeile hinter yield return.... , also in dem Fall dein Level wird geladen!

 

beantwortet21.05.2015 breez 26
breez
bearbeitet21.05.2015
breez26
breez

Hallo nochmal,

genau ich möchte sobald der Startbildschirm angeht nach 20 s mein Spielemenü aufgeht.

Ich danke Dir für deine schnelle Antwort, habe aber noch ein Problem.

Was bewirkt der IEnumerator, bzw. was muss ich zurückgeben. Ich bekomme aktuell den Fehler: Error CS0161: "MenuLoader.LoadLevelDelayed()": Nicht alle Codepfade geben einen Wert zurück. (CS0161) (Assembly-CSharp)

Danke für die Hilfe

beantwortet21.05.2015 Christine 10
Christine
  • Sorry - siehe auch Kommentar in meiner ursprünglichen Antwort: vor dem Application.LoadLevel muss natürlich yield return new WaitForSeconds(20F); stehen ... - Jashan Chittesh 22.05.2015

Deine Antwort

Um eine Antwort zu geben, musst du Login

Ich markiere diese Frage weil ...

10 übrige Markierungen um Moderator zu informieren

Ich lösche diese Frage weil ...

Ich markiere diese Antwort weil ...

10 übrige Markierungen um Moderator zu informieren

Posting markieren

Du hast diese Beitrag bereits markiert. Klicke "Markierung aufheben" um deine Markierung zu entfernen, was auch die Anzahl der Markierungen um eins reduziert.

Ich lösche diese Antwort weil ...