94 lines
3.0 KiB
GDScript
94 lines
3.0 KiB
GDScript
extends Node3D
|
|
|
|
@onready var progress_bar: ProgressBar = $XROrigin3D/XRCamera3D/LoadingUI/SubViewport/Control/VBoxContainer/ProgressBar
|
|
@onready var title_label: Label = $XROrigin3D/XRCamera3D/LoadingUI/SubViewport/Control/VBoxContainer/TitleLabel
|
|
@onready var xr_interface: XRInterface = XRServer.find_interface("OpenXR")
|
|
|
|
var main_scene_path: String = "res://scenes/escape-room-szene-room.tscn" # Passe den Pfad an deine Hauptszene an
|
|
var loading_status: Array = []
|
|
var progress: float = 0.0
|
|
var loading_complete: bool = false
|
|
var wait_timer: float = 0.0
|
|
const WAIT_TIME: float = 3.0
|
|
|
|
func _ready() -> void:
|
|
print("VR Loading Screen gestartet")
|
|
|
|
# Initialisiere XR
|
|
if xr_interface and xr_interface.is_initialized():
|
|
print("OpenXR bereits initialisiert")
|
|
get_viewport().use_xr = true
|
|
elif xr_interface:
|
|
print("Initialisiere OpenXR...")
|
|
if xr_interface.initialize():
|
|
get_viewport().use_xr = true
|
|
print("OpenXR erfolgreich initialisiert")
|
|
else:
|
|
push_error("OpenXR konnte nicht initialisiert werden")
|
|
else:
|
|
push_error("OpenXR Interface nicht gefunden")
|
|
|
|
# Prüfe ob UI-Nodes existieren
|
|
if progress_bar == null:
|
|
push_error("ProgressBar nicht gefunden!")
|
|
return
|
|
if title_label == null:
|
|
push_error("TitleLabel nicht gefunden!")
|
|
return
|
|
|
|
# Lade-Fortschritt initialisieren
|
|
progress_bar.value = 0
|
|
title_label.text = "Lade VR-Erlebnis..."
|
|
|
|
# Prüfe ob Hauptszene existiert
|
|
if not ResourceLoader.exists(main_scene_path):
|
|
push_error("Hauptszene nicht gefunden: " + main_scene_path)
|
|
title_label.text = "Szene nicht gefunden!"
|
|
return
|
|
|
|
# Starte das Laden der Hauptszene im Hintergrund
|
|
var error = ResourceLoader.load_threaded_request(main_scene_path)
|
|
if error != OK:
|
|
push_error("Fehler beim Laden der Szene: " + str(error))
|
|
title_label.text = "Fehler beim Laden!"
|
|
|
|
func _process(delta: float) -> void:
|
|
if progress_bar == null or title_label == null:
|
|
return
|
|
|
|
if not loading_complete:
|
|
# Prüfe den Lade-Fortschritt
|
|
var status = ResourceLoader.load_threaded_get_status(main_scene_path, loading_status)
|
|
|
|
if status == ResourceLoader.THREAD_LOAD_IN_PROGRESS:
|
|
# Aktualisiere die Progress Bar
|
|
if loading_status.size() > 0:
|
|
progress = loading_status[0] * 100.0
|
|
progress_bar.value = progress
|
|
|
|
elif status == ResourceLoader.THREAD_LOAD_LOADED:
|
|
# Laden abgeschlossen
|
|
progress_bar.value = 100
|
|
title_label.text = "Laden abgeschlossen!"
|
|
loading_complete = true
|
|
print("Laden abgeschlossen, warte 3 Sekunden...")
|
|
|
|
elif status == ResourceLoader.THREAD_LOAD_FAILED:
|
|
push_error("Laden der Szene fehlgeschlagen!")
|
|
title_label.text = "Laden fehlgeschlagen!"
|
|
loading_complete = true
|
|
|
|
else:
|
|
# Warte 3 Sekunden nach dem Laden
|
|
wait_timer += delta
|
|
if wait_timer >= WAIT_TIME:
|
|
_load_main_scene()
|
|
|
|
func _load_main_scene() -> void:
|
|
print("Wechsle zur Hauptszene...")
|
|
var packed_scene = ResourceLoader.load_threaded_get(main_scene_path)
|
|
if packed_scene:
|
|
get_tree().change_scene_to_packed(packed_scene)
|
|
else:
|
|
push_error("Konnte geladene Szene nicht abrufen!")
|