using Cysharp.Threading.Tasks; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; // Dieses Skript ist für das Hinzuladen und Entladen der Szenen zuständig. public class SceneLoader : MonoBehaviour { [SerializeField] private int baseSceneIndex; private bool isLoaded; private int currentScene = 0; public int prevScene = 0; private void Awake() { currentScene = baseSceneIndex; // holt sich den Index der aktuellen Szene } public void LoadScene(string sceneName) // ist die Funktion zum gewögnlichen Laden von Szenen { SceneManager.LoadScene(sceneName); } public void LoadNextSceneAdditive() // Lädt die nach Index nächste Szene additiv hinzu. Wird asynchron ausgeführt. { Debug.LogError("Triggered"); if (currentScene >= SceneManager.sceneCountInBuildSettings - 1 || SceneManager.loadedSceneCount > 2) return; // die aktuelle Szene darf nicht die letzte sein und es dürfen nöch keine zwei Szenen geladen sein. int nextScene = currentScene + 1; // setzt den Index für die nächste Szene prevScene = currentScene; // die aktuelle Szene wird zur "Previous Scene". Nun kann sie entladen werden. currentScene = nextScene; // die nächste Szene wird zur neuen "Current Scene". SceneManager.LoadSceneAsync(nextScene, LoadSceneMode.Additive); // nun wird die nächste Szene (in diesem moment dieselbe wie "Current Scene" asynchron hinzugeladen. Debug.Log("Loaded Scene " + nextScene); } public void UnloadPrevSceneAdditive() // Entlädt die Szene, deren Index als "Previous Scene" festgehalten ist. { if (prevScene == baseSceneIndex) return; // Wird nicht ausgeführt, wenn die "Previous Scene" die Basis-Szene ist. SceneManager.UnloadSceneAsync(prevScene); // Die "Previous Scene" wird entladen. if (SceneManager.GetSceneByName("CurrentResults").isLoaded) { SceneManager.UnloadSceneAsync("CurrentResults"); Debug.Log("Unloaded CurrentResults"); } } public void LoadResultsAdditive() // Lädt die Results zur aktuellen Szene { SceneManager.LoadScene("CurrentResults", LoadSceneMode.Additive); } public void NewRoom() { LoadNewRoom(); } private async UniTaskVoid LoadNewRoom() // Aktuelle Methode zum Laden von Szenen { int sceneCount = SceneManager.sceneCount; for (int i = 0; i < sceneCount; i++) { Scene myScene = SceneManager.GetSceneAt(i); if (myScene.isLoaded && myScene != SceneManager.GetSceneByBuildIndex(baseSceneIndex)) { currentScene = myScene.buildIndex; await SceneManager.UnloadSceneAsync(myScene); } } if (currentScene == SceneManager.sceneCountInBuildSettings-1) { await SceneManager.LoadSceneAsync(baseSceneIndex); // Lädt die Basis-Szene komplett neu, falls vorherige Szene die letzte war. } else { await SceneManager.LoadSceneAsync(currentScene + 1, LoadSceneMode.Additive); // Lädt die nächste Szene additiv Debug.Log("Loaded Room " + (currentScene + 1)); } } }