Jump to content
Unity Insider Forum

beim zweiten Laden eines Levels passt nix mehr


chrische5

Recommended Posts

Hallo

Ich hänge seit Tagen über einem komischen Problem. Habe mittlerweile einen totalen Knoten im Kopf. Eventuell sieht ja jemand von euch, was hier schief läuft.

In meiner Szene liegt ein Ball. Un die Klasse LevelLoader ist dafür zuständig, Level zu laden. Diese sind einfache Tiled-Karten. Aus Testzwecken habe ich drei Karten erstellt und diese kann ich genau so laden, wie ich es mir wünsche. Dazu nutze ich folgende Funktion:

public void LoadLevel(int levelIndex)
        {
            if (_currentLevel)
            {
                Destroy(_currentLevel);
                _currentLevel = null;
            }

            if (_currentEndPoint)
            {
                Destroy(_currentEndPoint);
                _currentEndPoint = null;
            }
            _ball.Stop();

            _currentLevel = Instantiate(_levels[levelIndex]);
            var spawnPoint = GameObject.Find("SpawnPoint");
            if (spawnPoint == null)
            {
                Log.WriteDebug("cant find spawn point", name);
            }
            else
            {
                _ball.transform.Translate(spawnPoint.transform.position);
            }
            
            var polygonCollider2D= _currentLevel.GetComponentInChildren<PolygonCollider2D>();
            if (polygonCollider2D)
            {
                polygonCollider2D.gameObject.AddComponent<LevelBorder>();
            }
            else
            {
                Log.WriteDebug("cant find polygon collider on current level", name);
            }
            
            var endPointFromTiled = GameObject.Find("EndPoint");
            if (endPointFromTiled == null)
            {
                Log.WriteDebug("cant find end point", name);
            }
            else
            {
                _currentEndPoint = Instantiate(_endPoint);
                _currentEndPoint.transform.position = endPointFromTiled.transform.position;
            }
        }

Wie bereits geschrieben, funktioniert das wunderbar. Wenn ich nun aber aus dem Spiel heraus ein neues Level laden möchte (weil der Spieler den Endpunkt erreicht hat), werden SpwanPoint und EndPoint falsch gesetzt (bzw. gar nicht neu gesetzt).

Das Laden des nächsten Levels ist über folgende Funktion gelöst:

public void StartNextLevel()
        {
            _currentLevelIndex++;
            if (_currentLevelIndex < _levels.Count)
            {
                LoadLevel(_currentLevelIndex);
            }
        }

Ich habe absolut null Ahung, warum beim Wechsel des Levels der Ball nicht am SpawnPoint liegt und warum auch der EndPoint nicht neu gesetzt wird. Hat jemand von euch eine Idee? Welche Informationen brauch ihr noch von mir?

 

Danke

Christoph

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin!

Dafür, dass das gar nicht so einfach passieren dürfte, habe ich dieses Problem, dass beim zweiten Mal Laden etwas anders ist als beim ersten Mal, schon echt oft gesehen. Hast du irgendwo DontDestroyOnLoad drin, z.B. in deinem Spawn- und Endpunkt-Scripts oder so?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Problem könnte sein, dass ein Destroy nicht sofort passiert, sondern erst nach ablauf des Update-Loops.
Du zerstörst also den letzten Level, welcher aber bis zum Ende des Loops noch da ist, instanzierst einen neuen Level, hast jetzt also 2 Level gleichzeitig drin, suchst nach deinen Punkten, die jetzt 2 Mal drin sind, und findest die alten, schon gefundenen, Punkte.
Jetzt erst wird der alte Level aus der Szene raus genommen und deine gefundenen Punkte sind weg.

Was dir helfen könnte, wäre ein DestroyImmediate. Das wird aber ausdrücklich nicht empfohlen!
https://docs.unity3d.com/ScriptReference/Object.DestroyImmediate.html

Suchen die Punkte doch einfach mal im LateUpdate und guck ob dann alles in Ordnung ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...