Відмінності API C# в GDScript

Це (неповний) перелік відмінностей API між C# та GDScript.

Загальні відмінності

Як пояснено у Основи C#, C# зазвичай використовує PascalCase замість snake_case, який використовує GDScript та C ++.

Глобальна область

Глобальні функції та деякі константи довелося перемістити до класів, оскільки C# не дозволяє оголошувати їх у просторах імен. Більшість глобальних констант були переміщені до власних переліків.

Константи

Глобальні константи були переміщені до власних перерахунків. Наприклад, константи ERR_* були переміщені до переліку Error.

Особливі випадки:

Скрипт

C#

SPKEY

GD.SpKey

TYPE_*

перелік Variant.Type

OP_*

перелік Variant.Operator

Математичні функції

Математичні глобальні функції, такі як abs, acos, asin, atan і atan2, розташовані під Mathf як Abs, Acos, Asin, Atan і Atan2. Константа PI може бути знайдена як Mathf.Pi.

Функції випадковості

Глобальні функції випадковості, такі як rand_range і rand_seed, розташовані під GD. Приклад: GD.RandRange і GD.RandSeed.

Інші функції

Багато інших глобальних функцій на кшталт print і var2str розташовані під GD. Приклад: GD.Print і GD.Var2Str.

Винятки:

Скрипт

C#

weakref(obj)

Object.WeakRef(obj)

is_instance_valid(obj)

Object.IsInstanceValid(obj)

Поради

Іноді може бути корисним використання директиви``using static``. Ця директива дозволяє отримати доступ до членів та вкладених типів класу без вказування назви класу.

Приклад:

using static Godot.GD;

public class Test
{
    static Test()
    {
        Print("Hello"); // Instead of GD.Print("Hello");
    }
}

Ключове слово Export

Використовуйте атрибут [Export] замість ключового слова GDScript export. Цей атрибут також може надаватися з додатковими параметрами PropertyHint та hintString. Значення за замовчуванням можна встановити, призначивши значення.

Приклад:

using Godot;

public class MyNode : Node
{
    [Export]
    private NodePath _nodePath;

    [Export]
    private string _name = "default";

    [Export(PropertyHint.Range, "0,100000,1000,or_greater")]
    private int _income;

    [Export(PropertyHint.File, "*.png,*.jpg")]
    private string _icon;
}

Ключове слово Signal

Використовуйте атрибут [Signal], щоб оголосити сигнал замість ключового слова GDScript signal. Цей атрибут слід використовувати для делегата`(`delegate), підпис назви якого буде використаний для визначення сигналу.

[Signal]
delegate void MySignal(string willSendsAString);

Дивіться також: Сигнали C#.

Ключове слово onready

GDScript має можливість відкласти ініціалізацію змінної-члена, доки функція ready не буде викликана з допомогою onready (дивіться Ключове слово onready). Наприклад:

onready var my_label = get_node("MyLabel")

Однак C# не має цієї можливості. Для досягнення того ж ефекту вам потрібно зробити таке.

private Label _myLabel;

public override void _Ready()
{
    _myLabel = GetNode<Label>("MyLabel");
}

Сінглтони

Синглтони доступні як статичні класи, а не з допомогою шаблону синглтону. Це робить код менш багатослівним, ніж це було б з властивістю Instance.

Приклад:

Input.IsActionPressed("ui_down")

Однак у деяких дуже рідкісних випадках цього недостатньо. Наприклад, ви можете отримати доступ до члена з базового класу Godot.Object, наприклад Connect. Для таких випадків використання ми надаємо статичну властивість, іменовану, Singleton, яка повертає синглтон екземпляр. Тип цього екземпляра - Godot.Object.

Приклад:

Input.Singleton.Connect("joy_connection_changed", this, nameof(Input_JoyConnectionChanged));

Строка (рядок, текст)

Використовуйте System.String (string). Більшість методів String у Godot надаються класом StringExtensions, як методи розширення.

Приклад:

string upper = "I LIKE SALAD FORKS";
string lower = upper.ToLower();

