Друзья, приветствую, с Вами Будуев Антон. В данной статье мы поговорим о том, что такое интерфейсы в Unreal Engine (UE4, UE5), и в частности Blueprint Interface. Разберём, как их создать и реализовать, а также обсудим отличие интерфейсов от Cast и наследования классов.
Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.
Unreal Engine Interface

Interface (интерфейс) в Unreal Engine — это специальный тип класса, определяющий набор функций, которые могут быть реализованы любыми другими классами. Он не имеет данных (переменных), а также реализации функций и представляет собой лишь перечень названий функций с указанием входных и выходных параметров, то есть, иначе говоря, представляет набор сигнатур различных функций.
Интерфейсы выступают как «контракт»: если какой-то класс реализует интерфейс, он обязан предоставить реализацию всех его функций (хотя бы пустыми, что обеспечивает гарантию, что вызов функции будет безопасен).
Interface позволяет разным объектам взаимодействовать единообразно, несмотря на различия в их типах. Например, можно создать интерфейс BPI_Interactable с функцией Interact. И его смогут реализовать классы двери, рычага, подбираемого предмета или NPC — каждый со своей логикой функции Interact для взаимодействия.
А код игрока, отвечающего за взаимодействие, может проверять, реализует ли объект данный интерфейс, и если реализует, то вызывать в нём функцию Interact, не зная конкретного типа объекта.
Например, на скриншоте ниже приведена схема реализация Blueprint-интерфейса BPI_Interactable, в котором объявлена функция Interact.
Два совершенно разных Blueprint-класса: BP_Lamp (лампа) и BP_Door (дверь) — реализуют данный интерфейс. В результате каждый из них получает событие Event Interact, которое является реализацией метода интерфейса. При этом логика этого события может быть полностью различной:
- у лампы — включение/выключение света,
- у двери — открытие/закрытие.

Ключевое преимущество такого подхода заключается в гибкости кода. Например, персонаж игрока (BP_ThirdPersonCharacter) может вызывать функцию Interact на любом объекте, не зная его конкретного типа. Для этого достаточно иметь ссылку на Actor, например, полученную через событие Actor Begin Overlap при столкновении с другим объектом.
Поскольку вызов выполняется через интерфейс, система автоматически проверяет, реализует ли целевой объект BPI_Interactable. Если да — вызывается соответствующая реализация Event Interact. Если нет — ничего не происходит, без ошибок или необходимости дополнительных проверок.
Такой паттерн позволяет создавать масштабируемые и легко расширяемые системы взаимодействия, где новый объект может стать «взаимодействуемым» просто путём реализации интерфейса, а логика взаимодействия остаётся централизованной и безопасной.
Таким образом, достигается гибкость, переиспользование кода и слабая связанность между Blueprint-классами.
Отличие интерфейсов от наследования классов
Наследование и интерфейсы в Unreal Engine решают схожую задачу — обеспечение полиморфного поведения, при котором разные классы могут реализовывать одинаковые функции по-разному. Однако подходы к этой задаче принципиально различаются.
При наследовании создаётся иерархия, в которой дочерние классы получают функциональность от родительского. Родитель может определять виртуальные функции (функции, которые можно переопределить в производном классе), которые дочерние классы обязаны переопределить. Например, базовый класс BP_Enemy может объявить функцию Attack, которую каждый подкласс (летающий враг, босс и т.д.) реализует по-своему. Такой подход хорошо работает, когда объекты разделяют общую структуру, состояние и логику.
Однако в Unreal Engine действует ограничение одиночного наследования: любой класс, унаследованный от UObject, может иметь только одного родителя. Это создаёт проблему: если вы хотите создать общий базовый класс BP_Interactable для всех взаимодействующих объектов, то любой класс, желающий быть интерактивным, должен от него унаследоваться. Но что, если объект уже является Character или Pawn? Он не может унаследоваться от двух классов одновременно.
Здесь и проявляется главное преимущество интерфейсов: они не требуют изменения иерархии классов и могут быть реализованы любым классом, независимо от его родителя. Например, дверь (наследник Static Mesh Actor), персонаж (Character) и сундук (Actor) могут все реализовывать интерфейс BPI_Usable с функцией Use. При этом у них нет общего предка, но система взаимодействия может проверить (например, функциями Does Implement Interface), реализует ли объект под курсором этот интерфейс, и вызвать функцию Use, не зная его типа.
Ещё одно ключевое преимущество — множественная реализация. Один класс может реализовывать несколько интерфейсов, например: BPI_Damageable, BPI_Savable, BPI_Interactable и т.д. Что невозможно при наследовании.
Благодаря этому интерфейсы идеально подходят для описания ролей или возможностей объекта. Например, персонаж может «быть повреждаемым», «сохраняемым», «взаимодействующим» — каждая из этих ролей выражается отдельным интерфейсом. Это способствует разделению ответственности, гибкости и поддерживаемости кода.
Таким образом, хотя и наследование, и интерфейсы обеспечивают полиморфизм, интерфейсы предлагают более гибкий и масштабируемый подход. Они избегают жёсткой иерархии, позволяют реализовывать множество поведений одновременно и идеально подходят для выражения возможностей вида Can-do или «может» (например, объект может быть использован, может получать урон, может сохраняться), в то время как наследование лучше отражает отношения Is-a или «является» (например, объект является типом Character).
Отличие Interface от Cast
Напомню, интерфейсы позволяют определить общий набор функций, которые могут быть реализованы совершенно разными Акторами, независимо от их класса.
Приведение типов (Cast), напротив, используется тогда, когда разработчик заранее знает, с каким конкретным типом объекта он хочет работать. Например, если вы получили ссылку на Актор под прицелом игрока, в Blueprint вы можете использовать узел Cast To BP_Door. Если объект действительно является дверью, каст пройдёт успешно, и вы получите доступ к её специфичным переменным и функциям, таким как Open Door или Is Locked. Однако такой подход жёстко привязан к конкретному классу. Если вы позже захотите взаимодействовать с сундуком, придётся добавлять ещё один каст — Cast To BP_Chest, и так далее. Это приводит к множеству ветвлений, усложняет граф и делает его трудным для поддержки, особенно если взаимодействующих объектов становится много.

