Up to date

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

Cross-Language-Skripting

Godot erlaubt es, mehrere Skriptsprachen zu mischen, je nach Anforderung. Ein einzelnes Projekt kann somit Nodes sowohl in C# als auch in GDScript definieren. Diese Seite geht auf die möglichen Interaktionen zwischen zwei Nodes ein, die in unterschiedlichen Sprachen geschrieben wurden.

Die folgenden beiden Skripte werden durchgehend auf dieser Seite als Referenz genutzt.

extends Node

var my_field: String = "foo"

func print_node_name(node: Node) -> void:
    print(node.get_name())

func print_array(arr: Array) -> void:
    for element in arr:
        print(element)

func print_n_times(msg: String, n: int) -> void:
    for i in range(n):
        print(msg)

Instanziieren von Nodes

Wenn Sie keine Nodes aus dem Szenenbaum verwenden, werden Sie wahrscheinlich Nodes direkt aus dem Code instanziieren wollen.

Instanziierung von C# Nodes aus GDScript

C# aus GDScript zu nutzen, benötigt nicht viel Aufwand. Einmal geladen (siehe Klassen als Ressourcen) kann das Skript mit new() instanziiert werden.

var my_csharp_script = load("res://Path/To/MyCSharpNode.cs")
var my_csharp_node = my_csharp_script.new()

Warnung

Wenn Sie .cs-Skripte erstellen, sollten Sie immer bedenken, dass die von Godot verwendete Klasse genauso benannt wird wie die .cs-Datei selbst. Wenn diese Klasse in der Datei nicht vorhanden ist, wird der folgende Fehler angezeigt: Ungültiger Aufruf. Nicht vorhandene Funktion `neu` in base.

Zum Beispiel soll MyCoolNode.cs eine Klasse namens MyCoolNode beinhalten.

Die C#-Klasse muss eine Godot-Klasse ableiten, zum Beispiel GodotObject. Andernfalls wird derselbe Fehler auftreten.

Sie müssen auch überprüfen, ob auf Ihre .cs-Datei in der .csproj-Datei des Projekts verwiesen wird. Andernfalls tritt der gleiche Fehler auf.

Instanziieren von GDScript Nodes über C#

Von der C#-Seite aus funktioniert alles auf die gleiche Art. Einmal geladen, kann das GDScript mit GDScript.New() instanziiert werden.

GDScript MyGDScript = GD.Load<GDScript>("res://path/to/my_gd_script.gd");
GodotObject myGDScriptNode = (GodotObject)MyGDScript.New(); // This is a GodotObject.

Hier verwenden wir ein Object, aber Sie können die Typkonvertierung wie in Typumwandlung und Casting beschrieben verwenden.

Zugriff auf Felder

Zugriff auf C# Felder über GDScript

Der Zugriff auf C# Felder über GDScript ist unkompliziert, Sie müssen sich keine Sorgen machen.

print(my_csharp_node.myField) # bar
my_csharp_node.myField = "BAR"
print(my_csharp_node.myField) # BAR

Zugriff auf GDScript-Felder über C#

Da C# statisch typisiert ist, ist der Zugriff auf GDScript von C# aus etwas umständlicher. Sie müssen GodotObject.Get() und GodotObject.Set() verwenden. Das erste Argument ist der Name des Feldes, auf das Sie zugreifen möchten.

GD.Print(myGDScriptNode.Get("my_field")); // foo
myGDScriptNode.Set("my_field", "FOO");
GD.Print(myGDScriptNode.Get("my_field")); // FOO

Beachten Sie, dass Sie beim Festlegen eines Feldwerts nur Typen verwenden sollten, die der GDScript-Seite bekannt sind. Im Wesentlichen sollten Sie mit Built-in-Typen arbeiten, wie in GDScript-Referenz beschrieben, oder Klassenerweiterung von Object verwenden.

Aufruf von Methoden

Aufruf von C#-Methoden über GDScript

Auch hier sollte das Aufrufen von C#-Methoden über GDScript unkompliziert sein. Der Marshalling-Prozess wird sein Bestes tun, die Argumente so umzuwandeln, dass sie mit den Funktionssignaturen übereinstimmen. Wenn dies nicht möglich ist, wird der folgende Fehler angezeigt: Invalid call. Nonexistent function `FunctionName`.

my_csharp_node.PrintNodeName(self) # myGDScriptNode
# my_csharp_node.PrintNodeName() # This line will fail.

my_csharp_node.PrintNTimes("Hello there!", 2) # Hello there! Hello there!

my_csharp_node.PrintArray(["a", "b", "c"]) # a, b, c
my_csharp_node.PrintArray([1, 2, 3]) # 1, 2, 3

Aufruf von GDScript-Methoden über C#

Um GDScript-Methoden von C# aus aufzurufen, müssen Sie GodotObject.Call() verwenden. Das erste Argument ist der Name der Methode, die Sie aufrufen möchten. Die folgenden Argumente werden an diese Methode übergeben.

myGDScriptNode.Call("print_node_name", this); // my_csharp_node
// myGDScriptNode.Call("print_node_name"); // This line will fail silently and won't error out.

myGDScriptNode.Call("print_n_times", "Hello there!", 2); // Hello there! Hello there!

string[] arr = new string[] { "a", "b", "c" };
myGDScriptNode.Call("print_array", arr); // a, b, c
myGDScriptNode.Call("print_array", new int[] { 1, 2, 3 }); // 1, 2, 3
// Note how the type of each array entry does not matter as long as it can be handled by the marshaller.

Warnung

Wie Sie sehen können, müssen Sie das erste Argument der aufgerufenen Methode nach object casten, wenn es sich um ein Array handelt. Andernfalls wird jedes Element Ihres Arrays als einzelnes Argument behandelt und die Funktionssignatur stimmt nicht überein.

Vererbung

Eine GDScript-Datei darf nicht von einem C#-Skript erben. Genauso wenig darf ein C#-Skript von einer GDScript-Datei erben. Aufgrund der Komplexität der Implementierung ist es unwahrscheinlich, dass diese Einschränkung in Zukunft aufgehoben wird. Weitere Informationen finden Sie in dieser GitHub-Issue.