C# 言語機能

このページでは、C#とGodotの両方で一般的に使用される機能の概要と、それらの併用方法について説明します。

型変換とキャスト

C#は静的に型指定された言語です。したがって、次の操作は実行できません:

var mySprite = GetNode("MySprite");
mySprite.SetFrame(0);

メソッド GetNode()Node インスタンスを返します。この場合は、明示的に目的の派生型 Sprite2D に変換する必要があります。

このために、C#にはさまざまなオプションがあります。

キャストと型チェック

返された Node を Sprite2D にキャストできない場合は、 InvalidCastException をスローします。失敗しないと確信している場合は、 as 演算子の代わりにキャストを使用します。

Sprite2D mySprite = (Sprite2D)GetNode("MySprite");
mySprite.SetFrame(0);

AS演算子の使用

Node を Sprite2D にキャストできない場合、 as 演算子は null を返します。そのため、値型では使用できません。

Sprite2D mySprite = GetNode("MySprite") as Sprite2D;
// Only call SetFrame() if mySprite is not null
mySprite?.SetFrame(0);

ジェネリックメソッドの使用

この型変換を透過的にするためのジェネリックメソッドも提供されています。

GetNode<T>() は、ノードを返す前にノードをキャストします。ノードを目的の型にキャストできない場合は、InvalidCastException がスローされます。

Sprite2D mySprite = GetNode<Sprite2D>("MySprite");
mySprite.SetFrame(0);

GetNodeOrNull<T>()as 演算子を使用し、ノードを目的の型にキャストできない場合は null を返します。

Sprite2D mySprite = GetNodeOrNull<Sprite2D>("MySprite");
// Only call SetFrame() if mySprite is not null
mySprite?.SetFrame(0);

IS演算子を使用した型チェック

Node を Sprite2D にキャストできるかどうかを確認するには、 is 演算子を使用できます。 is 演算子は Node を Sprite2D にキャストできない場合は false を返し、それ以外の場合は true を返します。 is 演算子を null に対して使用した場合、結果は常に false になることに注意してください。

if (GetNode("MySprite") is Sprite2D)
{
    // Yup, it's a Sprite2D!
}

if (null is Sprite2D)
{
    // This block can never happen.
}

また、 is 演算子が true を返す場合、キャストの結果を条件付きで保存する新しい変数を宣言することもできます。

if (GetNode("MySprite") is Sprite2D mySprite)
{
    // The mySprite variable only exists inside this block, and it's never null.
    mySprite.SetFrame(0);
}

より高度な型チェックについては、 `パターンマッチング<https://docs.microsoft.com/ja-jp/dotnet/csharp/pattern-matching>`__ で調べることができます。

プリプロセッサ定義

Godotには、コンパイルする環境に応じてC#コードを変更できる一連の定義があります。

たとえば、プラットフォームに基づいてコードを変更できます:

    public override void _Ready()
    {
#if (GODOT_MOBILE || GODOT_WEB)
        // Use simple objects when running on less powerful systems.
        SpawnSimpleObjects();
#else
        SpawnComplexObjects();
#endif
    }

または、コードがどのエンジンにあるかを検出できます。これは、クロスエンジンライブラリを作成するのに役立ちます:

    public void MyPlatformPrinter()
    {
#if GODOT
        GD.Print("This is Godot.");
#elif UNITY_5_3_OR_NEWER
        print("This is Unity.");
#else
        throw new NotSupportedException("Only Godot and Unity are supported.");
#endif
    }

または、複数の Godot バージョンを対象とするスクリプトを作成し、それらのバージョンの一部でのみ利用可能な機能を利用することもできます。

    public void UseCoolFeature()
    {
#if GODOT4_3_OR_GREATER || GODOT4_2_2_OR_GREATER
        // Use CoolFeature, that was added to Godot in 4.3 and cherry-picked into 4.2.2, here.
#else
        // Use a workaround for the absence of CoolFeature here.
#endif
    }

定義の完全なリスト

  • Godotプロジェクトでは、GODOT が常に定義されています。

  • TOOLS は、デバッグ構成 (Editor および EditorPlayer) でビルドするときに定義されます。

  • GODOT_REAL_T_IS_DOUBLE は、 GodotFloat64 プロパティが true に設定されている場合に定義されます。

  • One of GODOT_LINUXBSD, GODOT_WINDOWS, GODOT_OSX, GODOT_ANDROID, GODOT_IOS, GODOT_WEB depending on the OS. These names may change in the future. These are created from the get_name() method of the OS singleton, but not every possible OS the method returns is an OS that Godot with .NET runs on.

  • GODOTXGODOTX_YGODOTX_Y_ZGODOTx_OR_GREATERGODOTX_y_OR_GREATER 、および GODOTX_Y_z_OR_GREATER 。ここでの XYZ は、Godot の現在のメジャー、マイナー、およびパッチ バージョンに置き換えられます。 xyz は、0 からそのコンポーネントの現在のバージョン番号までのすべての値に置き換えられます。

    注釈

    これらの定義は、Godot 4.0.4 および 4.1 で初めて追加されました。現在の Godot バージョンに関係なく、以前のバージョンのバージョン定義は存在しません。

    たとえば Godot 4.0.5 では、 GODOT4GODOT4_OR_GREATERGODOT4_0GODOT4_0_OR_GREATERGODOT4_0_5GODOT4_0_4_OR_GREATERGODOT4_0_5_OR_GREATER が定義されます。 Godot 4.3.2 では GODOT4GODOT4_OR_GREATERGODOT4_3GODOT4_0_OR_GREATERGODOT4_1_OR_GREATERGODOT4_2_OR_GREATERGODOT4_3_OR_GREATERGODOT4_3_2GODOT4_3_0_OR_GREATERGODOT4_3_1_OR_GREATERGODOT4_3_2_OR_GREATER が定義されます。

エクスポート する場合、エクスポート機能に応じて以下も定義できます:

  • プラットフォームの種類に応じて、GODOT_PCGODOT_MOBILE、または GODOT_WEB のいずれか。

  • プラットフォームに応じて、 GODOT_WINDOWSGODOT_LINUXBSDGODOT_MACOSGODOT_ANDROIDGODOT_IOSGODOT_WEB のいずれかになります。

サンプルプロジェクトを見るには、OS テスト デモをご覧ください: https://github.com/godotengine/godot-demo-projects/tree/master/misc/os_test