Per aspera ad astra или RoadMap по вашей будущей игре. Godot 4 C# Часть 7 "Сигналы".

Сегодня речь пойдет о сигналах.

Нет, это не сигналы из космоса. Сигналы в Godot – это система, система событий. Да, понимаю, яснее не стало. 😁

В целом для начинающего эта тема может быть непонятной и пугающей. Но в разработке сигналы являются одним из ключевых моментов.

Множество процессов основаны на сигналах и позволяют как упростить код, так и реагировать на происходящее в игре.

В текущей статье я постараюсь обобщённо объяснить, что такое сигналы (события) и как они работают. Подробнее же можно будет почитать в моём ТГ (не сильно хочется повторяться). Там я буду выкладывать примеры кода и практику, также не стесняйтесь писать комментарии с вопросами – чем смогу, помогу.

Если упростить, сигнал – это действие с описанной реакцией на него.

Допустим, у вас есть персонаж, который передвигается по подземелью в поисках тайных зон. И вот вы находите потайную дверь. Войдя в неё, вы слышите, как за вами захлопывается дверь, загорается красный свет и появляется босс.

Сигнал (или событие — как правильнее его назвать) срабатывает, когда вы вошли в отведённую зону. Эта зона зафиксировала, что вы в неё вошли, и запустила функцию закрытия двери и спавна босса.

Думаю, те, кто уже успел поработать с C#, столкнулись с такой темой, как delegate. На базе делегатов построены два типа: Action и Func.

По сути, их мы и используем для работы с сигналами, но как же это работает в движке?

При работе с вашими сценами у вас будет возможность подписки на встроенные события через стандартные для языка конструкции +=.

Когда вы просматриваете список методов, доступных для IntelliSense, вы часто можете обнаружить в начале имени значок молнии ⚡ – так обозначаются сигналы.

Per aspera ad astra или RoadMap по вашей будущей игре. Godot 4 C# Часть 7 "Сигналы".

Итак, сигналы доступны в редакторе. Для них отведена вкладка рядом с инспектором, и называется она "Узлы". На этой вкладке располагаются все сигналы, доступные узлу, начиная от его предков. Из редактора я их не использую, так как они заточены под GDScript. Однако этот список является отличным ориентиром для работы с ними в C#.

Создаёте нужную сцену с набором необходимых для её работы узлов. Берёте любой узел, который хотите, и смотрите, какие сигналы он поддерживает.

Далее достаточно обратиться к этому узлу из кода, например, в методе _Ready(), и подписаться на нужное вам событие. Затем добавляете ниже приватный метод с сигнатурой, которую запросит сигнал (её можно посмотреть, перейдя на исходный код сигнала), и вот мы получаем метод, работающий через сигнал.

Главное – не забывайте отписываться в _ExitTree() от всех сигналов, чтобы не получить утечку памяти.

Почему я сейчас завёл речь о сигналах, спросите вы? В разработке они используются постоянно:

  • для взаимодействия объектов;
  • вызова различной функциональности в нужный момент;
  • организация кода для взаимодействия с UI;
  • отслеживания входа персонажа в зону и много где ещё.

С помощью сигналов мы можем отслеживать коллизии, и в следующей теме я планирую рассмотреть «Коллайдеры и коллизии».

Спасибо за внимание!

3
1
14 комментариев