- Blueprint Class в Unreal Engine
- Объектно-ориентированное программирование в Анрил Энджин
- Принципы наследования
- Принципы инкапсуляции в Blueprint Class
- Основные родительские Blueprint Class, встроенные в Unreal Engine
- Object
- Actor
- Pawn
- Character Blueprint Class
- Player Controller
- Game Mode
- Game Instance
- Player State Blueprint Class
- Game State
- Blueprint Class Settings — базовые настройки класса
- Как создать Blueprint Class
- Content Browser
- Viewport игрового мира
- Как в Unreal Engine создать дочерний Blueprint Class
Друзья, приветствую, с Вами Будуев Антон. В данной статье мы поговорим об одном из самых распространенных типов ассетов движка Unreal Engine (UE4, UE5) — Blueprint Class. А также разберем основные родительские классы движка (Actor, Pawn, Character, Player Controller и другие), на основе которых создаются практически все пользовательские блюпринты.
Blueprint Class в Unreal Engine
Blueprint Class в Unreal Engine или по «народному» просто блюпринты — это ассеты (внутренние файлы движка), размещаемые на игровом уровне. Эти ассеты содержат в себе данные (компоненты и свойства), а также логику (скрипты Blueprints), управляющую этими данными в ответ на события, происходящие в игровом мире.
Под компонентами понимаются как визуальные данные, такие как модель объекта, его коллизии, анимации персонажей и прочее, так и функциональные элементы, которые придают объекту определённые возможности. Например, компонент Character Movement позволяет двуногому персонажу передвигаться: ходить, бегать, плавать и так далее.
Все Blueprint Class являются пользовательскими дочерними классами, которые позволяют легко добавлять новую функциональность, а также новые данные к стандартным родительским классам движка Анрил Энджин. А после, позволяют на их основе создавать в игровом мире множественные объекты. Где каждый объект, содержащий в себе данные и Blueprint логику, может при помощи этой логики изменять свои внутренние данные в ответ на игровые события.
Например, когда игрок нажимает на клавиатуре клавишу пробела, игровой объект, представляющий персонажа, может отреагировать на это игровое событие и изменить свои внутренние данные с помощью логики Blueprint. А именно, он может изменить данные анимации с покоя на прыжок, а также изменить свои данные координат в мире — переместиться вверх, а затем снова вниз, что сымитирует прыжок.
Чтобы понять, что такое родительские и дочерние классы, давайте немного углубимся в тему объектно-ориентированного программирования (ООП).
Объектно-ориентированное программирование в Анрил Энджин
Как и во многих популярных языках программирования, в игровом движке Unreal Engine применяются принципы ООП.
Объектно-ориентированное программирование в Анрил Энджин — это подход к разработке игр, в котором элементы игрового мира представлены в виде объектов. Их данные, структура, свойства и поведение определяются классом, к которому они принадлежат.
То есть, все интерактивные объекты в игре, имеющие внутри себя определенную логику поведения, являются одним из экземпляров конкретного Blueprint Class.
Blueprint Class – это схема (чертеж) для создания объекта, имеющего в себе определенную логику. Схема содержит подробное описание своих будущих экземпляров в игровом мире. Определяет их поведение, структуру и состав данных.
Используя один класс, можно создать неограниченное количество экземпляров. По умолчанию они будут обладать одинаковыми данными, свойствами и методами, которые уже определены в их классе. Но значения этих свойств у каждого объекта будут разными.
То есть, любой Blueprint Class содержит набор обязательных элементов: данные, свойства и методы (функции), которые будут определять характеристики экземпляров этого класса и их поведение.
Например, возьмем класс «Собака». У собаки есть характеризующие ее свойства (параметры):
- кличка;
- пол;
- возраст;
- цвет.
А также методы (ее функции). То есть то, что она умеет делать:
- лаять;
- бегать;
- прыгать.
Соответственно, имея один общий Blueprint Class «Собака», в Unreal Engine мы можем создать множество различных объектов собак. И поместить этих конкретных собак в игровой мир.
У всех представителей блюпринта «Собака» будут одинаковые свойства, но значения этих свойств будут различаться. Например, у всех собак будет свойство «Кличка», но у каждой собаки кличка будет своей: у одной — «Шарик», у другой — «Васька».
То же самое и с функциями. У всех экземпляров класса «Собака» будет функция «Бегать». Однако каждая конкретная собака будет бегать, то есть исполнять свою функцию, по-разному: одна быстро, другая медленно, а третья, возможно, будет хромать.
Принципы наследования
Все Blueprint Class в Анрил Энджин поддерживают иерархию наследования.
Наследование — это один из самых мощных и важных инструментов в ООП. С его помощью можно создавать новый дочерний объект или класс на основе уже существующего родительского, наследуя все его данные, методы и свойства. При этом можно использовать как весь унаследованный функционал, так и частично, переопределив или добавив новый.
То есть, в дочерних классах можно:
- добавлять новые данные, свойства и методы;
- заменять алгоритмы методов родительского класса.
Но, важный момент, в дочерних Blueprint Class нельзя удалять родительские данные и функционал. Заменять можно, а удалять нет.
В итоге, наследование значительно упрощает разработку игр в Unreal Engine, так как позволяет избежать повторного написания одного и того же кода.
В качестве примера наследования рассмотрим транспортные средства: автомобиль и самолёт. И автомобиль, и самолёт могут перевозить людей и грузы. Однако способы их передвижения различаются. Таким образом, у них есть как общие, так и отличительные характеристики.
Соответственно, мы можем определить один общий родительский Blueprint Class «Транспорт», у которого будут общие свойства:
- цвет;
- количество пассажиров;
- максимальная грузоподъемность.
Далее, на основе родительского блюпринта «Транспорт» можно создать два дочерних: «Машина» и «Самолет». В этих классах мы можем описать методы, которые будут уникальными для каждого из них. Например, для класса «Машина» можно определить метод «Ездить», а для самолета — функцию «Летать». А вот свойства (цвет, количество пассажиров, максимальная грузоподъемность) уже прописывать не нужно. Всё это просто унаследуется от родительского класса «Транспорт». Единственное, значения у свойств будут разными. Для машины нужно задать одни значения свойств, для самолета другие.
Такой подход позволит нам избежать дублирования кода в родительских и дочерних блупринтах. А также даст возможность легко дополнять новыми общими данными, свойствами и методами все объекты, просто прописав код в родительском классе.
Принципы инкапсуляции в Blueprint Class
Также в Blueprint Class реализуется принцип инкапсуляции (encapsulate — «поместить в капсулу, изолировать»).
Согласно этому принципу ООП, вся важная для существования объекта информация хранится внутри него самого. При этом весь внутренний функционал, свойства и логика скрыты от внешнего мира. И только лишь некоторые функции доступны для взаимодействия с другими объектами игры, в рамках специализированного инструмента Blueprint Interface.
Инкапсуляция — это механизм, который обеспечивает высокий уровень безопасности и снижает вероятность случайного повреждения данных внутри класса или объекта.
То есть, если в проекте на Unreal Engine имеются Blueprint Class «Машина» и «Игрок», то их объекты в игровом мире не должны знать друг о друге абсолютно ничего. Как игрок не должен знать, при помощи каких функций машина передвигается, как она открывает двери. Так и машина не должна знать, как устроены функции ходьбы у игрока и с помощью каких методов игрок садится в машину. А для того чтобы эти классы могли взаимодействовать друг с другом, когда игроку нужно сесть в машину, открыв её дверь, используется уже специальный инструмент Blueprint Interface.
Все принципы ООП характерны не только для Blueprint Class, но и для любых объектов в Unreal Engine.
Например, принципам наследования соответствуют материалы в движке или компоненты в блюпринтах. А для функций характерна инкапсуляция. Так как для разработчика не важна внутренняя формула функции, а важно то, что она делает, важен результат ее работы.
Иначе говоря, ООП — это основа всего игрового движка.
Основные родительские Blueprint Class, встроенные в Unreal Engine
Для удобства разработчиков и экономии их времени, в Анрил Энджин по умолчанию уже определены множество различных родительских классов с заранее подготовленной функциональностью. От которых создаваемый нами Blueprint Class наследует все основные характеристики и функции. Давайте рассмотрим самые основные из них.
Object
Самым базовым родительским классом в Unreal Engine (UE4, UE5) является класс Object.
Именно от него стартует вся иерархия наследования в движке. Он является родительским для 737 других дочерних классов. Экземпляры Object невозможно физически разместить на игровом уровне. А вся функциональность Object сводится к инициализации и базовой подготовке наследуемого объекта:
- инициализация свойств;
- приведение типов;
- сетевая репликация;
- подсчет ссылок;
- сборка «мусора» и очистка памяти,
- и прочая подготовка.
Actor
Actor (актор) — класс, наследуемый от Object, являющийся основным строительным блоком в Unreal Engine.
С Actor можно взаимодействовать. Он создает объект, который можно поместить в игровой мир и хранит в себе набор базовых свойств:
- Location — координаты в мире (по осям X, Y, Z), Rotation — поворот, Scale — масштаб;
- функции репликации;
- методы рендеринга;
- настройки коллизии, физики;
- наличие Events (событий) для реакции на внешний мир.
Actor используется чаще остальных. Он подходит для создания неодушевленных объектов в игровом мире, которые наделены определенной логикой: открываемая дверь, зажигающаяся лампочка, подбираемый предмет и прочее.
Pawn
Pawn (павн, пон, пешка) — класс, наследуемый от Actor. Объектами этого класса может «овладевать» (possess) контроллер, получая входные данные (Input) и управляя движением Pawn’a. Управление достигается либо посредством искусственного интеллекта (AI Controller), либо же самим игроком (Player Controller). То есть, основное отличие от Actor — это возможность управления объектом Pawn через контроллер.
Данный Blueprint Class подходит для реализации управляемых объектов: машины, лодки, самолеты, животные, враги и т. д.
Character Blueprint Class
Character (персонаж) — класс, наследуемый от Pawn. Обычно, с помощью него создают главного героя, которым управляет сам игрок.
Класс Character содержит в себе специализированные компоненты UE5 (данные), облегчающие создание человеческих или других «двуногих» персонажей:
- Capsule component (капсульная коллизия) — правила пересечения и столкновения персонажа с другими объектами в мире;
- Skeletal Mesh («скелетал меш», скелетная сетка) — графическое представление персонажа, а также настройка правил его анимации;
- Camera (камера) — «глаза» игрока, с помощью которых он видит окружающий мир;
- Character Movement — настройки движения персонажа (ходьба, бег, прыжки, приседание, плавание, гравитация, сопротивление).
Player Controller
PlayerController (контроллер игрока) — Blueprint Class, наследуемый от класса Controller, который, в свою очередь, наследуется от родительского Actor.
Контроллер игрока управляет объектами Pawn или Character, передавая им от игрока (от клавиатуры, мышки, джойстика) входящие данные для движения (Input Action).
Иначе говоря, это своеобразный интерфейс между Pawn (Character) и игроком, управляющим этими объектами. По сути, представляет волю игрока.
Game Mode
GameModeBase (GameMode, игровой режим) — это Blueprint Class, наследуемый от родительского класса Info, который в свою очередь, наследуется от Actor. Он может устанавливаться как отдельно для каждого уровня, так и для всего проекта Unreal Engine в целом.
Игровой режим — это набор правил и условий игры, по которым она проходит. Он может включает в себя:
- порядок присоединения игроков к игре;
- приостановку игры;
- переход на другой уровень;
- правила подсчёта очков;
- контрольные точки, которые определяют состояние игрового процесса;
- и другие правила игрового мира.
Game Instance
GameInstance (экземпляр игры) наследуется от родительского класса Object и содержит информацию о текущем сеансе игры. Экземпляр этого класса создается при запуске игры и существует до тех пор, пока игра не будет завершена.
Game Instance — это единственный Blueprint Class, который существует на протяжении всей игры, независимо от загрузки и выгрузки игровых уровней. Соответственно, в нем можно сохранять любые данные, которые нужно передать между разными игровыми уровнями.
Player State Blueprint Class
PlayerState (состояние игрока) — класс, наследуемый от родительского класса Info, который в свою очередь, наследуется от Actor.
В сетевой версии игры экземпляры Player States реплицируются и содержат всю необходимую информацию об игроке, относящуюся к сетевой игре.
В целом может содержать любую информацию о состоянии игрока или бота:
- имя игрока;
- количество жизней:
- количество очков;
- состояние здоровья;
- информацию об инвентаре.
Game State
GameStateBase (GameState, состояние игры) — Blueprint Class, наследуемый от родительского класса Info, который в свою очередь, наследуется от Actor.
В основном Game State используется в сетевых играх. Он содержит в себе информацию о подключенных игроках, их очках и других параметрах. И существует как на сервере, так и на каждом отдельном клиенте. Постоянно синхронизируясь между всеми участниками игры, чтобы все игроки имели актуальную информацию о текущей игре.
Blueprint Class Settings — базовые настройки класса
Меню Class Settings открывает настройки класса во вкладке Details, где можно переназначить родительский класс, добавить блюпринт-интерфейс или изменить другие свойства, характерные для конкретного типа класса. Ниже мы разберем основные настройки, общие для всех типов блюпринтов.
Class Options:
- Parent Class — По умолчанию указывает наименование родительского класса. В этом же пункте можно переназначить Parent Class, выбрав любой другой из списка.
Class Options / Advanced:
- Deprecate (bool, по умолчанию False). Помечает текущий класс устаревшим. Deprecate позволяет предотвратить случайное размещение Blueprint и всех его дочерних объектов в игровом мире. Это удобно, если вы хотите сохранить программный код в проекте для ознакомления или архивирования, но при этом исключить возможность его случайного запуска в игровом процессе, что поможет избежать нежелательных ошибок.
- Generate Const Class (bool, по умолчанию False). Пометить текущий класс константным.
- Generate Abstract Class (bool, по умолчанию False). Изменить класс на абстрактный. В результате текущий Blueprint станет непригодным для размещения в игровом мире, так как абстрактные классы предназначены исключительно для наследования логики.
- Should Cook Property Guids? (по умолчанию Inherit). Включение свойств Guid в сборку созданного класса, которая будет конвертирована в формат платформы. Эта опция может привести к увеличению потребления памяти в преобразованной сборке, однако она позволит избежать необходимости добавления данных CoreRedirect для классов Blueprint, хранящихся в архивах SaveGame. Возможные варианты выбора: No (нет, не конвертировать); Yes (да, конвертировать); Inherit (наследовать от родительского класса; если родительского класса нет, то тогда возвращается значение No).
Blueprint Option:
- Run Construction Script on Drag (bool, по умолчанию True). Перезапускать функцию Construction Script не только при перетаскивании объекта на сцену, но и при его перемещении в игровом мире. Если установлено значение False, функция будет активироваться только после того, как Вы отпустите правую кнопку мыши.
- Run Construction Script in Sequencer (bool, по умолчанию False). Непрерывно перезапускать функцию Construction Script в Sequencer.
- Blueprint Display Name (по умолчанию пусто). Позволяет изменить имя, которое отображается для Blueprint в интерфейсе редактора. При этом название самого ассета в Content Drawer останется прежним, а во всех остальных меню и нодах будет отображаться новое переопределенное имя.
- Blueprint Description (по умолчанию пусто). Позволяет задать пользовательское описание текущего ассета. Описание отображается в подсказке Content Drawer при наведении курсора мыши на файл блюпринта.
- Blueprint Namespace (по умолчанию пусто). Позволяет задать пространство имен для текущего Blueprint class.
- Blueprint Category (по умолчанию пусто). Позволяет задать категорию текущего класса.
- Hide Categories — Позволяет задать массив скрытых категорий.
Interfaces:
- Inherited Interfaces — Отображает список унаследованных интерфейсов от родительского класса.
- Implemented Interfaces — Добавление Blueprint Interfaces к текущему классу.
Как создать Blueprint Class
Создать Blueprint Class можно несколькими способами: через контекстное меню в «Content Browser» и непосредственно во вьюпорте игрового мира. Рассмотрим эти варианты подробнее.
Content Browser
В текущей папке Content Browser щелкните правой кнопкой мыши по пустому полю. Откроется контекстное меню. В нем выберите подменю «Blueprint Class».
Далее в открывшемся окне «Pick Parent Class» (выбор родительского класса) выберите нужный родительский блюпринт, на основе которого Вы хотите создать свой. Можно выбрать его из верхнего списка популярных классов или воспользоваться формой поиска. Далее нажмите кнопку «Select» (выбрать), после чего Blueprint Class будет создан в текущей папке Content Browser.
Viewport игрового мира
Если, находясь в игровом мире, Вам нужно добавить определённую логику для простого Actor, то данный объект необходимо изменить на Blueprint Class. Чтобы это сделать, выберите в игровом мире нужный объект. Затем в разделе Details справа нажмите на кнопку «Convert Actor».
В открывшемся окне «Create Blueprint From Selection» (создать блюпринт из выделенного) выберите кнопку «New Subclass» (новый подкласс). Затем введите нужное название для Вашего блюпринта и нажмите на кнопку «Select» (выбрать).
После этого Actor на сцене будет заменен на Ваш созданный блюпринт. А сам файл ассета блюпринта будет находиться в текущей папке Content Browser.
Как в Unreal Engine создать дочерний Blueprint Class
Чтобы создать дочерний блюпринт на основе уже существующего, откройте Content Browser и выберите нужный родительский класс. Затем, нажав на нем правую кнопку мыши, вызовите контекстное меню и выберите пункт «Create Child Blueprint Class» (создать дочерний блюпринт класс). После этого в Content Browser рядом с родительским блупринтом появится и вновь созданный дочерний.
На этом наша статья завершается. Мы рассмотрели, что такое Blueprint class и принципы объектно-ориентированного программирования в Unreal Engine. Кроме того, мы изучили основные родительские классы в движке, на основе которых создаются практически все пользовательские блюпринты.