Nodes und deren Fachausdrücke

Bevor Sie fortfahren, müssen Sie beachten, dass die Terminologie Node mit Vorsicht verwendet werden muss. Wenn Sie sich auf Visuelle Skript Nodes (oder allgemein auf Nodes) beziehen, bezieht sich dieser Text auf die kleinen Kästchen, die Sie mit Linien verbinden, die Teil eines Diagramms sind. Wenn auf Szenen-Nodes verwiesen wird, bedeutet dies, dass auf die Elemente verwiesen wird, aus denen eine Szene besteht, die Teil eines Baums sind. Ihre Benennung ist ähnlich, aber ihre Funktion ist unterschiedlich. Wenn hier auf Nodes verwiesen wird, wird impliziert, dass auf einen visuellen Skript-Node verwiesen wird, sofern nicht anders angegeben.

../../../_images/visual_script16.png

Node-Eigenschaften

Wie in den meisten visuellen Skript-Implementierungen verfügt jeder Node über bearbeitbare Eigenschaften. In Godot versuchen wir jedoch, die Nodes aus Gründen der Lesbarkeit nicht mit bearbeitbaren Steuerelementen aufzublähen.

Nodes zeigen weiterhin die erforderlichen Informationen als Text an, die Bearbeitung erfolgt jedoch über den Inspektor. Um sie zu bearbeiten wählen Sie einen beliebigen Node aus und bearbeiten Sie seine Eigenschaften im Inspektor.

Schnittstellen und Verbindungen

Godot VisualSkript programmiert man mittels Nodes und Port Verbindungen innerhalb jeder Funktion.

Ports

Nodes in Godot VisualScript haben Schnittstellen (Ports). Dies sind Endpunkte, die links und rechts von Nodes angezeigt werden und zum Herstellen von Verbindungen verwendet werden können: Es gibt zwei Arten von Ports: Sequenz und Daten.

../../../_images/visual_script17.png

Sequenz-Ports geben die Reihenfolge an, in der Operationen ausgeführt werden. Wenn ein Node seine Arbeit getan hat, wechselt er normalerweise von einem der Ports auf der rechten Seite zum nächsten Node. Wenn nichts angeschlossen ist, wird die Funktion möglicherweise beendet oder ein anderer Sequenz-Port Ausgang wird ausprobiert (dies hängt vom Node ab). Dank dessen können Sie dem Logikfluss innerhalb einer Funktion folgen, indem Sie den weißen Linien folgen. Nicht jeder Node hat Sequenz-Ports, die meisten haben keine.

Datenports enthalten typisierte Werte. Typen können beliebige reguläre Godot-Typen sein, z.B. ein Boolescher Wert, eine Ganzzahl, eine Zeichenfolge, ein Vektor3, ein Array, ein beliebiger Objekt- oder SzenenNode usw. Ein Datenport auf der rechten Seite eines Nodes wird als Ausgabe betrachtet. Ein Port auf der linken Seite ist ein Eingang. Durch das Verbinden können Informationen zum nächsten Node fließen.

Nicht alle Datenport-Typen sind kompatibel und ermöglichen trotzdem Verbindungen. Achten Sie besonders auf Farben und Symbole, da jeder Typ eine andere Darstellung hat:

../../../_images/visual_script18.png

Verbindungen

Das Verbinden ist ein relativ einfacher Vorgang. Ziehen Sie einen Ausgangsport in Richtung eines Eingangsports.

../../../_images/visual_script_connect.gif

Das Trennen der Verbindung erfordert etwas mehr Übung. Das Trennen in Datenports erfolgt durch Ziehen des Eingangs, während dies bei Sequenzports durch Ziehen des Ausgangs erfolgt.

../../../_images/visual_script_disconnect.gif

Dies mag zunächst seltsam erscheinen, geschieht jedoch, weil Datenports 1: N sind (ein einzelner Ausgangsport kann mit vielen Eingängen verbunden werden), während Sequenzports N: 1 sind (viele Sequenzausgänge können mit einem einzigen Eingang verbunden werden).

Das Herstellen einer Verbindung zum leeren Bereich (zum Verbinden ziehen, aber über den leeren Bereich drücken) ist ebenfalls kontextsensitiv. Es enthält eine Liste der häufigsten Vorgänge. Bei Sequenzen handelt es sich um bedingte Nodes:

../../../_images/visual_script52.png

Während für Daten ein Kontextmenü zum Festlegen/Abrufen/Aufrufen geöffnet wird:

../../../_images/visual_script53.png

Nodes hinzufügen

Geschafft! Das war der spaßige Teil! Bevor wir nun detaillierter darauf eingehen was welcher Type von Node genau macht, schauen wir uns erst einmal an wie Nodes für gewöhnlich hinzugefügt werden und wie man damit umgeht.

Auf Szenen-Nodes zugreifen

Eine der häufigsten Aufgaben ist der Zugriff auf Szenenbaum-Nodes (auch hier nicht zu verwechseln mit VisualScript Nodes). Beim ziehen aus dem Szenenbaum und platzieren auf der Zeichenfläche werden Sie aufgefordert auf diesem Node eine Methode aufzurufen (manchmal als Elementfunktion bezeichnet).

../../../_images/visual_script19.png

Während der Zugriff auf Eigenschaften in den meisten Fällen erwünscht ist (mehr dazu weiter unten), kann manchmal auch das Aufrufen von Methoden nützlich sein. Methoden führen bestimmte Aktionen für Objekte aus. In dem obigen Fall kann der Mauszeiger auf eine Position in lokalen Koordinaten zum Steuerelement verzogen werden. Ein weiterer häufiger Anwendungsfall ist das Einreihen eines Nodes zum Löschen, was mit der Methode queue_free erfolgt.

../../../_images/visual_script20.png

Es muss darauf geachtet werden, dass dies nur funktioniert, wenn die zu bearbeitende Szene Ihr VisualScript in einem der Nodes enthält! Andernfalls wird eine Warnung angezeigt.

Auf Eigenschaften von Szenen-Nodes zugreifen

Dies ist die häufigste Methode zum Bearbeiten von Szenen-Nodes im visuellen Skripten. Wählen Sie einen Szenen-Node aus dem Szenenbaum aus, gehen Sie zum Inspektor, suchen Sie den Namen der Eigenschaft, die Sie bearbeiten möchten (Hinweis, nicht den Wert!) Und ziehen Sie ihn auf die Leinwand:

../../../_images/visual_script21.png

Das Ergebnis ist, dass dieser Wert von Ihrem Skript aus geändert werden kann, indem Sie in einen Datenport schreiben.

Wenn Sie stattdessen diesen Wert lesen möchten, ziehen Sie den Node erneut, halten Sie jedoch folgende Taste gedrückt Ctrl (oder Cmd unterMacOS). Dadurch wird ein Getter erstellt:

../../../_images/visual_script22.png

In Diesem Fall kann der Wert von einem "Daten Port" gelesen werden.

Variablen

Variablen sind skriptlokale Speichercontainer, die einen Wert enthalten können. Dieser Wert kann von jeder der Funktionen des Skripts oder von anderen Skripten über die im vorherigen Schritt beschriebene Methode gelesen werden.

Um eine Variable hinzuzufügen, klicken Sie auf die Schaltfläche "+" im Abschnitt Variablen des Mitglieder-Panels. Doppelklicken Sie auf die neue Variable, um sie umzubenennen:

../../../_images/visual_script23.png

Ein Rechtsklick auf die Variable erlaubt es deren Eigenschaften zu ändern:

../../../_images/visual_script24.png ../../../_images/visual_script25.png

Wie oben zu sehen ist, können der Typ und der Anfangswert der Variablen sowie einige Eigenschaftshinweise geändert werden. Durch Aktivieren der Option "Exportieren" wird die Variable bei der Auswahl des Nodes im Inspektor angezeigt. Dadurch wird es auch anderen Skripten über die im vorherigen Schritt beschriebene Methode zur Verfügung gestellt.

../../../_images/visual_script28.png

Um die Variable in dem Skript zu verwenden, ziehe diese einfach in den Canvas um einen Getter zu erstellen:

../../../_images/visual_script26.png

Genauso halten Sie Ctrl (oder Cmd unter MacOS) gedrückt, um einen Setter zu erstellen:

../../../_images/visual_script27.png

Signale

Es ist auch möglich, eigene Signale in einem Skript zu erstellen und zu verwenden. Führen Sie dazu die gleichen Schritte aus, die Sie im vorherigen Schritt für Variablen ausgeführt haben, mit Ausnahme von Signale:

../../../_images/visual_script29.png

Ein Signal kann ebenfalls durch einen Rechtsklick editiert werden, um dessen Argumente anzupassen:

../../../_images/visual_script30.png

Das von Ihnen erstellte Signal wird zusammen mit den integrierten Node-Signalen im Inspektor angezeigt. Auf diese Weise können Sie eine Verbindung von einem anderen Skript zu einem anderen Szenen-Node herstellen:

