Godot: прогресс по C#, поддержка iOS и сигналы

Первоначально, и в течение некоторого времени, 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:

Код может взаимодействовать с сигналами через методы connect, disconnect и emit_signal. Сигналы также доступны из редактора Godot, где могут быть созданы новые связи.

Эквивалентом объявления сигнала в C# является объявление делегата с атрибутом Signal. С ними можно взаимодействовать, используя вышеупомянутые методы.

В .NET распространенным способом реализации шаблона наблюдателя является использование событий. На фоне событий C# код, использующий сигналы Godot, выглядит чуждо.

В прошлом месяце, мотивированные новым типом Callable, разработчики решили переосмыслить реализацию сигналов в C#. Цель на этот раз — представить их как события. Всё это пока ещё в процессе, но первоначальные результаты выглядят великолепно.

Сравнение старого и нового стиля:

Как видно из примера, самая важная отсутствующая часть — это поддержка события. Прямо сейчас вызовается только делегат события, но не будет заэмичен сигнал, что важно для уведомления обработчика и слушателей GDScript. Таким образом, команде всё ещё нужно использовать классический вызов EmitSignal, который будет эмитить сигнал и вызывать событие. Потребуется дополнительная работа для поддержки сего дела.

Что дальше?

На следующей неделе анонсируют расширение Godot для Visual Studio и VS Code.