using GhostSystem; using UnityEngine; using UnityEngine.SceneManagement; using TMPro; using System.Collections.Generic; using UnityEngine.UI; using Cysharp.Threading.Tasks; using System.Threading.Tasks; // Skript der Basis-Szene, um den Szenenwechsel in der Version ohne Portale zu vollziehen. public class FlushAndLoad : MonoBehaviour { public TMP_Text output; public TMP_Text instruction; public GhostRecorderBatch recorder; public GameObject loadingScreen; public GameObject canvas; public GameObject passthroughLayer; private string sceneId; private void OnEnable() { GhostRecorderBatch.OnUploadFinished += HandleUploadFinished; // abonniert das Event, das ausgelöst wird, wenn der Upload in die Datenbank erfolgreich war. RoomManager.OnSceneIdReady += HandleSceneIdReady; // abonniert das Event, das ausgelöst wird, wenn die neue Szene vollständig hinzugeladen wurde. } private void OnDisable() { GhostRecorderBatch.OnUploadFinished -= HandleUploadFinished; RoomManager.OnSceneIdReady -= HandleSceneIdReady; } // Update is called once per frame void Update() { if (OVRInput.GetDown(OVRInput.Button.SecondaryIndexTrigger)) // der rechte Trigger löst den Szenenwechsel aus. { if (sceneId == "End") Application.Quit(); // außer nach der letzten Szene. Dort wird die Anwendung beendet. else { output.text = "Flush..."; _ = LoadScene(); /*loadingScreen.SetActive(true); canvas.SetActive(false); recorder.Flush(); GetComponent().NewRoom();*/ } } } private void HandleUploadFinished() // wenn der Upload in die Datenbank erfolgreich war, wird der Pass-Through-Layer wieder deaktiviert, um entweder die neue Szene zu zeigen { loadingScreen.SetActive(false); output.text = ""; if (sceneId == "End") // oder nach der letzten Szene einen Info-Text. { output.text = "Durchlauf beendet."; } } private void HandleSceneIdReady(string id, List doors, List targets) { sceneId = id; // wenn die neu hinzugeladene Szene bereit ist, wird die sceneID gesetzt. if (id == "Room1") { loadingScreen.SetActive(false); // Bei Room1 wird zusätzlich der Pass-Through-Layer/Loding Screen deaktiviert, da hier noch keine Daten hochgeladen werden passthroughLayer.SetActive(false); // und somit das entsprechende Event nicht ausgelöst wird. } if (id == "End") { instruction.text = "Drücke den rechten Trigger, um die Anwendung zu beenden."; // Die zweite Ausnahme bildet die letzte Szene. Hier erscheint nur eine Info-Tafel. canvas.SetActive(true); passthroughLayer.SetActive(true); } } private async UniTask Loadingscreen() { loadingScreen.SetActive(true); canvas.SetActive(false); } private async UniTaskVoid LoadScene() // Die eigentliche Funktion zum Laden der Szene aktiviert erst den Pass-Through-Layer/Loading Screen um Motion Sickness durch stehendes { // Bild zu vermeiden. Dann wird der Flush-Befehl zum Upload der Recording-Daten in die Datenbank gegeben. await Loadingscreen(); recorder.Flush(); GetComponent().NewRoom(); // Es wird der nächste Raum geladen. Der Pass-Through-Layer bleibt so lange aktiv, bis er durch die abonnierten Events deaktiviert } // wird. So kann Motion-Sickness durch stockende Bilder beim Laden vermieden werden. }