Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Szenen-Eindeutige Nodes

Einführung

Die Verwendung von get_node(), um Nodes aus einem Skript zu referenzieren, kann manchmal fragil sein. Wenn Sie einen Button in einer UI-Szene von einem Panel zu einem anderen verschieben, ändert sich der Node-Pfad des Buttons, und wenn ein Skript get_node() mit einem fest kodierten Node-Pfad verwendet, wird das Skript den Button nicht mehr finden können.

In solchen Situationen kann der Node in einen Szenen-Eindeutigen Node umgewandelt werden, damit das Skript nicht jedes Mal aktualisiert werden muss, wenn der Pfad des Nodes geändert wird.

Erstellung und Verwendung

Klicken Sie im Szenenbaum-Dock mit der rechten Maustaste auf einen Node und wählen Sie im Kontextmenü Zugriff als Eindeutiger Name.

../../_images/unique_name.webp

Nach der Auswahl der Option wird der Node im Szenenbaum mit einem Prozent-Symbol (%) neben seinem Namen versehen:

../../_images/percent.webp

Sie können den Node nun in Ihrem Skript verwenden. Sie können ihn zum Beispiel mit einem get_node() Methodenaufruf referenzieren, indem Sie das %-Symbol eingeben, gefolgt vom Namen des Nodes:

get_node("%RedButton").text = "Hello"
%RedButton.text = "Hello" # Shorter syntax

"Selbe Szene"-Begrenzung

Ein Szenen-Eindeutiger Node kann nur von einem Node innerhalb derselben Szene abgerufen werden. Um diese Einschränkung zu verdeutlichen, betrachten Sie dieses Beispiel einer Spieler-Szene, die eine Schwert-Szene instanziiert:

../../_images/unique_name_scene_instance_example.webp

Hier sind die Ergebnisse der get_node()-Aufrufe innerhalb des Player Skripts:

  • get_node("%Eyes") gibt den Eyes-Node zurück.

  • get_node("%Hilt") gibt null zurück.

Dies sind die Ergebnisse der get_node()-Aufrufe innerhalb des Sword-Skripts:

  • get_node("%Eyes") liefert null zurück.

  • get_node("%Hilt") gibt den Hilt-Node zurück.

Wenn ein Skript Zugriff auf einen Node in einer anderen Szene hat, kann es get_node() auf diesem Node aufrufen, um Szenen-Eindeutige Nodes aus der Szene dieses Nodes zu erhalten. Dies funktioniert auch in einem Node-Pfad, was mehrere get_node() Aufrufe vermeidet. Hier sind zwei Wege, um den Hilt-Node aus dem Player-Skript zu erhalten, indem man Szenen-Eindeutige Nodes benutzt:

  • get_node("Hand/Sword").get_node("%Hilt") liefert den Hilt-Node.

  • get_node("Hand/Sword/%Hilt") liefert ebenfalls den Node Hilt.

Szenen-Eindeutige Namen funktionieren nicht nur am Ende eines Node-Pfads. Sie können auch in der Mitte verwendet werden, um von einem Node zu einem anderen zu navigieren. Zum Beispiel ist der Node Sword in der Szene Player als Szenen-Eindeutiger Node markiert, so dass dies möglich ist:

  • get_node("%Sword/%Hilt") gibt den Hilt-Node zurück.

Alternative Ansätze

Szenen-Eindeutige Nodes sind ein nützliches Hilfsmittel, um in einer Szene zu navigieren. Es gibt jedoch einige Situationen, in denen andere Methoden besser geeignet sind.

Eine Gruppe ermöglicht es, einen Node (oder eine Gruppe von vielen Nodes) von jedem anderen Node aus zu lokalisieren, unabhängig davon, in welcher Szene sich die beiden Nodes befinden.

Ein Singleton (Autoload) ist ein immer geladener Node, auf den von jedem Node unabhängig von der Szene direkt zugegriffen werden kann. Diese sind nützlich, wenn einige Daten oder Funktionen global gemeinsam genutzt werden.

Node.find_child() findet einen Node anhand seines Namens, ohne seinen vollständigen Pfad zu kennen. Dies scheint ähnlich wie ein Szenene-Eindeutiger Node, aber diese Methode ist in der Lage, Nodes in verschachtelten Szenen zu finden, und erfordert keine Markierung des Nodes im Szeneneditor in irgendeiner Weise. Allerdings ist diese Methode langsam. Szenen-Eindeutige Nodes werden von Godot zwischengespeichert und sind schnell auffindbar, aber jedes Mal, wenn die Methode aufgerufen wird, muss find_child() jeden Unter-Node überprüfen (jedes Child, dessen Child, und so weiter.).