API различия C# и GDScript
Это (неполный) список различий API между C# и GDScript.
Общие отличия
Как поясняется в документе Основные различия между C# и GDScript, для доступа к API-ам Godot в C# используется PascalCase вместо snake_case, используемого в GDScript и C++. По возможности поля и геттеры/сеттеры преобразованы в свойства. В целом, API Godot в C# стремится быть максимально идиоматичным. См. документ Руководство по стилю C#, который мы рекомендуем вам использовать и в вашем собственном коде на C#.
В GDScript сеттеры/геттеры свойства можно вызывать напрямую, хотя это не рекомендуется. В C# определяется только само свойство. Например, чтобы перевести код GDScript x.set_name("Friend") в C#, напишите x.Name = "Friend";.
Среда разработки C# поддерживает технологию Intellisense, что чрезвычайно полезно при работе с переименованными API C#. Встроенный редактор скриптов Godot не поддерживает Intellisense для C# и не предоставляет многих других необходимых инструментов разработки на C#. См. Настройка внешнего редактора.
Глобальная область
Глобальные функции и некоторые константы пришлось перенести в классы, поскольку C# не позволяет объявлять их в пространствах имен. Большинство глобальных констант были перенесены в их собственные перечисления.
Константы
В C# константами могут быть только примитивные типы. Например, константа TAU заменяется константой Mathf.Tau, а константа Vector2.RIGHT заменяется свойством Vector2.Right, доступным только для чтения. Это свойство действует аналогично константе, но не может использоваться в некоторых контекстах, например, в операторах switch.
Глобальные константы перечислений были перемещены в отдельные перечисления. Например, константы ERR_* были перемещены в перечисление Error.
Особые случаи:
GDScript |
C# |
|---|---|
|
|
|
|
Математические функции
Глобальные математические функции, такие как abs, acos, asin, atan и atan2, расположены под Mathf как Abs, Acos, Asin, Atan и Atan2. Константу PI можно найти как Mathf.Pi.
C# также предоставляет статические классы System.Math и System.MathF, которые могут содержать другие полезные математические операции.
Случайные функции
Случайные глобальные функции, такие как rand_range и rand_seed, расположены под GD. Пример: GD.RandRange и GD.RandSeed.
Рассмотрите возможность использования System.Random или, если вам нужна криптографически стойкая случайность, System.Security.Cryptography.RandomNumberGenerator.
Другие функции
Многие другие глобальные функции, такие как print и var_to_str, находятся в GD. Примеры: GD.Print и GD.VarToStr.
Исключения:
GDScript |
C# |
|---|---|
|
|
|
|
|
|
|
|
Советы
Иногда может быть полезно использовать директиву using static. Эта директива позволяет получить доступ к членам и вложенным типам класса без указания имени класса.
Пример:
using static Godot.GD;
public class Test
{
static Test()
{
Print("Hello"); // Instead of GD.Print("Hello");
}
}
Полный список эквивалентностей
Список глобальных функций области действия Godot и их эквиваленты в C#:
GDScript |
C# |
|---|---|
abs |
Mathf.Abs |
absf |
Mathf.Abs |
absi |
Mathf.Abs |
acos |
Mathf.Acos |
acosh |
Mathf.Acosh |
angle_difference |
Mathf.AngleDifference |
asin |
Mathf.Asin |
asinh |
Mathf.Asinh |
atan |
Mathf.Atan |
atan2 |
Mathf.Atan2 |
atanh |
Mathf.Atanh |
bezier_derivative |
Mathf.BezierDerivative |
bezier_interpolate |
Mathf.BezierInterpolate |
bytes_to_var |
GD.BytesToVar |
bytes_to_var_with_objects |
GD.BytesToVarWithObjects |
ceil |
Mathf.Ceil |
ceilf |
Mathf.Ceil |
ceili |
Mathf.CeilToInt |
clamp |
Mathf.Clamp |
clampf |
Mathf.Clamp |
clampi |
Mathf.Clamp |
cos |
Mathf.Cos |
cosh |
Mathf.Cosh |
cubic_interpolate |
Mathf.CubicInterpolate |
cubic_interpolate_angle |
Mathf.CubicInterpolateAngle |
cubic_interpolate_angle_in_time |
Mathf.CubicInterpolateInTime |
cubic_interpolate_in_time |
Mathf.CubicInterpolateAngleInTime |
db_to_linear |
Mathf.DbToLinear |
deg_to_rad |
Mathf.DegToRad |
ease |
Mathf.Ease |
error_string |
Error.ToString |
exp |
Mathf.Exp |
floor |
Mathf.Floor |
floorf |
Mathf.Floor |
floori |
Mathf.FloorToInt |
fmod |
operator % |
fposmod |
Mathf.PosMod |
hash |
GD.Hash |
instance_from_id |
GodotObject.InstanceFromId |
inverse_lerp |
Mathf.InverseLerp |
is_equal_approx |
Mathf.IsEqualApprox |
is_finite |
Mathf.IsFinite или float.IsFinite или double.IsFinite |
is_inf |
Mathf.IsInf или float.IsInfinity или double.IsInfinity |
is_instance_id_valid |
GodotObject.IsInstanceIdValid |
is_instance_valid |
GodotObject.IsInstanceValid |
is_nan |
Mathf.IsNaN или float.IsNaN или double.IsNaN |
is_same |
operator == или object.ReferenceEquals |
is_zero_approx |
Mathf.IsZeroApprox |
lerp |
Mathf.Lerp |
lerp_angle |
Mathf.LerpAngle |
lerpf |
Mathf.Lerp |
linear_to_db |
Mathf.LinearToDb |
log |
Mathf.Log |
max |
Mathf.Max |
maxf |
Mathf.Max |
maxi |
Mathf.Max |
min |
Mathf.Min |
minf |
Mathf.Min |
mini |
Mathf.Min |
move_toward |
Mathf.MoveToward |
nearest_po2 |
Mathf.NearestPo2 |
pingpong |
Mathf.PingPong |
posmod |
Mathf.PosMod |
pow |
Mathf.Pow |
GD.Print |
|
print_rich |
GD.PrintRich |
print_verbose |
Используйте OS.IsStdoutVerbose и GD.Print |
printerr |
GD.PrintErr |
printraw |
GD.PrintRaw |
prints |
GD.PrintS |
printt |
GD.PrintT |
push_error |
GD.PushError |
push_warning |
GD.PushWarning |
rad_to_deg |
Mathf.RadToDeg |
rand_from_seed |
GD.RandFromSeed |
randf |
GD.Randf |
randf_range |
GD.RandRange |
randfn |
GD.Randfn |
randi |
GD.Randi |
randi_range |
GD.RandRange |
randomize |
GD.Randomize |
remap |
Mathf.Remap |
rid_allocate_id |
N/A |
rid_from_int64 |
N/A |
rotate_toward |
Mathf.RotateToward |
round |
Mathf.Round |
roundf |
Mathf.Round |
roundi |
Mathf.RoundToInt |
seed |
GD.Seed |
sign |
Mathf.Sign |
signf |
Mathf.Sign |
signi |
Mathf.Sign |
sin |
Mathf.Sin |
sinh |
Mathf.Sinh |
smoothstep |
Mathf.SmoothStep |
snapped |
Mathf.Snapped |
snappedf |
Mathf.Snapped |
snappedi |
Mathf.Snapped |
sqrt |
Mathf.Sqrt |
step_decimals |
Mathf.StepDecimals |
str |
Используйте $ string interpolation |
str_to_var |
GD.StrToVar |
tan |
Mathf.Tan |
tanh |
Mathf.Tanh |
type_convert |
Variant.As<T> или GD.Convert |
type_string |
Variant.Type.ToString |
typeof |
Variant.VariantType |
var_to_bytes |
GD.VarToBytes |
var_to_bytes_with_objects |
GD.VarToBytesWithObjects |
var_to_str |
GD.VarToStr |
weakref |
GodotObject.WeakRef |
wrap |
Mathf.Wrap |
wrapf |
Mathf.Wrap |
wrapi |
Mathf.Wrap |
Список вспомогательных функций GDScript и их эквивалентов в C#:
GDScript |
C# |
|---|---|
assеrt |
|
char |
Используйте явное преобразование: |
convert |
GD.Convert |
dict_to_inst |
N/A |
get_stack |
|
inst_to_dict |
N/A |
len |
N/A |
load |
GD.Load |
prеload |
N/A |
print_debug |
N/A |
print_stack |
GD.Print(System.Environment.StackTrace) |
range |
GD.Range или System.Linq.Enumerable.Range |
type_exists |
ClassDB.ClassExists(type) |
preload, так как он работает в GDScript, недоступен в C#. Вместо этого используйте GD.Load или ResourceLoader.Load.
Аннотация @export
Используйте атрибут [Export] вместо аннотации GDScript @export. Этот атрибут также можно указать с необязательными параметрами PropertyHint и hintString. Значения по умолчанию можно задать, присвоив значение.
Пример:
using Godot;
public partial 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;
}
См. также: Экспортированные свойства C#.
Ключевое слово signal
Используйте атрибут [Signal] для объявления сигнала вместо ключевого слова signal из GDScript. Этот атрибут следует использовать для delegate, сигнатура имени которого будет использоваться для определения сигнала. delegate должен иметь суффикс EventHandler. Событие event будет сгенерировано в классе с тем же именем, но без суффикса. Используйте имя этого события с EmitSignal.
[Signal]
delegate void MySignalEventHandler(string willSendAString);
См. также: Сигналы C#.
Аннотация @onready
GDScript позволяет отложить инициализацию переменной-члена до вызова функции готовности с помощью @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")
Однако в некоторых очень редких случаях этого недостаточно. Например, вам может потребоваться доступ к члену базового класса GodotObject, например, Connect. Для таких случаев мы предоставляем статическое свойство Singleton, возвращающее экземпляр синглтона. Тип этого экземпляра — GodotObject.
Пример:
Input.Singleton.JoyConnectionChanged += Input_JoyConnectionChanged;
При разработке плагинов для главного экрана важно учитывать, что EditorInterface не является статическим классом в C#, в отличие от GDScript. Поэтому для получения экземпляра EditorInterface необходимо использовать шаблон Singleton:
GDScript |
C# |
|---|---|
|
|
Строка
Используйте System.String (string). Большинство методов String в Godot имеют эквивалент в System.String или предоставляются классом StringExtensions как методы расширения.
Заметьте, что C# strings используют кодирование UTF-16, в то время как Godot Strings используют кодирование UTF-32.
Пример:
string text = "Get up!";
string[] bigrams = text.Bigrams(); // ["Ge", "et", "t ", " u", "up", "p!"]
Строки в .NET неизменяемы, поэтому все методы, работающие со строками, не изменяют исходную строку, а возвращают новую строку с применёнными изменениями. Чтобы избежать создания нескольких строковых выделений, используйте StringBuilder.
Список Godot's String методов и их эквивалента в C#:
GDScript |
C# |
|---|---|
begins_with |
|
bigrams |
StringExtensions.Bigrams |
bin_to_int |
StringExtensions.BinToInt |
c_escape |
StringExtensions.CEscape |
c_unescape |
StringExtensions.CUnescape |
capitalize |
StringExtensions.Capitalize |
casecmp_to |
StringExtensions.CasecmpTo или StringExtensions.CompareTo (рассмотрите возможность использования string.Equals или string.Compare) |
chr |
N/A |
contains |
|
count |
StringExtensions.Count (рассмотрите возможность использования RegEx) |
countn |
StringExtensions.CountN (рассмотрите возможность использования RegEx) |
dedent |
StringExtensions.Dedent |
ends_with |
|
erase |
string.Remove (Рассмотрите возможность использования StringBuilder для работы со строками) |
find |
StringExtensions.Find (рассмотрите возможность использования string.IndexOf или string.IndexOfAny) |
findn |
StringExtensions.FindN (рассмотрите возможность использования string.IndexOf или string.IndexOfAny) |
format |
Используйте $ string interpolation |
get_base_dir |
StringExtensions.GetBaseDir |
get_basename |
StringExtensions.GetBaseName |
get_extension |
StringExtensions.GetExtension |
get_file |
StringExtensions.GetFile |
get_slice |
N/A |
get_slice_count |
N/A |
get_slicec |
N/A |
hash |
StringExtensions.Hash (Рассмотрите возможность использования object.GetHashCode, если вам не нужно гарантировать такое же поведение, как в GDScript) |
hex_decode |
StringExtensions.HexDecode (рассмотрите возможность использования System.Convert.FromHexString) |
hex_to_int |
StringExtensions.HexToInt (рассмотрите возможность использования int.Parse или long.Parse с System.Globalization.NumberStyles.HexNumber) |
humanize_size |
N/A |
indent |
StringExtensions.Indent |
insert |
string.Insert (Рассмотрите возможность использования StringBuilder для работы со строками) |
is_absolute_path |
StringExtensions.IsAbsolutePath |
is_empty |
|
is_relative_path |
StringExtensions.IsRelativePath |
is_subsequence_of |
StringExtensions.IsSubsequenceOf |
is_subsequence_ofn |
StringExtensions.IsSubsequenceOfN |
is_valid_filename |
StringExtensions.IsValidFileName |
is_valid_float |
StringExtensions.IsValidFloat (рассмотрите возможность использования float.TryParse или double.TryParse) |
is_valid_hex_number |
StringExtensions.IsValidHexNumber |
is_valid_html_color |
StringExtensions.IsValidHtmlColor |
is_valid_identifier |
StringExtensions.IsValidIdentifier |
is_valid_int |
StringExtensions.IsValidInt (рассмотрите возможность использования int.TryParse или long.TryParse) |
is_valid_ip_address |
StringExtensions.IsValidIPAddress |
join |
|
json_escape |
StringExtensions.JSONEscape |
left |
StringExtensions.Left (рассмотрите возможность использования string.Substring или string.AsSpan) |
length |
|
lpad |
|
lstrip |
|
mаtch |
StringExtensions.Match (рассмотрите возможность использования RegEx) |
matchn |
StringExtensions.MatchN (рассмотрите возможность использования RegEx) |
md5_buffer |
StringExtensions.Md5Buffer (рассмотрите возможность использования System.Security.Cryptography.MD5.HashData) |
md5_text |
StringExtensions.Md5Text (рассмотрите возможность использования System.Security.Cryptography.MD5.HashData с StringExtensions.HexEncode) |
naturalnocasecmp_to |
N/A (Consider using string.Equals или string.Compare) |
nocasecmp_to |
StringExtensions.NocasecmpTo или StringExtensions.CompareTo (рассмотрите возможность использования string.Equals или string.Compare) |
num |
|
num_int64 |
|
num_scientific |
|
num_uint64 |
|
pad_decimals |
StringExtensions.PadDecimals |
pad_zeros |
StringExtensions.PadZeros |
path_join |
StringExtensions.PathJoin |
repeat |
Используйте string constructor или StringBuilder |
replace |
string.Replace или RegEx |
replacen |
StringExtensions.ReplaceN (рассмотрите возможность использования string.Replace или RegEx) |
reverse |
N/A |
rfind |
StringExtensions.RFind (рассмотрите возможность использования string.LastIndexOf или string.LastIndexOfAny) |
rfindn |
StringExtensions.RFindN (рассмотрите возможность использования string.LastIndexOf или string.LastIndexOfAny) |
right |
StringExtensions.Right (рассмотрите возможность использования string.Substring или string.AsSpan) |
rpad |
|
rsplit |
N/A |
rstrip |
|
sha1_buffer |
StringExtensions.Sha1Buffer (рассмотрите возможность использования System.Security.Cryptography.SHA1.HashData) |
sha1_text |
StringExtensions.Sha1Text (рассмотрите возможность использования System.Security.Cryptography.SHA1.HashData с StringExtensions.HexEncode) |
sha256_buffer |
StringExtensions.Sha256Buffer (рассмотрите возможность использования System.Security.Cryptography.SHA256.HashData) |
sha256_text |
StringExtensions.Sha256Text (рассмотрите возможность использования System.Security.Cryptography.SHA256.HashData с StringExtensions.HexEncode) |
similarity |
StringExtensions.Similarity |
simplify_path |
StringExtensions.SimplifyPath |
split |
StringExtensions.Split (рассмотрите возможность использования string.Split) |
split_floats |
StringExtensions.SplitFloat |
strip_edges |
StringExtensions.StripEdges (рассмотрите возможность использования string.Trim, string.TrimStart или string.TrimEnd) |
strip_escapes |
StringExtensions.StripEscapes |
substr |
StringExtensions.Substr (рассмотрите возможность использования string.Substring или string.AsSpan) |
to_ascii_buffer |
StringExtensions.ToAsciiBuffer (рассмотрите возможность использования System.Text.Encoding.ASCII.GetBytes) |
to_camel_case |
StringExtensions.ToCamelCase |
to_float |
StringExtensions.ToFloat (рассмотрите возможность использования float.TryParse или double.TryParse) |
to_int |
StringExtensions.ToInt (рассмотрите возможность использования int.TryParse или long.TryParse) |
to_lower |
|
to_pascal_case |
StringExtensions.ToPascalCase |
to_snake_case |
StringExtensions.ToSnakeCase |
to_upper |
|
to_utf16_buffer |
StringExtensions.ToUtf16Buffer (рассмотрите возможность использования System.Text.Encoding.UTF16.GetBytes) |
to_utf32_buffer |
StringExtensions.ToUtf32Buffer (рассмотрите возможность использования System.Text.Encoding.UTF32.GetBytes) |
to_utf8_buffer |
StringExtensions.ToUtf8Buffer (рассмотрите возможность использования System.Text.Encoding.UTF8.GetBytes) |
to_wchar_buffer |
StringExtensions.ToUtf16Buffer в Windows и StringExtensions.ToUtf32Buffer на других платформах |
trim_prefix |
StringExtensions.TrimPrefix |
trim_suffix |
StringExtensions.TrimSuffix |
unicode_at |
string[int] indexer |
uri_decode |
StringExtensions.URIDecode (рассмотрите возможность использования System.Uri.UnescapeDataString) |
uri_encode |
StringExtensions.URIEncode (рассмотрите возможность использования System.Uri.EscapeDataString) |
validate_node_name |
StringExtensions.ValidateNodeName |
xml_escape |
StringExtensions.XMLEscape |
xml_unescape |
StringExtensions.XMLUnescape |
Список методов PackedByteArray Godot, создающих строку, и их эквиваленты в C#:
GDScript |
C# |
|---|---|
get_string_from_ascii |
StringExtensions.GetStringFromAscii (рассмотрите возможность использования System.Text.Encoding.ASCII.GetString) |
get_string_from_utf16 |
StringExtensions.GetStringFromUtf16 (рассмотрите возможность использования System.Text.Encoding.UTF16.GetString) |
get_string_from_utf32 |
StringExtensions.GetStringFromUtf32 (рассмотрите возможность использования System.Text.Encoding.UTF32.GetString) |
get_string_from_utf8 |
StringExtensions.GetStringFromUtf8 (рассмотрите возможность использования System.Text.Encoding.UTF8.GetString) |
hex_encode |
StringExtensions.HexEncode (рассмотрите возможность использования System.Convert.ToHexString) |
Примечание
.NET предоставляет вспомогательные методы для работы с путями в классе System.IO.Path. Их можно использовать только с собственными путями ОС, но не с путями Godot (путями, начинающимися с res:// или user://). См. Пути файлов в проектах Godot.
NоdePath
Следующий метод был преобразован в свойство с другим именем:
GDScript |
C# |
|---|---|
|
|
Сигнал
Следующие методы были преобразованы в свойства с соответствующими именами:
GDScript |
C# |
|---|---|
|
|
|
|
Тип Signal реализует шаблон awaitable, что означает, что его можно использовать с ключевым словом await. См. Ключевое слово await.
Вместо типа Signal для использования сигналов Godot в C# рекомендуется использовать сгенерированные события C#. См. Сигналы C#.
Callable
Следующие методы были преобразованы в свойства с соответствующими именами:
GDScript |
C# |
|---|---|
|
|
|
|
В настоящее время C# поддерживает Callable, если выполняется одно из следующих условий:
Callableбыл создан с использованием типа C#Callable.Callable— это базовая версияCallableдвижка. ПользовательскиеCallableне поддерживаются.Callableсчитается пользовательским, если выполняется любое из следующих условий:Callableимеет связанную информацию (Callable, созданные с помощьюbind/unbind, не поддерживаются).Callableбыл создан из других языков с помощью API GDExtension.
Некоторые методы, такие как bind и unbind, не реализованы, вместо них используйте лямбда-выражения:
string name = "John Doe";
Callable callable = Callable.From(() => SayHello(name));
void SayHello(string name)
{
GD.Print($"Hello {name}");
}
Лямбда-выражение захватывает переменную name, чтобы ее можно было связать с методом SayHello.
RID
В C# этот тип назван Rid в соответствии с соглашением об именовании .NET.
Следующие методы были преобразованы в свойства с соответствующими именами:
GDScript |
C# |
|---|---|
|
|
|
|
Базис
Структуры не могут иметь конструкторов без параметров в C#. Следовательно, new Basis () инициализирует все примитивные члены их значением по умолчанию. Используйте Basis.Identity для эквивалента Basis () в GDScript и C++.
Следующий метод был преобразован в свойство с другим именем:
GDScript |
C# |
|---|---|
|
|
Transfоrm2D
Структуры не могут иметь конструкторов без параметров в C#. Следовательно, new Transform2D() инициализирует все примитивные члены их значением по умолчанию. Пожалуйста, используйте Transform2D.Identity для эквивалента Transform2D() в GDScript и C++.
Следующие методы были преобразованы в свойства с соответствующими именами:
GDScript |
C# |
|---|---|
|
|
|
|
|
|
Transform3D
Структуры не могут иметь конструкторы без параметров в C#. Поэтому new Transform3D() инициализирует все примитивные элементы значениями по умолчанию. Используйте Transform3D.Identity в качестве эквивалента Transform3D() в GDScript и C++.
Следующие методы были преобразованы в свойства с соответствующими именами:
GDScript |
C# |
|---|---|
|
|
|
|
Rеct2
Следующее поле было преобразовано в свойство с немного другим именем:
GDScript |
C# |
|---|---|
|
|
Следующий метод был преобразован в свойство с другим именем:
GDScript |
C# |
|---|---|
|
|
Rect2i
В C# этот тип назван Rect2I в соответствии с соглашением об именовании .NET.
Следующее поле было преобразовано в свойство с немного другим именем:
GDScript |
C# |
|---|---|
|
|
Следующий метод был преобразован в свойство с другим именем:
GDScript |
C# |
|---|---|
|
|
AABB
В C# этот тип назван Aabb в соответствии с соглашением об именовании .NET.
Следующий метод был преобразован в свойство с другим именем:
GDScript |
C# |
|---|---|
|
|
Quaternion (Кватернион)
Структуры не могут иметь конструкторы без параметров в C#. Поэтому new Quaternion() инициализирует все примитивные элементы значениями по умолчанию. Используйте Quaternion.Identity в качестве эквивалента Quaternion() в GDScript и C++.
Projection (Проекция)
Структуры не могут иметь конструкторы без параметров в C#. Поэтому new Projection() инициализирует все примитивные элементы значениями по умолчанию. Используйте Projection.Identity в качестве эквивалента Projection() в GDScript и C++.
Цвет
Структуры не могут иметь конструкторы без параметров в C#. Поэтому new Color() инициализирует все примитивные элементы значениями по умолчанию (которые представляют прозрачный чёрный цвет). Используйте Colors.Black в качестве эквивалента Color() в GDScript и C++.
Глобальный метод Color8 для построения цвета из байтов доступен как статический метод в типе Color.
Константы цвета доступны в статическом классе Colors как свойства только для чтения.
Следующий метод был преобразован в свойство с другим именем:
GDScript |
C# |
|---|---|
|
|
Следующий метод был преобразован в метод с другим именем:
GDScript |
C# |
|---|---|
|
|
В качестве конструкторов доступны следующие методы:
GDScript |
C# |
|---|---|
|
|
|
|
Массив
Эквивалентом упакованных массивов является System.Array.
См. также PackedArray in C#.
Используйте Godot.Collections.Array для нетипизированного массива Variant. Godot.Collections.Array<T> — это типобезопасная обёртка вокруг Godot.Collections.Array.
См. также Array in C#.
Словарь
Используйте Godot.Collections.Dictionary для нетипизированного словаря Variant. Godot.Collections.Dictionary<TKey, TValue> — это типобезопасная обёртка вокруг Godot.Collections.Dictionary.
См. также Dictionary in C#.
Вариант
Godot.Variant используется для представления собственного типа Godot Variant. Любой Variant-compatible type может быть преобразован из/в него.
См. также: C# Variant.
Общение с другими языками сценариев
Это подробно объясняется в Меж-языковые сценарии (скрипты).
Ключевое слово await
Нечто похожее на ключевое слово await из GDScript можно получить с помощью ключевого слова await из C#.
Ключевое слово await в C# можно использовать с любым ожидаемым выражением. Обычно оно применяется с операндами типов Task, Task<TResult>, ValueTask или ValueTask<TResult>.
Выражение t является ожидаемым, если выполняется одно из следующих условий:
tимеет тип времени компиляцииdynamic.tимеет доступный экземпляр или метод расширения, называемыйGetAwaiter, без параметров и параметров типа, а также возвращаемый типA, для которого выполняются все следующие условия:Aреализует интерфейсSystem.Runtime.CompilerServices.INotifyCompletion.Aимеет доступное для чтения свойство экземпляраIsCompletedтипаbool.Aимеет доступный метод экземпляраGetResultбез параметров и параметров типа.
Эквивалент ожидания сигнала в GDScript можно получить с помощью ключевого слова await и GodotObject.ToSignal.
Пример:
public async Task SomeFunction()
{
await ToSignal(timer, Timer.SignalName.Timeout);
GD.Print("After timeout");
}