Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
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)
using Godot;
public partial class MyButton : Button
{
private const string EnemyScenePath = "Enemy.tscn";
public override void _Ready()
{
ResourceLoader.LoadThreadedRequest(EnemyScenePath);
Pressed += OnButtonPressed;
}
}
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)
private void OnButtonPressed() // Button was pressed.
{
// Obtain the resource now that we need it.
var enemyScene = (PackedScene)ResourceLoader.LoadThreadedGet(EnemyScenePath);
// Instantiate the enemy scene and add it to the current scene.
var enemy = enemyScene.Instantiate();
AddChild(enemy);
}