Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

C# 기능

이 페이지는 C#과 Godot에서 일반적으로 사용되는 기능과 어떻게 이 둘이 함께 사용되는 지에 대한 개요입니다.

형 변환과 캐스트하기

C#은 정적으로 타입형 언어입니다. 그러므로 다음을 할 수 없습니다:

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

Node 인스턴스를 반환하는 GetNode() 메서드. Sprite의 경우, 원하는 파생 타입을 명시적으로 변환해야 합니다.

이를 위해, C#에서는 다양한 옵션이 있습니다.

캐스트하기와 타입 체크하기

반환된 노드를 Sprite로 캐스트 할 수 없는 경우 InvalidCastException을 발생시킵니다. 실패하지 않는다고 확신하면 as 연산자 대신에 그것을 사용할 것입니다.

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

AS 연산자 사용하기

노드가 Sprite로 캐스트 될 수 없다면 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 연산자를 사용하여 타입 체크하기

노드가 Sprite로 캐스트 되도록 체크하기 위해, is 연산자를 사용할 수 있습니다. Sprite가 캐스트 되지 않는다면 is 연산자는 거짓을 반환하고, 그렇지 않으면 참을 반환합니다.

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

더 많은 고급 타입 체크하기의 경우, 패턴 일치에서 찾아볼 수 있습니다.

전처리기 지시문

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``는 디버그 구성(에디터 및 에디터 플레이어)으로 빌드할 때 정의됩니다.

  • GODOT_REAL_T_IS_DOUBLE``는 ``GodotFloat64 속성이 ``true``로 설정된 경우 정의됩니다.

  • 사용중인 운영 체제의 종류에 따라서 GODOT_X11, GODOT_WINDOWS, GODOT_OSX, GODOT_ANDROID, GODOT_IOS, GODOT_HTML5, 또는 GODOT_SERVER 중 하나가 정의됩니다. 위 이름들은 후에 변경될 수 있습니다. 이들은 OS 싱글턴의 get_name() 메서드로 생성될 수 있지만, 메서드가 반환하는 모든 OS에서 .NET 버전 Godot가 실행될 수 있는 것은 아닙니다.

  • GODOTX, GODOTX_Y, GODOTX_Y_Z, GODOTx_OR_GREATER, GODOTX_y_OR_GREATERGODOTX_Y_z_OR_GREATER. 여기서 X, YZ``는 현재 메이저로 대체됩니다. Godot의 마이너 패치 버전. ``x, y``z``는 0부터 해당 구성 요소의 현재 버전 번호까지의 모든 값으로 대체됩니다.

    참고

    이 정의는 Godot 4.0.4와 4.1에서 처음 추가되었습니다. 현재 Godot 버전에 관계없이 이전 버전에 대한 버전 정의는 존재하지 않습니다.

    예: Godot 4.0.5는 GODOT4, GODOT4_OR_GREATER, GODOT4_0, GODOT4_0_OR_GREATER, GODOT4_0_5, GODOT4_0_4_OR_GREATERGODOT4_0_5_OR_GREATER``를 정의합니다. Godot 4.3.2는 ``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_GREATERGODOT4_3_2_OR_GREATER.

내보내기 를 할 때, 내보내기 기능에 따라서 아래의 것들이 정의될 수 있습니다:

  • 플랫폼에 따라서 GODOT_PC, GODOT_MOBILE, 또는 GODOT_WEB 중 하나가 정의됩니다.

  • 플랫폼에 따라서 GODOT_PC, GODOT_MOBILE, 또는 GODOT_WEB 중 하나가 정의됩니다.

예제 프로젝트를 확인하려면 OS 테스트 데모를 확인하세요: https://github.com/godotengine/godot-demo-projects/tree/master/misc/os_test