🎮 Как использовать Blueprint для быстрого прототипирования игр на Unreal Engine 4?
UE4 C++ Developer. Currently working with Flying Wild Hog on Space Punks title. Author of articles on C++, GameDev, Unreal Engine and general programming Изучение Blueprint – лучший вариант быстрого старта в Unreal Engine. Статья проведёт читателей по основам Blueprint, расскажет о его применении и даст несколько советов по поводу баланса между C++ и BP. Предполагается, что читатель уже базово знаком с Unreal Engine 4: умеет создавать проекты, приблизительно знает, где в интерфейсе что находится, а также имеет представление об основных концепциях движка. Также предполагается, что читатель знаком с программированием на любом императивном языке и имеет опыт работы с отладчиком (вне зависимости от языка программирования и IDE). Примечание В статье используется UE 4.27.1. Под Blueprint (BP) могут подразумевать две связанные, но всё-таки разные вещи: систему визуального программирования и созданные с помощью этой системы объекты. Суть этой системы заключается в программировании игровой логики посредством основанного на графах скриптового языка. Пример графа Blueprint Как и многие подобные языки, он позволяет создавать классы и их экземпляры (объекты), которые зачастую называют просто блюпринтами. Больше полезной информации вы найдёте на нашем телеграм-канале «Библиотека программиста». Интересно, перейти к каналу Как ни странно, Blueprint нужен не только для программирования акторов (игровых объектов) и подобных игровых вещей. Приведём несколько примеров использования этого инструмента: Если мы говорим про систему визуальной разработки, основным её преимуществом является возможность дать всю мощь программирования в руки не-программистов: гейм-дизайнеров, левел-дизайнеров, нарративных дизайнеров и любых других что-угодно-дизайнеров. Фактически это основа философии и причина добавления системы в движок: позволить всей команде работать на равных условиях. Если же говорить о BP имея в виду классы и экземпляры классов, то их главным преимуществом является, пожалуй, возможность визуального создания игровых объектов: расположение различных компонентов (компонент – обособленная функциональность, предназначенная для переиспользования) в пространстве, а также их настройка прямо из редактора. Это аналогичная упомянутой в предыдущем абзаце идея, только касающаяся не логики, а данных – настроек компонентов. Для создания BP-классов существует несколько путей, но основной – сделать т.н. ассет Blueprint из панели Content Browser. Необходимо щёлкнуть правой кнопкой мыши в Content Browser и выбрать Blueprint Class: Создание BP-класса На следующем шаге необходимо выбрать базовый класс для создаваемого: Выбор базового класса По двойному щелчку на созданном классе будет открыт редактор BP. Остановимся на нём (на скриншоте ниже создан BP-класс, наследник класса Actor): Редактор BP Создадим унаследованный от Actor BP-класс, назовём его Bulb и с помощью кнопки “Add Component” добавим в него точечный источник света ( Добавление компонента Создадим простую сцену, на которой расположим выполняющий роль пола куб, а посередине – наш актор: Тестовая сцена Запустим проект и убедимся, что куб освещён скучным белым светом: Скучный белый свет Вернёмся к нашему BP и с помощью кнопки “+ Variable” создадим новую переменную, используя которую будет можно задать цвет источника света. Назовём её Добавление переменной Настройки переменной Выберем тип “Linear Color” и установим флаг “Instance Editable”. Этот флаг позволит задавать значение переменной для каждого экземпляра класса. Данные есть, теперь к логике. Перейдём в “Event Graph” к событию Событие Отпустим левую кнопку мыши – тут же появится окно выбора функции. Снимем флаг “Context Sensitive” (без него редактор предложит все возможные функции, а не только те, которые укладываются в текущий контекст) и найдём функцию Панель выбора действия Должно получиться так: Установка цвета на срабатывании Белая линия означает порядок выполнения. Иначе говоря, белая линия – это возможный путь передачи управления из одной BP-ноды (узла BP-графа) в другую. Цветные пины (pin) означают входные данные/выходные данные. Как видно на скриншоте, Выбор между геттером и сеттером Нас интересует получение компонента, а не его перезапись, поэтому выбираем Передача значения После изменения BP его необходимо скомпилировать. Для этого есть специальная кнопка на панели инструментов в верхней части редактора. Тулбар BP-редактора. Кнопка для компиляции – крайняя слева При успешной компиляции кнопка будет гореть зелёным: Индикатор успешной компиляции Перейдем к редактору уровня, выделим наш актор и обратимся к панели “Details”: Свойства актора В разделе “Default” можно видеть созданную нами переменную Нескучный голубой цвет Примечание Того же эффекта можно было добиться, отредактировав соответствующее поле Point Light компонента в настройках находящегося на уровне экземпляра, но мы здесь вообще-то блюпринты изучаем. Вернёмся к переменной Выбор модификации переменной: одиночное значение, массив, множество и карта/словарь (map) Вероятно, редактор попросит вас подтвердить: действительно ли вы хотите изменить тип переменной: смело отвечайте “Да”. После этого ваш граф сломается: Граф сломался Чтобы это исправить, удалите ноду с Помимо массива и отдельной переменной имеется множество (Set) и карта (Map). Теперь когда мы можем задавать несколько цветов: давайте сделаем так, чтобы источник света менял цвет каждую секунду на следующий из массива Создадим новую переменную Значение переменной по умолчанию Создадим такую конструкцию: Мне надо подписать картинку, но я сам не знаю, что здесь происходит Непонятно? Позвольте объяснить. Главная нода, на которую стоит обратить внимание – Branch, представляющая собой обыкновенный if. На входе – булево значение, выходы – это передача управления либо по одному пути, либо по другому. Булево значение является результатом строгого сравнения значения Правая часть блюпринта В случае, если элементы в массиве ещё не закончились, взять текущий и установить цвет источника света равный этому элементу, подождать одну секунду, увеличить Итоговый блюпринт целиком Добавим цветов в находящийся на уровне актор: Массив цветов внутри нашего актора Запустив игру, проверим результат. Конструкцию выше можно с легкостью заменить на встроенный в BP цикл Встроенная в BP нода-цикл На вход ноде цикла приходит контейнер для перебора, на выходе два пина для передачи управления – тело цикла и завершение цикла, а также два пина данных – текущий элемент и индекс текущего элемента. Запустим и убедимся, что всё работает. Ничего не работает? У меня тоже. Это старый баг движка (или фича – уже никто не знает). Примечание Варианты обхода этого бага Для возможности визуального отслеживания результатов работы нашего BP, вернём вариант с Создание новой функции В панели “Details” добавим параметр для функции с именем Создание нового параметра функции Заметьте, для новой функции в рабочей области BP-редактора появилась новая вкладка. Перенесём туда вызов функции Функция Set Color Заменим оба вызова Обновлённый блюпринт Запустим проект и убедимся, что всё работает, как и работало. В редакторе имеется встроенный отладчик, позволяющий устанавливать точки останова и просматривать значение переменных в BP прямо во время выполнения. Поставим точку останова на вызове Брейкпоинт на BP-ноде При запуске игры выполнение остановится на этой ноде, и вы сможете просмотреть значения переменных или, например, пошагово пройтись по следующим нодам. Сработавший брейкпоинт Для управления выполнением в режиме отладки в верхней части редактора имеется множество кнопок, значение большинства из которых должно знакомо любому знакомому с отладчиками программисту: Тулбар дебаггера Какую часть проекта стоит реализовать в Blueprint, а какую – написать на C++? Здесь нет однозначных ответов: они варьируются от проекта к проекту, однако есть несколько рекомендаций. Для начала сравним C++ и Blueprint. В двух словах: C++ лучше использовать для core-функциональности, в то время как BP – для чего-либо специфичного для отдельно-взятого уровня или зависимого от другого контента. Ещё один вариант, когда BP предпочтительней – это нередкий случай, в котором необходимо создать содержащий несколько компонентов объект, особенно если расположение этих компонентов в пространстве важно. Объекты такого рода гораздо удобнее создавать/изменять в редакторе, с чем и связана рекомендация реализовывать их через BP. Для команды из одного человека и небольшого проекта вполне приемлемо использовать только BP. Использование же только C++ (в любом проекте) вряд ли является обоснованным решением. Бесплатные курсы по BP от Epic Games Официальный портал от Epic Games предлагает не только курсы по BP, однако мы рекомендуем в первую очередь пройти этот. Он содержит обзор BP-составляющей движка, философии и идей стоящих за BP, а также немалое количество советов из разряда “я бы хотел, чтобы мне сказали это, когда я начинал”. Blueprint – система визуального программирования в UE, призванная увеличить количество участников команды, способных самостоятельно создавать игровую логику. Блюпринтами также называют определённые через эту систему классы. BP поддерживает все фичи обычных языков программирования: переменные, функции, операторы ветвления, циклы. В редакторе UE имеется встроенный отладчик BP. Перед началом проекта стоит серьезно задуматься о балансе между C++ и BP, которого стоит придерживаться. *** Несмотря на кажущуюся простоту BP – система с большим количеством тонкостей, в особенности если смешивать её с C++. Полное изучение всех особенностей работы с BP может занять время. Удачи в обучении! wcobalt
Что нужно знать перед прочтением этой статьи?
Что такое Blueprint?
Для чего нужен Blueprint?
Какова польза от Blueprint?
Обзор редактора Blueprint и создание класса
Переменные в Blueprint
Point Light Component
):LightColor
, выделим в секции “Variables” панели “My Blueprint” и переключимся на панель “Details”, где будут отображены настройки переменной:BeginPlay
. Это событие запустится, когда актор будет добавлен (заспаунен) на уровень. Потянем левой кнопкой мыши за отмеченный сиреневым элемент:BeginPlay
Set Light Color
компонента Point Light Component
:BeginPlay
Set Light Color
ожидает три значения на входе:Point Light Component
. Перетянем его зажатой левой кнопкой мыши из секции “Variables” панели “My Blueprint”. После отпускания кнопки мыши, появится выбор:Get PointLight
. Соединим выходной пин создавшейся ноды с входным пином Target
ноды-вызова Set Light Color
:PointLight
в функцию New Light Color
– новый цвет для источника света. Его необходимо взять из созданной нами переменной LightColor
. Для закрепления проделайте это сами.sRGB
– булев флаг. Значение задано на самой ноде: флаг отмечен – значение истино, снят – ложно.Light Color
. Нажмем на квадратно-чёрную её часть и выберем какой-нибудь цвет. Запустим проект и убедимся, что источник света изменил цвет:Операторы ветвления
LightColor
и сделаем из неё массив. Для этого необходимо нажать на иконку справа от типа переменной и выбрать иконку с квадратами три на три:LightColor
и перекомпилируйте BP.PointLight
, а по завершении выключался.CurrentColorIndex
типа Integer
, скомпилируем BP и зададим переменной значение по умолчанию – 0
:CurrentColorIndex
и размера массива LightColor
. Внимательный читатель догадывается к чему идёт дело: к наивной реализации цикла.CurrentColorIndex
на один и перейти обратно к условию. Если элементы закончились, установить цвет в чёрный и завершить выполнение.Циклы
For Each
:Delay
внутри For each
игнорируется, поэтому цикл выполняется настолько быстро, что становится невозможным заметить реальную смену цвета, а лишь только черный экран.Функции
Branch
. В секции “Functions” панели “My Blueprint” создадим новую функцию SetColor
:NewColor
и типом Linear Color
:SetLightColor
на компоненте Point Light:Set Light Color
в Event Graph на вызов нашей функции:Отладка Blueprint
Set Light Color
в функции Set Color
. Для этого кликните по ноде правой кнопкой мыши и выберите “Add Breakpoint”:Баланс между C++ и Blueprint
C++
Blueprint
Вывод
- 8 views
- 0 Comment