Files
2025-10-02 00:07:11 +02:00

94 lines
3.8 KiB
C#

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<SceneLoader>().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<GameObject> doors, List<RecieveHeat> 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<SceneLoader>().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.
}