Однак є кілька відмінностей:

  • erase: Строки є незмінні в C#, тому ми не можемо змінювати строку, передану методу розширення. З цієї причини Erase було додано як метод розширення StringBuilder``замість строки. Як варіант, ви можете використовувати ``string.Remove.

  • IsSubsequenceOf/IsSubsequenceOfi: Надається додатковий метод, який є перевантаженням IsSubsequenceOf, що дозволяє чітко вказати чутливість регістру:

str.IsSubsequenceOf("ok"); // Case sensitive
str.IsSubsequenceOf("ok", true); // Case sensitive
str.IsSubsequenceOfi("ok"); // Case insensitive
str.IsSubsequenceOf("ok", false); // Case insensitive
  • Match/Matchn/ExprMatch : Додатковий спосіб передбачений на додаток до Match і Matchn, який дозволяє явно вказати чутливість до регістру:

str.Match("*.txt"); // Case sensitive
str.ExprMatch("*.txt", true); // Case sensitive
str.Matchn("*.txt"); // Case insensitive
str.ExprMatch("*.txt", false); // Case insensitive

Основа

Структури не можуть мати конструкторів без параметрів у C #. Тому new Basis() ініціалізує всіх примітивних членів до їх значення за замовчуванням. Використовуйте Basis.Identity для еквівалента Basis() в GDScript та C ++.

Наступний метод був перетворений у властивість з іншою назвою:

Скрипт

C#

get_scale()

Scale

Transform2D

Структури не можуть мати конструкторів без параметрів у C#. Тому new Transform2D() ініціалізує всіх примітивних членів до їх значення за замовчуванням. Будь ласка, використовуйте Transform2D.Identity для еквівалента Transform2D() в GDScript та C ++.

Наступні методи були перетворені у властивості зі зміненими відповідними назвами:

Скрипт

C#

get_rotation()

Rotation

get_scale()

Scale

Площина

Наступний метод був перетворений у властивість з дещо іншою назвою:

Скрипт

C#

center()

Center

Rect2

Наступне поле було перетворене у властивість із дещо іншою назвою:

Скрипт

C#

end

End

Наступний метод був перетворений у властивість з іншою назвою:

Скрипт

C#

get_area()

Area

Quat

Структури не можуть мати конструкторів без параметрів у C#. Тому new Quat() ініціалізує всіх примітивних членів до їх значення за замовчуванням. Будь ласка, використовуйте Quat.Identity для еквівалента Quat() в GDScript та C++.

Наступні методи були перетворені у властивість з іншою назвою:

Скрипт

C#

length()

Length

length_squared()

LengthSquared

Масив

Це тимчасово. PoolArrays знадобляться власні типи, щоб їх можна було використовувати так, як вони призначені.

Скрипт

C#

Array

Godot.Collections.Array

PoolIntArray

int[]

PoolByteArray

byte[]

PoolFloatArray

float[]

PoolStringArray

String[]

PoolColorArray

Color[]

PoolVector2Array

Vector2[]

PoolVector3Array

Vector3[]

Godot.Collections.Array<T> є типо-безпечною обгорткою для Godot.Collections.Array. Використовуйте конструктор ``Godot.Collections.Array<T>(Godot.Collections.Array)``для його створення.

Словник

Використовуйте Godot.Collections.Dictionary.

Godot.Collections.Dictionary<T> є типо-безпечною обгорткою для Godot.Collections.Dictionary. Використовуйте конструктор Godot.Collections.Dictionary<T>(Godot.Collections.Dictionary) для його створення.

Варіант

System.Object (object) використовується замість Variant.

Взаємодія з іншими мовами скриптів

Це широко пояснюється в Багатомовні скрипти.

Результат

Щось подібне до yield GDScript з одним параметром можна досягти за допомогою ключового слова yield C#.

Еквівалент виходу сигналу може бути досягнутий за допомогою async/await та Godot.Object.ToSignal.

Приклад:

await ToSignal(timer, "timeout");
GD.Print("After timeout");

Інші відмінності

preload, так як він працює в GDScript, недоступний у C#. Використовуйте GD.Load, або ResourceLoader`.Load замість нього.

Інші відмінності:

Скрипт

C#

Color8

Color.Color8

is_inf

float.IsInfinity

is_nan

float.IsNaN

dict2inst

ЩЕ НЕ НАПИСАНО.

inst2dict

ЩЕ НЕ НАПИСАНО.