Autoloads im Vergleich zu reguläre Nodes

Godot bietet eine Funktion zum automatischen Laden von Nodes im Stammverzeichnis Ihres Projekts, mit der Sie global auf diese zugreifen können und welche die Rolle eines Singleton erfüllen können Singletons (Entwurfsmuster) - AutoLoad. Diese automatisch geladenen Nodes werden nicht freigegeben, wenn Sie die Szene aus dem Code ändern mit SceneTree.change_scene.

In diesem Handbuch erfahren Sie, wann Sie die Autoload-Funktion verwenden und welche Techniken Sie verwenden können, um sie zu vermeiden.

Das einschneidende Audio-Problem

Andere Engines können die Erstellung von Manager-Klassen fördern: Singletons, die viele Funktionen in einem global zugänglichen Objekt organisieren. Godot bietet dank des Node-Baums und der Signale viele Möglichkeiten, um einen globalen Zustand zu vermeiden.

Nehmen wir zum Beispiel an, wir bauen einen Plattformer und möchten Münzen sammeln, wobei ein Soundeffekt abgespielt wird. Dafür gibt es einen Node: den AudioStreamPlayer <class_AudioStreamPlayer> `. Wenn wir jedoch den ``AudioStreamPlayer` aufrufen während bereits ein Sound abgespielt wird, unterbricht der neue Sound den vorherigen.

Eine Lösung besteht darin, eine globale, automatisch geladene Soundmanager-Klasse zu codieren. Es wird ein Pool von AudioStreamPlayer-Nodes generiert, die bei jeder neuen Anforderung von Soundeffekten durchlaufen werden. Angenommen, wir nennen diese Klasse Sound. Sie können sie von überall in Ihrem Projekt aus verwenden, indem Sie Sound.play("coin_pickup.ogg") aufrufen. Dies löst das Problem kurzfristig, verursacht jedoch weitere Probleme:

  1. ** Globaler Status **: Ein Objekt ist jetzt für alle Objektdaten verantwortlich. Wenn die Sound-Klasse Fehler aufweist oder kein AudioStreamPlayer verfügbar ist, können alle aufrufenden Nodes Probleme bekommen.

  2. Globaler Zugriff: Jetzt, da jedes Objekt Sound.play(sound_path) von überall aufrufen kann, gibt es keine einfache Möglichkeit mehr, die Ursache eines Fehlers zu finden.

  3. Globale Ressourcenzuweisung: Mit einem Pool von AudioStreamPlayer-Nodes, die von Anfang an gespeichert wurden, können Sie entweder zu wenige haben und damit Probleme bekommen, oder zu viele und es kann dadurch deutlich mehr Speicher verwendet werden als benötigt.

Bemerkung

Beim globalen Zugriff besteht das Problem darin, dass jeder Code irgendwo falsche Daten an das Autoload Sound in unserem Beispiel übergeben kann. Infolgedessen erstreckt sich der zu untersuchende Bereich zur Behebung des Fehlers über das gesamte Projekt.

Wenn Sie Code in einer Szene behalten, sind möglicherweise nur ein oder zwei Skripte an der Audioausgabe beteiligt.

Vergleichen Sie dies damit, dass jede Szene so viele AudioStreamPlayer-Nodes enthält wie sie selbst benötigt und all diese Probleme verschwinden:

  1. Jede Szene verwaltet ihre eigenen Statusinformationen. Wenn es ein Problem mit den Daten gibt, tauchen dies nur in dieser einen Szene auf.

  2. Jede Szene greift nur auf ihre eigenen Nodes zu. Wenn es nun einen Fehler gibt, ist es leicht diesen fehlerhaften Node zu finden.

  3. Jede Szene weist genau die Menge an Ressourcen zu, die sie benötigt.

Gemeinsame Funktionen oder Daten verwalten

Ein weiterer Grund für die Verwendung eines Autoloads kann sein, dass Sie dieselbe Methode oder dieselben Daten für viele Szenen wiederverwenden möchten.

Im Fall von Funktionen können Sie einen neuen Typ von Node erstellen, der diese Funktion für eine einzelne Szene bereitstellt, indem Sie das Schlüsselwort class_name in GDScript verwenden.

Wenn es um Daten geht, können Sie entweder:

  1. Einen neuen Typ Resource erstellen, um die Daten gemeinsam zu nutzen.

  2. Die Daten in einem Objekt speichern, auf das jeder Node Zugriff hat, z.B. mithilfe der owner-Eigenschaft, um auf den Stamm-Node der Szene zuzugreifen.

Wann Sie ein Autoload verwenden sollten

Automatisch geladene Nodes können Ihren Code in einigen Fällen vereinfachen:

  • ** Statische Daten **: Wenn Sie Daten benötigen, die nur für eine Klasse gelten, z. B. eine Datenbank, kann ein automatisches Laden ein gutes Werkzeug sein. In Godot gibt es keine Skript-API, mit der statische Daten anderweitig erstellt und verwaltet werden können.

  • Statische Funktionen: Erstellen einer Funktionsbibliothek, die nur Werte zurückgibt.

  • ** Systeme mit einem großen Umfang **: Wenn der Singleton seine eigenen Informationen verwaltet und nicht in die Daten anderer Objekte eindringt, ist dies eine hervorragende Möglichkeit, Systeme zu erstellen, die Aufgaben mit breitem Umfang ausführen. Zum Beispiel eine Quest oder ein Dialogsystem.

Bis Godot 3.1 war eine andere Verwendung nur der Einfachheit halber: Autoloads haben eine globale Variable für ihren Namen, die in GDScript generiert wurde, sodass man sie aus jeder Skriptdatei in Ihrem Projekt aufrufen kann. Jetzt können Sie stattdessen das Schlüsselwort `` class_name`` verwenden, um die automatische Vervollständigung für einen Typ in Ihrem gesamten Projekt zu erhalten.

Bemerkung

Autoload ist nicht gerade ein Singleton. Nichts hindert Sie daran, Kopien eines automatisch geladenen Nodes zu instanziieren. Es ist nur ein Tool, mit dem ein Node automatisch als untergeordnetes Element der Wurzel Ihres Szenenbaums geladen wird, unabhängig von der Nodestruktur Ihres Spiels oder der von Ihnen ausgeführten Szene, z. durch Drücken der Taste F6.

Infolgedessen können Sie das automatisch geladenen Node, beispielsweise ein Autoload mit dem Namen Sound, erhalten, indem Sie get_node ("/root/Sound") aufrufen.