Up to date

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

Багатомовні скрипти

Godot дозволяє змішувати та поєднувати мови скриптів відповідно до ваших потреб. Це означає, що один проєкт може визначати вузли як у C#, так і в GDScript. Ця сторінка продемонструє можливі взаємодії між двома вузлами, написаними різними мовами.

Наступні два скрипти використовуватимуться як приклад на цій сторінці.

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)

Вставка екземплярів (Instantiating) вузлів

Якщо ви не використовуєте вузли з дерева сцени, ви, ймовірно, захочете вставляти їх екземляри (instantiate) безпосередньо з коду.

Вставка екземплярів (Instantiating) вузлів C# на GDScript

Використання C# на GDScript не потребує великих зусиль. Після завантаження (дивіться Класи як ресурси) скрипт може бути вставлений з допомогою new().

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

Попередження

Створюючи скрипти .cs, ви завжди повинні мати на увазі, що клас, який використовуватиме Godot, називається так же, як сам файл .cs. Якщо клас не існує в файлі, ви побачите наступне повідомлення про помилку: Invalid call. Nonexistent function `new` in base (Помилковий виклик. Не знайдено функцію new у базі).

Наприклад, MyCoolNode.cs повинен містити клас під назвою MyCoolNode.

The C# class needs to derive a Godot class, for example GodotObject. Otherwise, the same error will occur.

Вам також потрібно перевірити, чи ваш файл .cs посилається на файл проєкту .csproj. Інакше відбудеться та сама помилка.

Вставка екземплярів (Instantiating) вузлів GDScript на C#

З боку C# все працює так само. Після завантаження, GDScript може бути вставлений (instantiated) з GDScript.New ().

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

Тут ми використовуємо Object, але ви можете використовувати перетворення типів, як пояснено в Перетворення типів і кастинг.

Доступ до полів

Доступ до полів C# з GDScript

Доступ до полів C# з GDScript нескладний, вам нема про що хвилюватися.

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

Доступ до полів GDScript з 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.

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

Майте на увазі, що при встановленні значення поля слід використовувати лише типи, про які знає сторона GDScript. По суті, ви хочете працювати з вбудованими типами, як описано GDScript reference, або класах, що розширюють Object.

Методи виклику

Виклик методів C# з GDScript

Знову ж таки, виклик методів C# з GDScript повинен бути простим. Процес маршування зробить все можливе, щоб привести аргументи до відповідності підписів функцій. Якщо це неможливо, ви побачите наступне повідомлення про помилку: Invalid call. Nonexistent function `FunctionName` (Помилковий виклик. Не знайдено функцію 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

Виклик методів GDScript з C#

To call GDScript methods from C# you'll need to use GodotObject.Call(). The first argument is the name of the method you want to call. The following arguments will be passed to said method.

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.

Попередження

Як бачите, якщо перший аргумент викликаного методу є масивом, вам потрібно буде надати його як object. Інакше кожен елемент вашого масиву буде розглядатися як єдиний аргумент, і signature функції не збігатиметься.

Успадкування

Файл GDScript може не успадковуватися від скрипта C#. Подібним чином скрипт C# може не успадковуватись із файлу GDScript. Через те, наскільки складним буде це впровадження, це обмеження навряд чи буде знято в майбутньому. Для отримання додаткової інформації ознайомтеся з цією проблемою на GitHub.