API различия С# и GDScript

Это (неполный) список различий API между C# и GDScript.

Общие отличия

Как объясняется в :ref: doc_c_sharp, C# обычно использует PascalCase вместо``snake_case``, используемого в GDScript и C++.

Глобальный контекст

Глобальные функции и некоторые константы пришлось перенести в классы, поскольку C# не позволяет объявлять их в пространствах имен. Большинство глобальных констант были перенесены в их собственные перечисления.

Константы

Глобальные константы были перенесены в собственные перечисления. Например, константы ERR_ * `` были перемещены в перечисление ``Error.

Особые случаи:

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

Исключения:

GDScript 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. Этот атрибут должен использоваться для делегата, чья подпись имени будет использоваться для определения сигнала.

[Signal]
delegate void MySignal(string willSendsAString);

См. также: Сигналы C#.

Синглтоны

Синглтоны доступны как статические классы, а не как шаблон синглтона. Это сделано для того, чтобы сделать код менее подробным, чем это было бы со свойством `` Instance``.

Пример:

Input.IsActionPressed("ui_down")

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

Пример:

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

Строки

Используйте System.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 ++.

Следующий метод был преобразован в свойство с другим именем:

GDScript C#
get_scale() Scale

Transform2D

Структуры не могут иметь конструкторов без параметров в C#. Следовательно, new Transform2D () `` инициализирует все примитивные члены их значением по умолчанию. Пожалуйста, используйте ``Transform2D.Identity для эквивалента ``Transform2D () `` в GDScript и C ++.

Следующие методы были преобразованы в свойства с соответствующими именами:

GDScript C#
get_rotation() Вращение
get_scale() Scale

Плоскость

Следующий метод был преобразован в свойство с немного другим именем:

GDScript C#
center() Center

Rect2

Следующее поле было преобразовано в свойство с немного другим именем:

GDScript C#
end End

Следующий метод был преобразован в свойство с другим именем:

GDScript C#
get_area() Area

Кват

Структуры не могут иметь конструкторов без параметров в C#. Следовательно, new Quat () `` инициализирует все примитивные члены их значением по умолчанию. Пожалуйста, используйте ``Quat.Identity для эквивалента ``Quat () `` в GDScript и C ++.

Следующие методы были преобразованы в свойство с другим именем:

GDScript C#
length() Длина
length_squared() LengthSquared

Массив

*Это временно. PoolArrays нуждаются в их собственных типах чтобы ими можно было пользоваться так как было задумано. *

GDScript C#
Массив 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) для его создания.

Variant

System.Object (`` object``) используется вместо Variant.

Общение с другими языками сценариев

Это подробно объясняется в Меж-языковые сценарии (скрипты).

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

Нечто похожее на yield в GDScript с одним параметром может быть достигнуто с помощью ключевого слова yield C#.

Эквивалент выхода по сигналу может быть достигнут с помощью async / await и Godot.Object.ToSignal.

Пример:

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

Другие различия

preload, так как он работает в GDScript, недоступен в C#. Вместо этого используйте GD.Load или ResourceLoader.Load.

Другие отличия:

GDScript C#
Color8 Color.Color8
is_inf float.IsInfinity
is_nan float.IsNaN
dict2inst TODO
inst2dict TODO