Первоначально, и в течение некоторого времени, C# поддерживался только в Godot на десктопах. В прошлом году команда добилась значительных успехов в расширении поддержки Android и WebAssembly, а теперь пришло время добавить и iOS в этот список.
В этом отчёте также представлен новый способ работы с сигналами Godot в C#.
Поддержка iOS
Демка Dodge The Creeps C# в iOS-симуляторе.
Godot 4.0 получит поддержку C# в iOS. Также планируется включить и в версию 3.2.x; может быть уже в 3.2.2, если всё пойдет хорошо.
Как и в случае с WebAssembly, Mono JIT компилятор недоступен на iOS устройствах. Вместо этого Godot выполнит Ahead-of-Time (AOT) компиляцию при экспорте игры, и полученные библиотеки будут добавлены в сгенерированный Xcode проект.
Помимо дополнительного времени, которое тратится на компиляцию AOT сборок, процесс экспорта должен быть таким же, как и в играх, не использующих C#.
Для тех, кто заинтересован в сборке Godot из исходного кода, код доступен в ветке 3.2-mono-ios (скоро будет слит в ветку 3.2). В настоящее время master ветка не поддерживает многие платформы (включая iOS) из-за постоянной работы над рендерером. Страница Compiling with Mono содержит информацию о сборке среды выполнения Mono, библиотеки базовых классов и кросс-компилятора AOT.
Сигналы как события
Сигналы — это Godot версия паттерна наблюдателя. Классы движка используют сигналы для уведомления слушателей, когда происходит событие. Пользовательские скрипты также могут создавать свои собственные сигналы.
Примерно так выглядит объявление сигнала в GDScript:
1 |
signal text_changed(text) |
Код может взаимодействовать с сигналами через методы connect
, disconnect
и emit_signal
. Сигналы также доступны из редактора Godot, где могут быть созданы новые связи.
Эквивалентом объявления сигнала в C# является объявление делегата с атрибутом Signal
. С ними можно взаимодействовать, используя вышеупомянутые методы.
В .NET распространенным способом реализации шаблона наблюдателя является использование событий. На фоне событий C# код, использующий сигналы Godot, выглядит чуждо.
В прошлом месяце, мотивированные новым типом Callable, разработчики решили переосмыслить реализацию сигналов в C#. Цель на этот раз — представить их как события. Всё это пока ещё в процессе, но первоначальные результаты выглядят великолепно.
Сравнение старого и нового стиля:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// Старый стиль class TextField : Node { [Signal] delegate void TextChanged(string text); void Foo() { Connect(nameof(TextChanged), this, nameof(TextChangedCallback)); EmitSignal(nameof(TextChanged), "bar"); } void TextChangedCallback(string text) { /* ... */ } } // Новый стиль class TextField : Node { delegate void TextChangedHandler(string text); [Signal] event TextChangedHandler TextChanged; void Foo() { TextChanged += TextChangedCallback; // TextChanged?.Invoke("bar"); // Nope, not yet :( EmitSignal(nameof(TextChanged), "bar"); } void TextChangedCallback(string text) { /* ... */ } } |
Как видно из примера, самая важная отсутствующая часть — это поддержка события. Прямо сейчас вызовается только делегат события, но не будет заэмичен сигнал, что важно для уведомления обработчика и слушателей GDScript. Таким образом, команде всё ещё нужно использовать классический вызов EmitSignal
, который будет эмитить сигнал и вызывать событие. Потребуется дополнительная работа для поддержки сего дела.
Что дальше?
На следующей неделе анонсируют расширение Godot для Visual Studio и VS Code.