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#

TYPE_*

Variant.Type перечисление

OP_*

Variant.Operator перечисление

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

Глобальные математические функции, такие как 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#

weakref(obj)

GodotObject.WeakRef(obj)

instance_from_id(id)

GodotObject.InstanceFromId(id)

is_instance_id_valid(id)

GodotObject.IsInstanceIdValid(id)

is_instance_valid(obj)

GodotObject.IsInstanceValid(obj)

Советы

Иногда может быть полезно использовать директиву 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

print

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

System.Diagnostics.Debug.Assert

char

Используйте явное преобразование: (char)65

convert

GD.Convert

dict_to_inst

N/A

get_stack

System.Environment.StackTrace

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#

EditorInterface

EditorInterface.Singleton

Строка

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

string.StartsWith

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

string.Contains

count

StringExtensions.Count (рассмотрите возможность использования RegEx)

countn

StringExtensions.CountN (рассмотрите возможность использования RegEx)

dedent

StringExtensions.Dedent

ends_with

string.EndsWith

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

string.IsNullOrEmpty или string.IsNullOrWhiteSpace

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

string.Join

json_escape

StringExtensions.JSONEscape

left

StringExtensions.Left (рассмотрите возможность использования string.Substring или string.AsSpan)

length

string.Length

lpad

string.PadLeft

lstrip

string.TrimStart

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

float.ToString или double.ToString

num_int64

int.ToString или long.ToString

num_scientific

float.ToString или double.ToString

num_uint64

uint.ToString или ulong.ToString

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

string.PadRight

rsplit

N/A

rstrip

string.TrimEnd

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

string.ToLower

to_pascal_case

StringExtensions.ToPascalCase

to_snake_case

StringExtensions.ToSnakeCase

to_upper

string.ToUpper

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#

is_empty()

IsEmpty

Сигнал

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

GDScript

C#

get_name()

Name

get_object()

Owner

Тип Signal реализует шаблон awaitable, что означает, что его можно использовать с ключевым словом await. См. Ключевое слово await.

Вместо типа Signal для использования сигналов Godot в C# рекомендуется использовать сгенерированные события C#. См. Сигналы C#.

Callable

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

GDScript

C#

get_object()

Target

get_method()

Method

В настоящее время 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#

get_id()

Id

is_valid()

IsValid

Базис

Структуры не могут иметь конструкторов без параметров в 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

get_skew()

Skew

Transform3D

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

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

GDScript

C#

get_rotation()

Вращение

get_scale()

Scale

Rеct2

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

GDScript

C#

end

End

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

GDScript

C#

get_area()

Area

Rect2i

В C# этот тип назван Rect2I в соответствии с соглашением об именовании .NET.

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

GDScript

C#

end

End

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

GDScript

C#

get_area()

Area

AABB

В C# этот тип назван Aabb в соответствии с соглашением об именовании .NET.

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

GDScript

C#

get_volume()

Volume

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#

get_luminance()

Luminance

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

GDScript

C#

html(String)

FromHtml(ReadOnlySpan<char>)

В качестве конструкторов доступны следующие методы:

GDScript

C#

hex(int)

Color(uint)

hex64(int)

Color(ulong)

Массив

Эквивалентом упакованных массивов является 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");
}