Интерфейсы позволяют избежать этой проблемы. Вместо множества кастов вы можете использовать функции Does Implement Interface, чтобы проверить, реализует ли объект нужный интерфейс, например, BPI_Interactable.
Если проверка успешна, вы можете вызвать функцию интерфейса (например, Interact) с помощью узла Interact (Message). Движок автоматически выполнит ту реализацию, которая определена в конкретном классе.

Такой подход делает логику универсальной: один и тот же узел может работать с любым объектом, реализующим интерфейс, без изменения графа. Более того, проверка реализации интерфейса выполняется быстро и масштабируется гораздо лучше, чем цепочка кастов.
Таким образом, интерфейсы — это способ организовать гибкое, масштабируемое поведение, а каст — инструмент для прямого доступа к известному типу. Каст полезен, когда вы точно знаете, с каким объектом работаете, и вам нужны его уникальные свойства.
Но когда вы создаёте универсальные системы — например, взаимодействие, повреждение, сохранение, реакцию на события — интерфейсы становятся предпочтительным решением. Они позволяют строить логику, ориентированную на функциональность, а не на тип, что делает графы в Blueprint чище, понятнее и легче расширяемыми. Вместо цепочки кастов и ветвлений вы получаете один универсальный путь обработки, который работает с любым объектом, поддерживающим нужное поведение.
Как создать и реализовать Blueprint Interface
Создание интерфейса
В Blueprint создание интерфейса — это простой и интуитивный процесс, позволяющий определить общий набор функций, которые могут быть реализованы любыми другими Blueprint-классами в проекте.
Чтобы начать, перейдите в Content Browser, щёлкните по кнопке +Add и в контекстном меню выберите Blueprint / Blueprint Interface.

Будет создан новый ассет интерфейса, которому следует дать осмысленное имя, например, BPI_Interactable (рекомендуется использовать префикс BPI_ для ясности).
При открытии интерфейса вы увидите упрощённый редактор: здесь нет Event Graph, компонентов или переменных — только вкладка My Blueprint.
Чтобы добавить функцию, нажмите кнопку +Add в разделе Functions. Введите имя, например, Interact, и в панели Details настройте входные параметры (например, Instigator типа Actor) или возвращаемые значения, если необходимо.

Реализация интерфейса
После создания интерфейс готов к использованию. Любой Blueprint-класс (например, дверь, сундук или NPC) может объявить, что он реализует этот интерфейс.
Для этого откройте нужный Blueprint и перейдите в Class Settings (иконка шестерёнки). В разделе Interfaces нажмите Add и выберите ваш интерфейс, например, BPI_Interactable.

После добавления в панели My Blueprint появится вкладка Interfaces, где будут отображены все функции из интерфейса. Откройте, например, функцию Interact, и реализуйте в ней нужную логику: открыть дверь, проиграть анимацию, выдать предмет или запустить диалог.