../../../_images/visual_script31.png

Um das Signal zu senden, ziehen Sie es einfach auf die Leinwand:

../../../_images/visual_script32.png

Denken Sie daran, dass das Senden eines Signals eine sequenzierte Operation ist und daher von einem Sequenzport stammen muss.

Weitere Nodes hinzufügen

Nachdem die Grundlagen behandelt wurden, wollen wir die große Anzahl von Werkzeug-Nodes diskutieren, die für Ihre Zeichenfläche verfügbar sind. Unterhalb des Mitglieder-Panels befindet sich die Liste aller verfügbaren Node-Typen:

../../../_images/visual_script33.png

Drücken von Ctrl + F (oder Cmd + F auf MacOS) erlaubt es die Liste zu durchsuchen.

Jeder von ihnen kann in die Szene gezogen werden. Im Gegensatz zu Nodes (z.B. durch Ziehen einer Eigenschaft aus dem Inspektor wird der Kontext auf den Node gesetzt, der automatisch bearbeitet wird) werden diese ohne "Kontext"-Informationen hinzugefügt, sodass dies manuell erfolgen muss.

../../../_images/visual_script34.png

Denken Sie daran, dass Sie die Klassenreferenz auf die Funktionsweise der einzelnen Nodes überprüfen können, da diese dort dokumentiert sind. Es folgt eine kurze Übersicht über die Node-Typen:

Konstanten

Konstanten-Nodes stellen Werte bereit, die sich zwar nicht im Laufe der Zeit ändern, aber als Referenzwerte nützlich sein können. Meistens sind sie Ganzzahl oder Fliesskomma.

../../../_images/visual_script36.png

Der erste ist "Constant", mit dem Sie einen beliebigen Wert eines beliebigen Typs als Konstante auswählen können, von einer Ganzzahl (42) bis zu einer Zeichenfolge ("Hallo!"). Im Allgemeinen wird dieser Node aufgrund von Standardeingabewerten in Datenports nicht so häufig verwendet, aber es ist gut zu wissen, dass er vorhanden ist.

Der zweite ist der GlobalConstant-Node, der eine lange Liste von Konstanten für globale Typen in Godot enthält. Dort finden Sie einige nützliche Konstanten, die auf Schlüsselnamen, Joystick- oder Maustasten usw. verweisen.

Die dritte ist MathConstant, die typische mathematische Konstanten wie PI, E usw. bereitstellt.

Daten

Daten-Nodes befassen sich mit allen Arten des Zugriffs auf Informationen. Auf alle Informationen in Godot wird über diese Nodes zugegriffen, daher gehören sie zu den wichtigsten und sind sehr unterschiedlich.

../../../_images/visual_script37.png

Es gibt hier viele Arten interessanter Nodes, daher werden diese im folgenden kurz beschrieben:

Aktion

Aktions-Nodes sind wichtig wenn Eingaben von einem Gerät verarbeitet werden. Weitere Informationen zu Aktionen finden Sie im (@TODO Link noch nicht vorhanden). Im folgenden Beispiel wird das Steuerelement nach rechts verschoben, wenn die Aktion "move_right" gedrückt wird.

../../../_images/visual_script38.png

Engine Singleton

Engine-Singletons sind globale Schnittstellen (d.h. sie können ohne Referenz aufgerufen werden; im Gegensatz zu Szenen-Nodes sind sie immer verfügbar). Sie können für diverse Zwecken verwendet werden, sind jedoch im Allgemeinen für den Zugriff auf niedriger Ebene oder für den Zugriff auf das Betriebssystem nützlich.

../../../_images/visual_script39.png

Denken Sie daran, dass Sie durch Ziehen einer Verbindung in den leeren Bereich Funktionen aufrufen oder Eigenschaften für diese festlegen bzw. abrufen können:

../../../_images/visual_script40.png

Lokale Variablen

Dies sind Nodes, die Sie als temporären Speicher für Ihre Diagramme verwenden können. Stellen Sie sicher, dass alle denselben Namen und Typ haben wenn Sie sie verwenden und dass sie auf denselben Speicherplatz verweisen.

../../../_images/visual_script41.png

Wie oben zu sehen ist, stehen zwei Nodes zur Verfügung: Ein einfacher Getter und ein sequenzierter Setter (für die Einstellung ist ein Sequenzport erforderlich).

Szenen Node

