C# API differences to GDScript¶
This is a (incomplete) list of API differences between C# and GDScript.
General differences¶
As explained in the C# basics, C# generally uses PascalCase
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.
Constants¶
Global constants were moved to their own enums.
For example, ERR_*
constants were moved to the Error
enum.
Special cases:
GDScript |
C# |
---|---|
|
|
|
|
|
|
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# |
---|---|
|
|
|
|
Tips¶
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:
using static Godot.GD;
public class Test
{
static Test()
{
Print("Hello"); // Instead of GD.Print("Hello");
}
}
Export keyword¶
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.
Example:
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;
}
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.
[Signal]
delegate void MySignal(string willSendsAString);
See also: C# signals.
onready keyword¶
GDScript has the ability to defer the initialization of a member variable until the ready function is called with onready (cf. onready keyword). For example:
onready var my_label = get_node("MyLabel")
However C# does not have this ability. To achieve the same effect you need to do this.
private Label _myLabel;
public override void _Ready()
{
_myLabel = GetNode<Label>("MyLabel");
}
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:
Input.IsActionPressed("ui_down")
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:
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.
Example:
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 ofStringBuilder
instead of string. Alternatively, you can usestring.Remove
.IsSubsequenceOf
/IsSubsequenceOfi
: An additional method is provided, which is an overload ofIsSubsequenceOf
, 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 besidesMatch
andMatchn
, 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# |
---|---|
|
|
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:
GDScript |
C# |
---|---|
|
|
|
|
Plane¶
The following method was converted to a property with a slightly different name:
GDScript |
C# |
---|---|
|
|
Rect2¶
The following field was converted to a property with a slightly different name:
GDScript |
C# |
---|---|
|
|
The following method was converted to a property with a different name:
GDScript |
C# |
---|---|
|
|
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# |
---|---|
|
|
|
|
Array¶
This is temporary. PoolArrays will need their own types to be used the way they are meant to.
GDScript |
C# |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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¶
This is explained extensively in Cross-language scripting.
Yield¶
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:
await ToSignal(timer, "timeout");
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:
GDScript |
C# |
---|---|
|
|
|
|
|
|
|
TODO |
|
TODO |