API differences to GDScript

    As explained in the , C# generally uses instead of the snake_case used in GDScript and C++.

    Global scope

    Global functions and some constants had to be moved to classes, since C# does not allow declaring them in namespaces. Most global constants were moved to their own enums.

    Global constants were moved to their own enums. For example, ERR_* constants were moved to the Error enum.

    Special cases:

    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 global functions, like rand_range and rand_seed, are located under GD. Example: GD.RandRange and GD.RandSeed.

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

    Exceptions:

    GDScriptC#
    weakref(obj)Object.WeakRef(obj)
    is_instance_valid(obj)Object.IsInstanceValid(obj)

    Sometimes it can be useful to use the using static directive. This directive allows to access the members and nested types of a class without specifying the class name.

    Example:

    Export keyword

    Use the [Export] attribute instead of the GDScript export keyword.

    Example:

    1. using Godot;
    2. public class MyNode : Node
    3. {
    4. [Export]
    5. }

    Signal keyword

    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.

    1. delegate void MySignal(string willSendsAString);

    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.

    Example:

    However, in some very rare cases this is not enough. For example, you may want to access a member from the base class Godot.Object, like Connect. For such use cases we provide a static property named Singleton that returns the singleton instance. The type of this instance is Godot.Object.

    Example:

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

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

    Example:

    1. string upper = "I LIKE SALAD FORKS";
    2. 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:
    • Match/Matchn/ExprMatch: An additional method is provided besides Match and Matchn, which allows you to explicitly specify case sensitivity:
    1. str.Match("*.txt"); // Case sensitive
    2. str.ExprMatch("*.txt", true); // Case sensitive
    3. str.Matchn("*.txt"); // Case insensitive
    4. 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:

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

    The following methods were converted to properties with their respective names changed:

    Plane

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

    GDScriptC#
    center()Center

    Rect2

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

    GDScriptC#
    endEnd

    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 in GDScript and C++.

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

    GDScriptC#
    length()Length
    length_squared()LengthSquared

    Array

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

    GDScriptC#
    ArrayGodot.Collections.Array
    PoolIntArrayint[]
    PoolByteArraybyte[]
    PoolFloatArrayfloat[]
    PoolStringArrayString[]
    PoolColorArrayColor[]
    PoolVector2ArrayVector2[]
    PoolVector3ArrayVector3[]

    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.

    Dictionary

    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.

    Communicating with other scripting languages

    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.

    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.

    Example:

    1. GD.Print("After timeout");

    Other differences

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

    Other differences: