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

Метод GetNode() повертає екземпляр Node. Ви повинні явно перетворити його на потрібний похідний тип, у цьому випадку Sprite2D.

Для цього у вас є різні варіанти в C#.

Приведення та перевірка типу

Викидає InvalidCastException, якщо повернутий вузол не може бути приведений до Sprite2D. Ви б використовували його замість оператора as, якщо ви майже впевнені, що він не вийде.

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

Використання оператора AS

Оператор as повертає null, якщо вузол не може бути приведений до Sprite2D, і з цієї причини його не можна використовувати з типами значень.

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

Щоб перевірити, чи можна перевести вузол у Sprite2D, ви можете скористатися оператором is. Оператор is повертає false, якщо вузол не може бути приведений до Sprite2D, інакше він повертає 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);
}

Більш просунуту перевірку типу ви можете подивитись у Відповідність шаблонів.

Preprocessor визначення

У Godot є набір визначень, які дозволяють змінювати ваш C# код залежно від середовища.

Приклади

Наприклад, ви можете змінити код на основі платформи:

    public override void _Ready()
    {
#if (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
    }

Або ви можете написати сценарії, націлені на кілька версій Годо, і скористатися функціями, які доступні лише в деяких із цих версій:

    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.

  • ІНСТРУМЕНТИ визначається під час створення з конфігурацією Debug (редактор і програвач редактора).

  • GODOT_REAL_T_IS_DOUBLE визначається, коли властивість GodotFloat64 має значення true.

  • GODOT_64, або GODOT_32, визначається залежно від того, чи архітектура 64-бітна, чи 32-бітна.

  • 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.

  • GODOTX, GODOTX_Y, GODOTX_Y_Z, GODOTx_OR_GREATER, GODOTX_y_OR_GREATER і GODOTX_Y_z_OR_GREATER, де X, Y, і Z замінено на поточну основну, додаткову та виправлену версії Godot. x, y і z замінюються всіма значеннями від 0 до номера поточної версії для цього компонента.

    Примітка

    Ці визначення вперше були додані в Godot 4.0.4 і 4.0. Визначення версій для попередніх версій не існують, незалежно від поточної версії Godot.

    Наприклад: Godot 4.0.5 визначає «GODOT4», «GODOT4_OR_GREATER», «GODOT4_0_0», «GODOT4_0_5», «GODOT4_0_5_OR_G». REATER`` . Godot 4.3.2 визначає 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 і GODOT4_3_2_OR_GREATER.

Під час експортування також можна визначити наступне залежно від особливостей експорту:

  • Залежно від типу платформи GODOT_PC, GODOT_MOBILE, або GODOT_WEB.

  • Один із GODOT_WINDOWS, GODOT_LINUXBSD, GODOT_MACOS, GODOT_ANDROID, GODOT_IOS або GODOT_WEB залежно від платформи.

Щоб побачити приклад проєкту, дивіться демонстраційну версію тестування ОС: https://github.com/godotengine/godot-demo-projects/tree/master/misc/os_test