Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

C# language features

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

型変換とキャスト

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

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

The method GetNode() returns a Node instance. You must explicitly convert it to the desired derived type, Sprite2D in this case.

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

キャストと型チェック

Throws InvalidCastException if the returned node cannot be cast to Sprite2D. You would use it instead of the as operator if you are pretty sure it won't fail.

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

AS演算子の使用

The as operator returns null if the node cannot be cast to Sprite2D, and for that reason, it cannot be used with value types.

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演算子を使用した型チェック

To check if the node can be cast to Sprite2D, you can use the is operator. The is operator returns false if the node cannot be cast to Sprite2D, otherwise it returns true. Note that when the is operator is used against null the result is always going to be false.

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

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

You can also declare a new variable to conditionally store the result of the cast if the is operator returns 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#コードを変更できる一連の定義があります。

注釈

Godot 3.2より前にプロジェクトを作成した場合、この機能を使用するには、csproj ファイルを変更または再生成する必要があります (<DefineConstants> を新しい3.2+プロジェクトと比較してください)。

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

    public override void _Ready()
    {
#if GODOT_SERVER
        // Don't try to load meshes or anything, this is a server!
        LaunchServer();
#elif GODOT_32 || 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
    }

Or you can write scripts that target multiple Godot versions and take advantage of features that are only available on some of those versions:

    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 is defined when building with the Debug configuration (editor and editor player).

  • GODOT_REAL_T_IS_DOUBLE is defined when the GodotFloat64 property is set to true.

  • アーキテクチャが64ビットか32ビットかによって、GODOT_64 または GODOT_32 のいずれかが定義されます。

  • One of GODOT_LINUXBSD, GODOT_WINDOWS, GODOT_OSX, GODOT_ANDROID, GODOT_IOS, GODOT_HTML5, or GODOT_SERVER 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.

  • GODOTX, GODOTX_Y, GODOTX_Y_Z, GODOTx_OR_GREATER, GODOTX_y_OR_GREATER, and GODOTX_Y_z_OR_GREATER, where X, Y, and Z are replaced by the current major, minor and patch version of Godot. x, y, and z are replaced by all values from 0 to the current version number for that component.

    注釈

    These defines were first added in Godot 4.0.4 and 4.1. Version defines for prior versions do not exist, regardless of the current Godot version.

    For example: Godot 4.0.5 defines GODOT4, GODOT4_OR_GREATER, GODOT4_0, GODOT4_0_OR_GREATER, GODOT4_0_5, GODOT4_0_4_OR_GREATER, and GODOT4_0_5_OR_GREATER. Godot 4.3.2 defines GODOT4, GODOT4_OR_GREATER, GODOT4_3, GODOT4_0_OR_GREATER, GODOT4_1_OR_GREATER, GODOT4_2_OR_GREATER, GODOT4_3_OR_GREATER, GODOT4_3_2, GODOT4_3_0_OR_GREATER, GODOT4_3_1_OR_GREATER, and GODOT4_3_2_OR_GREATER.

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

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

  • One of GODOT_WINDOWS, GODOT_LINUXBSD, GODOT_MACOS, GODOT_ANDROID, GODOT_IOS, or GODOT_WEB depending on the platform.

To see an example project, see the OS testing demo: https://github.com/godotengine/godot-demo-projects/tree/master/misc/os_test