Diferenças da API para o GDScript

Esta é uma lista (incompleta) de diferenças entre as APIs do C# e do GDScript.

General differences

As explained in the Introdução, C# generally uses PascalCase instead of the snake_case used in GDScript and C++.

Global scope

Funções globais e algumas constantes tiveram que ser movidas para classes, já que o C# não permite declará-las em namespaces. A maioria das constantes globais foram movidas para seus próprios enums.

Constantes

As constantes globais foram movidas para seus próprios enums. Por exemplo, constantes ERR_* foram movidas para o enum Error.

Special cases:

GDScript C#
SPKEY GD.SpKey
TYPE_* Variant.Type enum
OP_* Variant.Operator enum

Math functions

Math global functions, like abs, acos, asin, atan and atan2, are located under Mathf as Abs, Acos, Asin, Atan and Atan2. The PI constant can be found as Mathf.Pi.

Random functions

Random global functions, like rand_range and rand_seed, are located under GD. Example: GD.RandRange and GD.RandSeed.

Other functions

Many other global functions like print and var2str are located under GD. Example: GD.Print and GD.Var2Str.

Exceptions:

GDScript C#
weakref(obj) Object.WeakRef(obj)
is_instance_valid(obj) Object.IsInstanceValid(obj)

Dicas

Às vezes pode ser útil usar a diretiva using static. Esta diretiva permite acessar os membros e tipos aninhados de uma classe sem especificar o nome da classe.

Exemplo:

using static Godot.GD;

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

A palavra-chave Export

Use o atributo [Export] em vez da palavra-chave export do GDScript.

Exemplo:

using Godot;

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

A palavra-chave Signal

Use the [Signal] attribute to declare a signal instead of the GDScript signal keyword. This attribute should be used on a delegate, whose name signature will be used to define the signal.

[Signal]
delegate void MySignal(string willSendsAString);

Veja também: :ref: c_sharp_signals

Singletons

Singletons are available as static classes rather than using the singleton pattern. This is to make code less verbose than it would be with an Instance property.

Exemplo:

Input.IsActionPressed("ui_down")

No entanto, em alguns casos muito raros, isso não é suficiente. Por exemplo, você pode querer acessar um membro da classe base Godot.Object, como Connect. Para tais casos de uso, fornecemos uma propriedade estática chamada Singleton que retorna a instância singleton. O tipo desta instância é Godot.Object.

Exemplo:

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

String

Use System.String (string). Most of Godot’s String methods are provided by the StringExtensions class as extension methods.

Exemplo:

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

There are a few differences, though:

  • erase: Strings are immutable in C#, so we cannot modify the string passed to the extension method. For this reason, Erase was added as an extension method of StringBuilder instead of string. Alternatively, you can use string.Remove.
  • IsSubsequenceOf/IsSubsequenceOfi: An additional method is provided, which is an overload of IsSubsequenceOf, allowing you to explicitly specify case sensitivity:
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: An additional method is provided besides Match and Matchn, which allows you to explicitly specify case sensitivity:
str.Match("*.txt"); // Case sensitive
str.ExprMatch("*.txt", true); // Case sensitive
str.Matchn("*.txt"); // Case insensitive
str.ExprMatch("*.txt", false); // Case insensitive

Basis

Structs cannot have parameterless constructors in C#. Therefore, new Basis() initializes all primitive members to their default value. Use Basis.Identity for the equivalent of Basis() in GDScript and C++.

The following method was converted to a property with a different name:

GDScript C#
get_scale() Scale

Transform2D

Structs cannot have parameterless constructors in C#. Therefore, new Transform2D() initializes all primitive members to their default value. Please use Transform2D.Identity for the equivalent of Transform2D() in GDScript and C++.

Os seguintes métodos foram convertidos em propriedades com seus respectivos nomes alterados:

GDScript C#
get_rotation() Rotation
get_scale() Scale

Plane

The following method was converted to a property with a slightly different name:

GDScript C#
center() Center

Rect2

The following field was converted to a property with a slightly different name:

GDScript C#
end End

The following method was converted to a property with a different name:

GDScript C#
get_area() Area

Quat

Structs cannot have parameterless constructors in C#. Therefore, new Quat() initializes all primitive members to their default value. Please use Quat.Identity for the equivalent of Quat() in GDScript and C++.

The following methods were converted to a property with a different name:

GDScript C#
length() Length
length_squared() LengthSquared

Vetor

This is temporary. PoolArrays will need their own types to be used the way they are meant to.

GDScript C#
Array Godot.Collections.Array
PoolIntArray int[]
PoolByteArray byte[]
PoolFloatArray float[]
PoolStringArray String[]
PoolColorArray Color[]
PoolVector2Array Vector2[]
PoolVector3Array Vector3[]

Godot.Collections.Array<T> is a type-safe wrapper around Godot.Collections.Array. Use the Godot.Collections.Array<T>(Godot.Collections.Array) constructor to create one.

Dicionário

Use Godot.Collections.Dictionary.

Godot.Collections.Dictionary<T> is a type-safe wrapper around Godot.Collections.Dictionary. Use the Godot.Collections.Dictionary<T>(Godot.Collections.Dictionary) constructor to create one.

Variant

System.Object (object) is used instead of Variant.

Comunicando com outras linguagens de script

The methods object Object.Call(string method, params object[] args), object Object.Get(string field) and object Object.Set(string field, object value) are provided to communicate with instances of other scripting languages via the Variant API.

Conceder

Something similar to GDScript’s yield with a single parameter can be achieved with C#’s yield keyword.

The equivalent of yield on signal can be achieved with async/await and Godot.Object.ToSignal.

Exemplo:

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

Outras diferenças

preload, as it works in GDScript, is not available in C#. Use GD.Load or ResourceLoader.Load instead.

Outras diferenças:

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