Jump to content
Unity Insider Forum

Mehrfaches neu laden einer aktiven Szene


Kokujou

Recommended Posts

Hallihallo.

Ich stehe mal wieder vor einem völlig unverständlichen Unity-Problem. Mein Code (warum gibts eigentlich kein C#? :P😞

StopAllCoroutines();
Global.instance.StopAllCoroutines();
Global.MovingCards = 0;
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
throw new Exception();

Sieht richtig aus oder? Nein. Sieht sogar viel zu umfangreich aus, da ich gelesen habe, dass Unity Coroutinen automatisch beenden sollte beim laden einer Szene.

Nun erkläre man mir bitte diesen abaritgen Effekt:

image.png.379d2db4560f20c60d634ada7db203d2.png

 

Zum Kontext: Ich lade eine Szene indem ich mir ein Deck generiere, von diesem Deck die Hände und das Spielfeld austeile und das alles passiert in Coroutinen. Und nur falls eventuell die Instanzen dabei eine rolle spielen hab ich auch einen globalen Singleton die Funktion aufrufen lassen. die MovingCards ist eine Zahl die mehr oder weniger die Anzahl der aktuellen Animationen angibt.

 

Und nur um sicher zu gehen dass nicht eventuell doch noch irgendwo irgendwas ausgeführt wird nachdem die Szene geladen wird schmeiße ich danach eine Exception raus. Natürlich habe ich es zu allererst mit dem Einzeiler probiert, der Rest code soll nur zeigen was ich schon alles versucht habe. Ich hab auch mal explizit den Single Parameter in der Lade-Funktion angegeben - ohne Erfolg.

Ich weiß nichtmal wo ich anfangen soll zu raten wo dieser Fehler überhaupt herkommt also hoffe ich von euch die Erleuchtung zu erhalten.

 

Edit: Ich sollte eventuell erwähnen dass ich diese Funktion mehrfach als Test aufrufe. Die Szene wird etwa 10mal hintereinander neugeladen. Das läuft so ab:
Szene lädt -> Deck generiert -> Karten ausgeteilt -> Szene neuladen -> ...

Ein zufälliges event hält diese Schleife aktuell aus. Vielleicht macht das ja irgendwas kaputt... keine ahnung...

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 3 Stunden schrieb Kokujou:

warum gibts eigentlich kein C#?

Wir haben da mal ne Weile rumprobiert, aber das Plugin hat sich mega quergestellt... ich benutze einfach C, ist ähnlich genug :)

vor 3 Stunden schrieb Kokujou:

Sieht richtig aus oder? Nein. Sieht sogar viel zu umfangreich aus, da ich gelesen habe, dass Unity Coroutinen automatisch beenden sollte beim laden einer Szene.

Coroutines laufen auf MonoBehaviours, also deinen Script-Komponenten. Wenn die Komponente zerstört wird, sei es direkt, durch Zerstörung des GameObjects oder durch das Entladen der Szene, dann läuft sie natürlich nicht mehr weiter.

Wenn eine Coroutine nach Laden einer neuen Szene noch läuft, dann liegt das daran, dass die MB-Komponente, auf der sie läuft, noch existiert, also durch DontDestroyOnLoad am Leben gehalten wird.

vor 4 Stunden schrieb Kokujou:

Ich weiß nichtmal wo ich anfangen soll zu raten wo dieser Fehler überhaupt herkommt also hoffe ich von euch die Erleuchtung zu erhalten.

Ich weiß ehrlich gesagt nicht, wo dein Fehler liegt. Ich sehe da einen Screenshot mit nem Hintergrundbild, nen Haufen Karten und etwas IMGUI drüber. Da ich nicht weiß, was du eigentlich haben willst, weiß ich nicht, wo der "abartige Effekt" ist :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

naja man sollte erkennen dass ein spielfeld nicht so aussehen sollte ;)
normalerweise werden 3 Gebiete ausgeteilt, Feld, Hand1, Hand2

stattdessen wird die Hand-Auffächern-Animation jetzt auf dem Deck getriggert und dann fliegen noch überall anders irgendwelche kartenrum nachdem das hauptspielfeld längst aufgebaut wurde...

Ja, ich habe eine komponente die nicht gelöscht werden darf. Aber darum rufe ich ja auch Stopallcoroutines auf und das sogar auf der Instanz dieses Objekts. also... ?????

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 46 Minuten schrieb Kokujou:

naja man sollte erkennen dass ein spielfeld nicht so aussehen sollte ;)

Was weiß ich denn, wie dein Spielfeld auszusehen hat? Ich weiß ja nichtmal, was das für ein Spiel ist oder welche Regeln es hat. Bin nicht in deinem Kopf drin ;)

vor 47 Minuten schrieb Kokujou:

stattdessen wird die Hand-Auffächern-Animation jetzt auf dem Deck getriggert und dann fliegen noch überall anders irgendwelche kartenrum nachdem das hauptspielfeld längst aufgebaut wurde...

Werden denn die Karten gelöscht, die bereits existieren, wenn du die Szene wechselst?

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 month later...

sollten sie zumindest, aber nicht explizit.
Der Sinn ist es ja irgendwie zu sagen es soll absolut alles in den Müll geschmissen werden außer das was explizit als nicht zu löschen gekennzeichnet wurde und das sind nur virtuelle daten, ekine GO.

was ich will ist im prinzip das spiel solange aus und wieder anschalten bis es klappt nur halt muss ich auch in der richtigen szene mit richtigen umgebungsvariablen  einsteigen können.
Ich hatte gehofft es gibt die einfache variante über Unitys Szenen aber da hab ich mich wohl geshcnitten...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hast Du mal probiert, die Szene vorher zu entladen, auch wenn es theoretisch keinen Sinn ergibt?

SceneManager.sceneUnloaded += OnSceneUnloaded;
SceneManager.UnloadSceneAsync(SceneManager.GetActiveScene().name);

private void OnSceneUnloaded(Scene current)
{
  SceneManager.sceneUnloaded -= OnSceneUnloaded;
  SceneManager.LoadScene(current.name);
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...