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.

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_property: String = "my gdscript value":
    get:
        return my_property
    set(value):
        my_property = value

signal my_signal
signal my_signal_with_params(msg: String, n: int)

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)

func my_signal_handler():
    print("The signal handler was called!")

func my_signal_with_params_handler(msg: String, n: int):
    print_n_times(msg, n)

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 MyCSharpScript = load("res://Path/To/MyCSharpNode.cs")
var my_csharp_node = MyCSharpScript.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.

var myGDScript = GD.Load<GDScript>("res://path/to/my_gd_script.gd");
var 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.

# Output: "my c# value".
print(my_csharp_node.MyProperty)
my_csharp_node.MyProperty = "MY C# VALUE"
# Output: "MY C# VALUE".
print(my_csharp_node.MyProperty)

Zugriff auf GDScript-Felder über C#

As C# is statically typed, accessing GDScript from C# is a bit more convoluted. You will have to use GodotObject.Get() and GodotObject.Set(). The first argument is the name of the field you want to access.

// Output: "my gdscript value".
GD.Print(myGDScriptNode.Get("my_property"));
myGDScriptNode.Set("my_property", "MY GDSCRIPT VALUE");
// Output: "MY GDSCRIPT VALUE".
GD.Print(myGDScriptNode.Get("my_property"));

Keep in mind that when setting a field value you should only use types the GDScript side knows about. Essentially, you want to work with built-in types as described in Built-in-Typen or classes extending Object.

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`.

# Output: "my_gd_script_node" (or name of node where this code is placed).
my_csharp_node.PrintNodeName(self)
# This line will fail.
# my_csharp_node.PrintNodeName()

# Outputs "Hello there!" twice, once per line.
my_csharp_node.PrintNTimes("Hello there!", 2)

# Output: "a", "b", "c" (one per line).
my_csharp_node.PrintArray(["a", "b", "c"])
# Output: "1", "2", "3"  (one per line).
my_csharp_node.PrintArray([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.

// Output: "MyCSharpNode" (or name of node where this code is placed).
myGDScriptNode.Call("print_node_name", this);
// This line will fail silently and won't error out.
// myGDScriptNode.Call("print_node_name");

// Outputs "Hello there!" twice, once per line.
myGDScriptNode.Call("print_n_times", "Hello there!", 2);

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

Mit Signalen verbinden

Verbinden mit C#-Signalen von GDScript aus

Die Verbindung zu einem C#-Signal aus GDScript ist die gleiche wie die Verbindung zu einem in GDScript definierten Signal:

my_csharp_node.MySignal.connect(my_signal_handler)

my_csharp_node.MySignalWithParams.connect(my_signal_with_params_handler)

Verbinden mit GDScript-Signalen von C# aus

Das Verbinden mit einem GDScript-Signal von C# aus funktioniert nur mit der Methode Connect, da es keine statischen C#-Typen für von GDScript definierte Signale gibt:

myGDScriptNode.Connect("my_signal", Callable.From(MySignalHandler));

myGDScriptNode.Connect("my_signal_with_params", Callable.From<string, int>(MySignalWithParamsHandler));

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.