Up to date
This page is up to date for Godot 4.2
.
If you still find outdated information, please open an issue.
Laden im Hintergrund¶
In der Regel müssen Spiele Ressourcen asynchron laden. Wenn Sie die Hauptszene Ihres Spiels wechseln (z.B. zu einem neuen Level), möchten Sie vielleicht einen Ladebildschirm mit einem Hinweis darauf anzeigen, dass etwas passiert, oder Sie möchten zusätzliche Ressourcen während des Spiels laden.
Die Standard-Lademethode (ResourceLoader.load oder die einfachere GDScript-Methode load) blockiert Ihren Thread, so dass Ihr Spiel nicht mehr reagiert, während die Ressource geladen wird.
Eine Möglichkeit, dies zu umgehen, ist die Verwendung von ResourceLoader
zum asynchronen Laden von Ressourcen in Hintergrund-Threads.
Verwendung von ResourceLoader¶
Im Allgemeinen stellt man Anfragen zum Laden von Ressourcen für einen Pfad mit ResourceLoader.load_threaded_request in eine Warteschlange, die dann in Threads im Hintergrund geladen werden.
Sie können den Status mit ResourceLoader.load_threaded_get_status überprüfen. Der Fortschritt kann durch die Übergabe einer Array-Variable über progress erhalten werden, die ein Ein-Element-Array zurückgibt, das den Prozentsatz enthält.
Schließlich können Sie geladene Ressourcen durch den Aufruf von ResourceLoader.load_threaded_get abrufen.
Nach dem Aufruf von load_threaded_get()
wird entweder die Ressource im Hintergrund fertig geladen und sofort zurückgegeben oder der Ladevorgang wird an dieser Stelle blockiert, wie es bei load()
der Fall wäre. Wenn Sie sicherstellen wollen, dass der Vorgang nicht blockiert, müssen Sie entweder sicherstellen, dass zwischen der Anforderung des Ladevorgangs und dem Abrufen der Ressource genügend Zeit vergeht, oder Sie müssen den Status manuell überprüfen.
Beispiel¶
Dieses Beispiel zeigt, wie man eine Szene im Hintergrund lädt. Wir werden einen Button haben, der einen Gegner spawnen lässt, wenn er gedrückt wird. Der Gegner wird Enemy.tscn
sein, den wir bei _ready
laden und beim Drücken instanziieren. Der Pfad wird "Enemy.tscn"
sein, der unter res://Enemy.tscn
zu finden ist.
Zunächst wird eine Anfrage gestartet, um die Ressource zu laden und den Button zu verbinden:
const ENEMY_SCENE_PATH : String = "Enemy.tscn"
func _ready():
ResourceLoader.load_threaded_request(ENEMY_SCENE_PATH)
self.pressed.connect(_on_button_pressed)
Jetzt wird _on_button_pressed
aufgerufen, wenn der Button gedrückt wird. Diese Methode wird benutzt, um einen Gegner zu spawnen.
func _on_button_pressed(): # Button was pressed
# Obtain the resource now that we need it
var enemy_scene = ResourceLoader.load_threaded_get(ENEMY_SCENE_PATH)
# Instantiate the enemy scene and add it to the current scene
var enemy = enemy_scene.instantiate()
add_child(enemy)