Dies ist nur ein Verweis auf einen Node in der Baumstruktur. Sie können diesen Node jedoch einfacher verwenden, indem Sie den tatsächlichen Node aus dem Szenenbaum auf die Zeichenfläche ziehen (dadurch wird er erstellt und konfiguriert).

Selbst

In einigen seltenen Fällen kann es wünschenswert sein, diesen Szenen-Node als Argument zu übergeben. Es kann verwendet werden, um Funktionen aufzurufen und Eigenschaften festzulegen bzw. abzurufen, oder Nodes (oder den Node, der das Skript enthält) aus dem Szenenbaum auf die Zeichenfläche zu ziehen.

Szenenbaum

Dieser Node ähnelt dem Singleton-Node, da er auf den Szenenbaum verweist, der die aktive Szene enthält. SceneTree funktioniert jedoch nur, wenn der Node in der Szene sitzt und aktiv ist. Andernfalls wird beim Zugriff darauf ein Fehler zurückgegeben.

SceneTree ermöglicht viele Dinge auf niedriger Ebene, wie das Festlegen von Stretch-Optionen, das Aufrufen von Gruppen, das Erstellen von Timern oder sogar das Laden einer anderen Szene. Es wäre gut sich damit vertraut zu machen.

Vorladen

Dies hat die gleiche Funktion wie preload() in GDScript. Diese Ressource wird geladen und ist sofort einsatzbereit. Anstatt den Node zu instanziieren, ist es einfacher die gewünschte Ressource aus dem Dateisystem-Dock auf die Zeichenfläche zu ziehen.

Ressourcenpfad

Dieser Node ist ein einfacher Helfer, um einen Pfad zu einer gewählten Ressource als Zeichenfolge abzurufen. Es ist nützlich in Funktionen, die Dinge von der Festplatte laden.

Kommentar

Ein Kommentar-Node fungiert als Node dessen Größe Sie ändern können um ihn um andere Nodes zu legen. Es wird nicht versucht den Fokus zu erhalten oder bei der Auswahl nach oben zu bringen. Es kann auch verwendet werden, um Text darauf zu schreiben.

../../../_images/visual_script42.png

Flusskontrolle

Flusskontroll-Nodes erlauben der Ausführung verschiedene Wege zu nehmen, abhängig von vorgegebenen Bedingungen.

../../../_images/visual_script43.png

Bedingung

Dies ist ein einfacher Node, der einen Booleschen-Port überprüft. Bei true, geht es über den "true" Sequenz-Port weiter, bei false über den anderen. Nachdem Sie sich für einen von beiden entschieden haben, wird der Port "done" ausgeführt. Sequenz-Ports müssen nicht verbunden werden, wenn sie nicht genutzt werden.

Iterator

Einige Datentypen in Godot (d.h. Arrays, Dictionaries) sind iterierbar. Dies bedeutet, dass für jedes Element ein bisschen Code ausgeführt werden kann.

Der Iterator-Node durchläuft alle Elemente und für jedes von ihnen nutzt er den Sequenzport "each", wodurch das Element im Datenport "elem" verfügbar wird.

Wenn dies erledigt ist, erfolgt dies über den Sequenzport "exit".

Rückgabewert

Einige Funktionen können Werte zurückgeben. Im Allgemeinen fügt Godot für virtuelle den Rückgabe-Node für Sie hinzu. Ein Rückgabe-Node erzwingt das Beenden der Funktion.

Sequenz

Dieser Node ist hauptsächlich zum Organisieren Ihres Diagramms nützlich. Es ruft seine Sequenzports der Reihe nach auf.

TypeCast

Dies ist ein nützlicher und häufig verwendeter Node. Sie können ihn verwenden um Argumente oder andere Objekte in den gewünschten Typ umzuwandeln. Anschließend können Sie sogar die Objektausgabe ziehen, um es zu vervollständigen.

../../../_images/visual_script55.png

Es ist auch möglich ein Skript zu erstellen, das vollständige Skripteigenschaften und -funktionen ermöglicht:

../../../_images/visual_script54.png

Durchwechseln

Der Switch-Node ähnelt dem Bedingungs-Node, kann jedoch mit vielen Werten gleichzeitig übereinstimmen.

Während

Dies ist eine primitivere Form der Iteration. Die Sequenzausgabe "Wiederholen" wird aufgerufen, solange die Bedingung im Datenport "cond" erfüllt ist.

Funktionen

Funktionen sind einfache Helfer, meistens deterministisch. Sie nehmen einige Argumente als Eingabe und geben eine Ausgabe zurück. Sie werden fast nie sequenziert.

