Паттерн «Интерфейс» для интерактивных объектов в Unity: пишем расширяемый код
Всем привет!
Часто в Unity взаимодействие с объектами (дверями, сундуками, лутом) пишут через костыли вроде проверки тегов для каждого типа. Это быстро превращает код игрока в кашу, нарушая принципы SOLID. Каждый новый предмет заставляет вас переписывать логику персонажа.
Правильный путь - использовать интерфейсы.
Мы просто создаем единый контракт (интерфейс), который обязуются выполнять все интерактивные объекты. В нем прописываются всего две вещи: метод самого взаимодействия и метод, отдающий текст-подсказку для UI (например, «Открыть дверь» или «Взять предмет»). Любой объект, будь то скрипт уничтожения предмета или сложный терминал хакинга, настраивается через этот интерфейс.Вызывающему скрипту (лучу Raycast или триггеру игрока) становится абсолютно всё равно, что за объект перед ним. При обнаружении цели он через стандартный запрос компонентов ищет этот интерфейс. Если нашел - забирает текст для UI и вызывает логику взаимодействия.
В чем профит? Полная независимость кода. Если завтра вы добавите в игру сейф, лифт или торговца, вам не придется менять код игрока.
Достаточно написать новый изолированный скрипт, привязать к нему этот интерфейс и повесить на объект с коллайдером. Код игрока подцепит его автоматически.
Полный разбор паттерна и примеры готовых скриптов вы можете посмотреть в моем репозитории: https://github.com/nitroasus/Interaction-System-Mobile/releases/
Удачи в разработке! Пишите в комментариях, как вы реализуете интерактивность в своих проектах.