Diferencias con la API de GDScript

Esta es una lista (incompleta) de diferencias de la API de C# y GDScript.

Diferencias generales

Como se explica en el apartado :ref:doc_c_sharp, C# utiliza generalmente PascalCase en lugar del snake_case utilizado en GDScript y C++.

Ámbito Global

Las funciones globales y algunas constantes tuvieron que ser movidas a clases, ya que C# no permite declararlas dentro de «espacios con nombre». La mayoría de las constantes globales fueron movidas a sus propias enumeraciones.

Constantes

Las constantes globales fueron movidas a sus propias enumeraciones. Por ejemplo, la constante ERR_* fué movida a la enumeración Error.

Casos especiales:

GDScript C#
SPKEY GD.SpKey
TYPE_* Variant.Type (enumeración)
OP_* Variant.Operator (enumeración)

Funciones Matemáticas

Las funciones matemáticas como abs, acos, asin, atan y atan2 se encuentran como miembros de``Mathf`` así: Abs, Acos, Asin, Atan y Atan2. La constante PI se encuentra como Mathf.Pi.

Funciones Random

Las funciones globales random como rand_range y `rand_seed se encuentran bajo GD, Ejemplo: GD.RandRange y `GD.Rand_Seed.

Otras funciones

Muchas otras funciones globales como print``y ``var2str se encuentran también bajo GD. Ejemplo: GD.Print y GD.Var2Str.

Excepciones:

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

Trucos

Algunas veces puede ser útil usar la directiva using static. Ésta directiva permite acceder a los miembros y tipos anidados de una clase sin especificar el nombre de la clase.

Ejemplo:

using static Godot.GD;

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

Palabra clave export

Use the [Export] attribute instead of the GDScript export keyword. This attribute can also be provided with optional PropertyHint and hintString parameters. Default values can be set by assigning a value.

Ejemplo:

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;
}

Palabra clave signal

Use el atributo [Signal] en declaraciones, en lugar de la palabre clave GDScript signal. Este atributo debe ser usado en un delegate, cuya definición de nombre será usado para identificar la señal.

[Signal]
delegate void MySignal(string willSendsAString);

Ver también: Señales en C#

Instancias únicas

Las instancias únicas están disponibles como clases estáticas en lugar de usar el patrón de instancia única. Esto es para hacer el código más legible de lo que sería con una propiedad Instance.

Ejemplo:

Input.IsActionPressed("ui_down")

Sin embargo, en algunos raros casos esto no es suficiente. Por ejemplo, puedes querer acceder a un miembro de la clase base Godot.Object, como Connect. Para esos casos proveemos una propiedad estática llamada Singleton``que regresa la instancia única. El tipo de esta instancia es ``Godot.Object.

Ejemplo:

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

Cadena

Utilice System.String (string). La mayoría de métodos para cadena de Godot son proporcionados por la clase StringExtensions como métodos de extensión.

Ejemplo:

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

Sin embargo, hay algunas diferencias:

  • erase: Las cadenas son inalterables en C#, por lo que no podemos modificar la cadena pasada al método de extensión. Por esta razón se añadió Erase como método de extensión de StringBuilder en lugar de string. También puedes usar string.Remove.
  • IsSubsequenceOf/IsSubsequenceOfi: Se proporciona un método adicional que es una sobrecarga de IsSubsequenceOf que permite especificar explícitamente la sensibilidad a mayúsculas y minúsculas:
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: Se proporciona un método adicional además de Match` y ``Matchn, que permite especificar explícitamente la sensibilidad a mayúsculas y minúsculas:
str.Match("*.txt"); // Case sensitive
str.ExprMatch("*.txt", true); // Case sensitive
str.Matchn("*.txt"); // Case insensitive
str.ExprMatch("*.txt", false); // Case insensitive

Basis

Las estructuras no pueden tener constructores sin parámetros en C#, por lo tanto new Basis() inicializa todos los miembros originales a su valor por defecto. Usa Basis.Identity para el equivalente a Basis() en GDScript y C++.

Los siguientes métodos fueron convertidos a propiedades con sus respectivos nombres cambiados:

GDScript C#
get_scale() (propiedad) Scale (propiedad)

Transform2D

Las estructuras no pueden tener constructores sin parámetros en C#, por lo tanto new Transform2D() inicializa todos los miembros originales a su valor por defecto. Por favor, utilice Transform2D.Identity para el equivalente a Transform2D() en GDScript y C++.

Los siguientes métodos fueron convertidos a propiedades con sus respectivos nombres cambiados:

GDScript C#
get_rotation() Rotation
get_scale() (propiedad) Scale (propiedad)

Plano

Los siguientes métodos fueron convertidos a propiedades con sus respectivos nombres ligeramente cambiados:

GDScript C#
center() Center

Rect2

Los siguientes campos se convirtieron en propiedades con sus respectivos nombres cambiados:

GDScript C#
end End

Los siguientes métodos fueron convertidos a propiedades con sus respectivos nombres cambiados:

GDScript C#
get_area() Area

Quat

Las estructuras no pueden tener constructores sin parámetros en C#, por lo tanto new Quat() inicializa todos los miembros primitivos a su valor por defecto. Por favor, usa Quat.Identity para el equivalente a Quat() en GDScript y C++.

Los siguientes métodos fueron convertidos a propiedades con un nombre diferente:

GDScript C#
length() Length
length_squared() LengthSquared

Arreglo

Esto es temporal. Los PoolArrays necesitarán sus propios tipos para ser usados de la manera en que están destinados.

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.

Diccionario

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) es usado en lugar de Variant.

Comunicándose con otros lenguajes de scripting

Los métodos object Object.call(string method, params object[] args), object Object.get(string field) y object Object.set(string field, object value) se proporcionan para comunicarse con instancias de otros lenguajes de scripting a través de Variant API.

Yield

Algo similar a yield de GDScript con un único parámetro puede ser conseguido con la palabra clave «yield» de C # <https://docs.microsoft.com/en-US/dotnet/csharp/language-reference/keywords/yield>`.

El equivalente de «yield» sobre una señal puede conseguirse con «async/await» y Godot.Object.ToSignal.

Ejemplo:

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

Otras diferencias

preload, sí como trabaja en GDScript, no está disponible en C#. Usa GD.Load o ResourceLoader.Load en su lugar.

Otras diferencias:

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