2015-05-28 4 views
6

Eines der Skripts in meiner Szene besteht darin, ein Raster aus Cubes zu erstellen. Der Prozess benötigt ziemlich viel Zeit und ich habe versucht, es zu implementieren, ohne dass Unity nicht reagiert.Raster mit Hilfe von Routinen laden - warten bis zum Ende,

Der Code derzeit - funktioniert zu - Sie können sehen, wie das Raster generiert wird. Die anderen Skripts in der Szene führen jedoch gleichzeitig ihre Aufgaben aus und verursachen Ausnahmen (sie greifen auf Kacheln im Grid zu, die noch nicht erstellt wurden).

Das folgende Skript ist das einzige Skript, das eine 'Awake'-Funktion hat - die anderen Skripte führen' Update 'und' OnGUI 'aus, bevor das erste Skript beendet ist.

GridGenerator.cs 

public GameObject[,] tiles = new GameObject[Constants.BOARD_WIDTH, Constants.BOARD_HEIGHT]; 
    // Run a double loop to create each tile. 
    void Awake() 
    { 
     StartCoroutine(doSetup()); 
    } 

    IEnumerator doSetup() 
    { 
     yield return StartCoroutine (loadLevel()); 
     DoOtherStuff(); 
    } 

    IEnumerator loadLevel() 
    { 
     for (int i = 0; i < Constants.BOARD_WIDTH; i++)    
     { 
      for (int j = 0; j < Constants.BOARD_HEIGHT; j++) 
      { 
       tiles[i,j] = newTile(); 
       yield return(0); 
      } 
     } 
    } 

Wie würde ich die DoOtherStuff() - Methode warten, bis die Co-Routine beendet ist?

Ich habe einen boolean Toggle versucht (die Einheit erstarrte) Ich habe versucht, mit Schloss oder

(was nicht funktioniert hat) ist es eine effizientere Art und Weise, dies zu tun?

BEARBEITEN: Der Code schließt OtherStuff() erfolgreich ab, nachdem das Raster generiert wurde. Abgesehen von der doOtherStuff() ist eine Referenz des Rasters zu einer separaten Klasse zu übergeben. Die separate Klasse gibt Ausnahmen aus, wenn sie versuchen, in der Update-Methode auf das Raster zuzugreifen. Was bedeutet, dass die Update-Methode aufgerufen wird, bevor das Erwachen in GridGenerator.cs abgeschlossen ist.

+0

so die anderen Dinge sind für die Fliesen suchen, gibt es eine Möglichkeit, dass, wenn sie‘ Auf der Suche nach ihnen können sie sagen, ob sie generiert wurden und noch verfügbar sind? Möglicherweise muss mehr Code zur Verfügung gestellt werden, der zeigt, wie die Kacheln von den anderen Routinen gespeichert/aufgerufen werden. – DLeh

+0

Ja, das ist eine Lösung - um sicherzustellen, dass die Kacheln zuerst generiert werden. Aber das Hinzufügen zusätzlicher Bedingungen zu allen Orten, die die Kacheln erfordern ... Ah, die Kacheln sind in einem mehrdimensionalen Array von GameObjects gespeichert. Aktualisiert den Hauptpost - danke. – user1662292

Antwort

1

Der einfachste Weg, um Ihre Koroutine innerhalb eines anderen Koroutine kick off wäre, so dass Sie es ergeben können:

void Awake() 
{ 
    StartCoroutine(doSetup()); 
} 

IEnumerator doSetup() 
{ 
    yield return StartCoroutine(createGrid()); // will yield until createGrid is finished 
    doOtherStuff(); 
} 

IEnumerator createGrid() 
{ 
     for (int i = 0; i < Constants.BOARD_WIDTH; i++)    
     { 
      for (int j = 0; j < Constants.BOARD_HEIGHT; j++) 
      { 
       // Instantiate a new tile 
       yield return(0); 
      } 
     } 
    } 
} 
+0

Hallo, Danke für die Antwort und das funktioniert bis zu einem gewissen Grad Ignorieren des Protokolls, es funktioniert gut und das Gitter wird generiert. Allerdings wird immer noch die Awake-Funktion beendet, bevor das Grid erzeugt wird, und einige andere Scripts protokollieren Ausnahmen. Es ist viel besser als es war (wie zuvor war es mitten in der Generierung des Grids). Irgendwelche Ideen, wie man die Wake-Methode beenden kann, bis das Grid fertig ist? – user1662292

+3

Die 'Awake'-Methode kann keine Coroutine sein und kann daher keiner anderen Coroutine weichen. Sie müssen entweder die asynchrone Rastererzeugung umgestalten oder einfach synchron ausführen. – Problematic