Вызов функции интерфейса
После того как интерфейс реализован в классе, любой другой объект может проверить, реализует ли данный класс этот интерфейс, и если реализует, то вызвать в нём соответствующую функцию, при этом совершенно ничего не зная про этот класс.
Например, в Blueprint игрока можно реализовать логику: «если объект перед игроком реализует интерфейс BPI_Interactable, вызови у него функцию Interact».
Для этого:
- Используйте функции Does Implement Interface, чтобы проверить, поддерживает ли объект интерфейс.
- Если проверка успешна, используйте узел Message для вызова конкретной интерфейсной функции. На графе такие узлы помечаются знаком «открытый конверт». В текущем примере, это Interact (Message). Данный узел вызовет соответствующую функцию Interact в реализованном интерфейсе. * Примечание: узел [Название функции] (Message) находится в списке всех функций через правую клавишу мыши на поле Event Graph. Он добавляется в этот список автоматически, когда вы создаёте функции внутри Blueprint Interface.
- Подключите к узлу Interact (Message) ссылку на объект, в котором необходимо вызвать данную функцию реализованного интерфейса. На примере ниже это Other Actor, который пересёк коллизию текущего объекта.

Также вызвать интерфейсную функцию у объекта можно, просто используя узел Message, без проверки реализации интерфейса, так как узел Message универсальный — если он будет отправлять сообщение объекту, не реализующему интерфейс, то ничего не произойдет. Если же объект реализует данный интерфейс, то узел Message вызовет в нём соответствующую интерфейсную функцию.

Подход с использованием интерфейсов позволяет строить универсальные системы: один и тот же механизм взаимодействия может работать с дверями, сундуками, панелями и NPC, без необходимости множественных кастов или ветвлений.
Does Implement Interface
Для проверки, реализует ли любой объект определённый интерфейс в Blueprint, используются функции семейства Does Implement Interface.
Does Object Implement Interface

Blueprint функция Does Object Implement Interface в Unreal Engine — является Pure-функцией, входящей в категорию Utilities из библиотеки Kismet System Library. Она проверяет, реализует ли конкретный экземпляр объекта (UObject) заданный интерфейс. Работает как с нативными интерфейсами (C++), так и с интерфейсами, созданными в Blueprint.
Параметры функции:
- Test Object (Object) — объект, который нужно проверить.
- Interface (Interface) — интерфейс, реализацию которого нужно проверить.
- Return Value (bool, возвращаемое значение):
- True — означает, что проверяемый объект реализует указанный интерфейс.
- False — означает, что проверяемый объект не реализует указанный интерфейс, или один из входных параметров (Test Object или Interface) был Null (пустой), или переданный Interface не является действительным интерфейсом.
Фактически же внутри («под капотом») функция Does Object Implement Interface делегирует проверку другой функции. Если переданный Test Object не является пустой ссылкой, она вызывает функцию Does Class Implement Interface, передавая в неё класс объекта (Test Object -> GetClass()) и интерфейс (Interface) для выполнения проверки на уровне класса.
Does Class Implement Interface

Blueprint функция Does Class Implement Interface в Unreal Engine — является Pure-функцией, входящей в категорию Utilities из библиотеки Kismet System Library. Она проверяет, реализует ли конкретный класс (UClass) заданный интерфейс. Поддерживает как нативные (C++), так и Blueprint интерфейсы.
Параметры функции:
- Test Class (UClass) — класс, который нужно проверить.
- Interface (Interface) — интерфейс, реализацию которого нужно проверить.
- Return Value (bool, возвращаемое значение):
- True — означает, что проверяемый класс реализует указанный интерфейс.
- False — означает, что проверяемый класс не реализует указанный интерфейс, или один из входных параметров (Test Class или Interface) был Null (пустой), или переданный Interface не является действительным интерфейсом.
Функция Does Class Implement Interface сначала проверяет, что оба входных параметра (Test Class и Interface) не равны Null (не пусты). Затем производит дополнительную проверку, действительно ли объект Interface является подклассом UInterface, чтобы убедиться, что передан корректный тип интерфейса.
Если эта проверка проваливается, функция записывает предупреждение в лог и возвращает False.
Если все проверки пройдены, функция вызывает внутренний метод движка Unreal Engine TestClass->ImplementsInterface(Interface), который проверяет, включён ли указанный Interface в список интерфейсов, реализуемых данным классом Test Class. Результат этого внутреннего вызова и возвращается как результат функции Does Class Implement Interface (True или False).
Совет. Вскоре выйдет моя бесплатная книга по Blueprints для Unreal Engine в PDF формате. Как она выйдет, рекомендую её скачать, чтобы Вы детально изучили блюпринты Анрил Энджин.