Diferencias de la API de C# con 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

Utilice el atributo [Export] en lugar de la palabra clave export de GDScript. Este atributo también puede ser proporcionado con los parámetros opcionales PropertyHint y hintString. Los valores por defecto se pueden establecer asignando un valor.

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#.

Palabra clave onready

GDScript tiene la capacidad de diferir la inicialización de una variable miembro hasta que se llame a la función ready con onready (cf.: ref:` doc_gdscript_onready_keyword`). Por ejemplo:

onready var my_label = get_node("MyLabel")

Sin embargo, C # no tiene esta capacidad. Para lograr el mismo efecto, debe hacer esto.

private Label _myLabel;

public override void _Ready()
{
    _myLabel = GetNode<Label>("MyLabel");
}

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 primitivos a su valor por defecto. Por favor, usa Transform2D.Identity para el equivalente de 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

Array

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> es una envoltura de tipo-seguro para Godot.Collections.Array. Usa el constructor Godot.Collections.Array<T>(Godot.Collections.Array) para crear uno.

Diccionario

Usa Godot.Collections.Dictionary.

Godot.Collections.Dictionary<T> es una envoltura de tipo-seguro para Godot.Collections.Dictionary. Utiliza el constructor Godot.Collections.Dictionary<T>(Godot.Collections.Dictionary) para crear uno.

Variant

System.Object (object) es usado en lugar de Variant.

Comunicándose con otros lenguajes de scripting

Esto se explica ampliamente en Scripting de varios lenguajes.

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