Eingebaut

Es gibt eine Liste der integrierten Helfer, die fast identisch ist mit der von GDScript. Die meisten von ihnen sind mathematische Funktionen, andere können aber auch sehr nützlich sein. Schauen Sie sich die Liste irgendwann einmal an.

Nach Typ

Dies sind die Methoden, die für Basistypen verfügbar sind. Wenn Sie beispielsweise ein Skalarprodukt (Punktprodukt) wünschen, können Sie anstelle der Kategorie Vector3 nach "Punkt" suchen. In den meisten Fällen durchsuchen Sie einfach die Liste der Nodes, dies sollte schneller sein.

Aufruf

Dies ist der generisch aufrufende Node. Es wird selten direkt verwendet, sondern durch Ziehen in den leeren Bereich auf einem bereits konfigurierten Node.

Konstruktoren

Dies sind alle Funktionen die zum Erstellen grundlegender Godot-Datentypen erforderlich sind. Wenn Sie beispielsweise einen Vector3 aus 3 Flieskommazahlen erstellen müssen, muss ein Konstruktor verwendet werden.

../../../_images/visual_script44.png

Destruktor

Dies ist das Gegenteil vom Konstruktor, der es jedem Basistyp (z.B. Vector3) erlaubt in seine Unterelemente unterteilt zu werden.

../../../_images/visual_script45.png

Signal aussenden

Sendet Signale von jedem Objekt. Im Allgemeinen ist es nicht so nützlich, da das Ziehen eines Signals auf die Leinwand besser funktioniert.

Get/Set

Generischer Getter/Setter-Nodes. Das Ziehen von Eigenschaften aus dem Inspektor funktioniert besser, da sie beim Ablegen ordnungsgemäß konfiguriert angezeigt werden.

Warte

Die Wait-Nodes unterbrechen die Ausführung der Funktion, bis etwas passiert (es können tatsächlich viele Frames bis zur Wiederaufnahme durchlaufen). Mit Standard-Nodes können Sie warten, bis ein Frame einen bestimmten Frame durchlaufen hat oder eine bestimmte Zeitspanne verstrichen ist, bis die Ausführung wieder aufgenommen wird.

Ertrag (zur Diskussion)

Dieser Node unterbricht die Ausführung des Skripts vollständig und bewirkt, dass die Funktion einen Wert zurückgibt, mit dem die Ausführung fortgesetzt werden kann.

Yield Signal

Entspricht Yield, wartet jedoch bis ein bestimmtes Signal ausgegeben wird.

Index

Generischer Indexierungsoperator, der nicht oft verwendet wird, falls doch ist es aber gut ihn zu haben.

Operatoren

Dies sind meistens generische Operatoren wie Addition, Multiplikation, Vergleich usw. Standardmäßig akzeptieren diese meistens jeden Datentyp (und geben zur Laufzeit einen Fehler aus, wenn die eingegebenen Typen nicht mit den vom Operator erwarteten übereinstimmen). Es wird immer empfohlen, den richtigen Typ für Operatoren festzulegen, um Fehler schneller zu erkennen und das Diagramm besser lesbar zu machen.

../../../_images/visual_script46.png

Ausdrucks-Node

Unter den Operatoren ist der Ausdruck-Node der leistungsstärkste. Wenn es gut verwendet wird, können Sie visuelle Skripte, die mathematisch oder logisch schwer sind, enorm vereinfachen. Geben Sie einen beliebigen Ausdruck ein und er wird in Echtzeit ausgeführt.

Ausdrucks-Nodes können:

  • Mathematische und logische Ausdrücke ausführen, basierend auf benutzerdefinierten Eingaben aus (z.B. "a*5+b", wobei a und b benutzerdefinierte Eingaben sind):

../../../_images/visual_script47.png
  • Zugriff auf lokale Variablen oder Eigenschaften:

../../../_images/visual_script48.png
  • Verwenden Sie die meisten der vorhandenen integrierten Funktionen, die GDScript zur Verfügung stehen, wie z.B. sin(), cos(), print() sowie Konstruktoren wie z.B. Vector3(x, y, z), Rect2(...), usw.:

../../../_images/visual_script49.png
  • API Funktionen aufrufen:

../../../_images/visual_script50.png
  • Verwenden Sie den sequenzierten Modus, der sinnvoller ist, wenn Sie die Verarbeitungsreihenfolge einhalten:

../../../_images/visual_script51.png