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

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

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

Как объясняется в Основы C#, 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#.

ключевое слово 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, которое возвращает экземпляр 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

Transfоrm2D

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

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

GDScript код

C#

get_rotation()

Вращение

get_scale()

Scale

Плоскость

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

GDScript код

C#

center()

Center

Rеct2

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

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

Вариант

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.

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

GDScript код

C#

Color8

Color.Color8

is_inf

float.IsInfinity

is_nan

float.IsNaN

dict2inst

TODO

inst2dict

TODO