C# API differences to GDScript

これは、C#とGDScriptのAPIの相違点の(不完全な)リストです。

一般的な相違点

C# の基本 で説明したように、C#では一般に、GDScriptおよびC++で使用される snake_case の代わりに PascalCase が使用されます。

グローバル スコープ

C#では名前空間で宣言できないため、グローバル関数と一部の定数をクラスに移動する必要がありました。ほとんどのグローバル定数は、独自の列挙型に移動されました。

定数

グローバル定数は独自の列挙型に移動されました。たとえば、ERR_ * 定数は Error 列挙型に移動されました。

特殊なケース:

GDScript

C#

SPKEY

GD.SpKey

TYPE_*

Variant.Type 列挙型

OP_*

Variant.Operator 列挙型

数学関数

absacosasinatanatan2 などの数学グローバル関数は、Mathf の下に AbsAcosAsinAtan および Atan2``として、\ ``PI 定数は Mathf.Pi として見つけることができます。

乱数生成関数

rand_rangerand_seed などの乱数生成用のグローバル関数は、GD の下にあります。例:GD.RandRange および GD.RandSeed

その他の関数

printvar2str のような他の多くのグローバル関数は GD の下にあります。例:GD.Print および GD.Var2Str

例外:

GDScript

C#

weakref(obj)

Object.WeakRef(obj)

is_instance_valid(obj)

Object.IsInstanceValid(obj)

ヒント

using static ディレクティブを使用すると便利な場合があります。このディレクティブにより、クラス名を指定せずに、クラスのメンバーおよびネストされたタイプにアクセスできます。

例:

using static Godot.GD;

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

エクスポート・キーワード

GDScriptの export キーワードの代わりに [Export] 属性を使用します。この属性は、オプションの PropertyHint および hintString パラメーターで提供することもできます。デフォルト値は、値を割り当てることで設定できます。

例:

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

シグナル・キーワード

GDScriptの signal キーワードの代わりに [Signal] 属性を使用してシグナルを宣言します。この属性は、関数宣言とdelegate を組み合わせてシグナルを定義する必要があります。

[Signal]
delegate void MySignal(string willSendsAString);

c_sharp_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");
}

シングルトン

シングルトンは、シングルトンパターンを使用するのではなく、静的クラスとして使用できます。これは、コードを Instance プロパティを使用する場合よりも冗長にするためです。

例:

Input.IsActionPressed("ui_down")

ただし、非常にまれなケースでは、これは十分ではありません。たとえば、 Connect のような基本クラスから Godot.Object メンバーにアクセスしたい場合があります。そのようなユースケースのために、シングルトンインスタンスを返す Singleton という名前の静的プロパティを提供します。このインスタンスのタイプは Godot.Object です。

例:

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

文字列

System.String (string)を使用します。Godot の String メソッドのほとんどは、拡張メソッドとして StringExtensions クラスによって提供されます。

例:

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

ただし、いくつかの違いがあります:

  • erase: 文字列は C#では変更できないため、拡張メソッドに渡される文字列を変更することはできません。このため、文字列ではなく StringBuilder の拡張メソッドとして Erase が追加されました。または、string.Remove を使用することもできます。

  • IsSubsequenceOf/IsSubsequenceOfi: IsSubsequenceOf のオーバーロードである追加のメソッドが用意されており、大文字と小文字の区別を明示的に指定できます:

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: MatchMatchn に加えて、大文字と小文字の区別を明示的に指定できる追加のメソッドが提供されます:

str.Match("*.txt"); // Case sensitive
str.ExprMatch("*.txt", true); // Case sensitive
str.Matchn("*.txt"); // Case insensitive
str.ExprMatch("*.txt", false); // Case insensitive

Basis(基底)

C#では、構造体にパラメーターなしのコンストラクターを含めることはできません。したがって、new Basis() はすべてのプリミティブメンバーを規定値に初期化します。 GDScriptおよびC++の Basis() に相当するものが必要な場合は ``Basis.Identity``を使用します。

次のメソッドは、異なる名前のプロパティに変換されました:

GDScript

C#

get_scale()

Scale

Transform2D

C#では、構造体にパラメーターなしのコンストラクターを含めることはできません。したがって、new Transform2D() は、すべてのプリミティブメンバーを規定値に初期化します。 GDScriptおよびC++の Transform2D() に相当するものが必要な場合は Transform2D.Identity を使用してください。

次のメソッドは、それぞれの名前が変更されたプロパティに変換されました:

GDScript

C#

get_rotation()

Rotation

get_scale()

Scale

Plane

次のメソッドは、わずかに異なる名前のプロパティに変換されました:

GDScript

C#

center()

Center

Rect2

次のフィールドは、わずかに異なる名前のプロパティに変換されました。

GDScript

C#

end

End

次のメソッドは、異なる名前のプロパティに変換されました:

GDScript

C#

get_area()

Area

Quat

C#では、構造体にパラメーターなしのコンストラクターを含めることはできません。したがって、new Quat() はすべてのプリミティブメンバーを規定値に初期化します。 GDScriptおよびC++の Quat() に相当するものが必要な場合は Quat.Identity を使用してください。

次のメソッドは、異なる名前のプロパティに変換されました。

GDScript

C#

length()

Length

length_squared()

LengthSquared

配列

これは一時的なものです。それぞれの PoolArray は、本来の方法で使用するために独自の型を必要とします。

GDScript

C#

Array

Godot.Collections.Array

PoolIntArray

int[]

PoolByteArray

byte[]

PoolFloatArray

float[]

PoolStringArray

String[]

PoolColorArray

Color[]

PoolVector2Array

Vector2[]

PoolVector3Array

Vector3[]

Godot.Collections.Array<T>Godot.Collections.Array のタイプセーフなラッパーです。 Godot.Collections.Array<T>(Godot.Collections.Array) コンストラクターを使用して作成します。

辞書(ディクショナリ)

Godot.Collections.Dictionary を使用します。

Godot.Collections.Dictionary<T>Godot.Collections.Dictionary のタイプセーフラッパーです。 Godot.Collections.Dictionary<T>(Godot.Collections.Dictionary) コンストラクターを使用して作成します。

バリアント

Variant の代わりに System.Object (object)が使用されます。

他のスクリプト言語との通信

これは クロスランゲージでのスクリプト作成 で詳細に説明されています。

Yield

C#の yieldキーワード<https://docs.microsoft.com/en-US/dotnet/csharp/language-reference/keywords/yield> を使用すると、単一のパラメーターを持つGDScriptの yield に似たものを実現できます。

async/awaitおよび Godot.Object.ToSignal を使用すると、シグナルのyieldと同等の結果を得ることができます。

例:

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

他の相違点

GDScriptで動作する preload は、C#では使用できません。代わりに GD.Load または ResourceLoader.Load を使用してください。

他の相違点:

GDScript

C#

Color8

Color.Color8

is_inf

float.IsInfinity

is_nan

float.IsNaN

dict2inst

TODO

inst2dict

TODO