Godot 4 C# | Система взаимодействий
Доброго времени суток, в данной статье я бы хотел поделиться своей компактной, но достаточной для небольших проектов, реализацией системы взаимодействия между игроком и интерактивными объектами в Godot на основе 3D физики
Взаимодействия
Для выражения взаимодействия мы создадим следующие типы:
- Класс Interaction, описывающий взаимодействие с объектом
- Класс InteractionResponse, возвращающий результат взаимодействия
В моей игре несколько видов:
- Включить фонарик(FlashOnInteraction)
- Выключить фонарик(FlashOffInteraction)
- Использовать(нажатие, UseInteraction)
- Использовать(удержание, HoldUseInteraction)
- Использовать(перемещение, DragUseInteraction)
Последнии 2 дополняют базовый класс UseInteraction и их главными отличиями являются дополнительные данные: для удержания - время, а для перемещения вектор смещения
Интерфейсы
Я решил использовать дополнительные слои абстракции в виде интерфейсов, но если вам это не будет нужно, то вы можете смело отказаться от них
Объекты
Первым рассмотрим класс Interactor3D, который используется контроллером персонажа и полностью изолирует реализацию взаимодействия, а наружу доступен только метод Interact(). Его главная задача - выполнять взаимодействие, здесь это реализовано через Raycast и получение Collider объекта
Затем перейдем в класс Interactive3D, который скрывает всю логику объекта по обработке взаимодействия. Своего рода OnInteract() это аналог метода _Input(), но для взаимодействий. У себя в игре я использую этот класс как промежуточный, он реагирует на обновления и вызывает нужный метод у, так скажем, настоящего объекта, который никак не привязан к системе и не будет затронут при необходимости изменить при каком конкретно типе использования будет выполняться действие
Последний класс - InteractableStaticBody3D, он расширяет функциональность тела, делая его интерактивным. Вы можете сделать аналоги для других тел или области при необходимости. Решение создать промежуточный объект упрощает организацию узлов и позволяет соблюдать принцип единой ответственности
Примеры
Таким образом я организовал это в своем проекте
Вся система заточена на то, чтобы быть модульной и настраиваемой в редакторе, не изменяя код. Здесь используется атрибут GlobalClass, который позволяет редактору видеть наши классы, рекомендую прочитать в документации об этом
Буду рад услышать предложения и критику, это статья эксперементальная, я не уверен, что буду продолжать серию
Спасибо за внимание, друг