94 lines
3.8 KiB
C#
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.
|
|
}
|