Что такое блюпринты — и как они работают в Unreal Engine
Разбираем понятие и делаем первые шаги в визуальном программировании в Unreal Engine 5.
Иллюстрация: Оля Ежак для SKillbox Media
Когда-то разработка игр предполагала обязательное знание языков программирования и понимание того, как следует писать код. Людям более творческих профессий было сложно сделать проект, не прибегая к помощи технических специалистов. Сейчас же всё больше игровых движков поддерживают системы визуального программирования. Одна из таких систем — блюпринты в Unreal Engine.
Из этого материала вы узнаете:
- в чём суть блюпринтов и могут ли они заменить C++;
- что собой представляет интерфейс стандартного блюпринта;
- как вывести текст на экран в виде обычной строки и в форме виджета в Unreal Engine 5;
- зачем упорядочивать ноды;
- как сделать простое взаимодействие со статическими и анимированными мешами по нажатию клавиши;
- как настроить вращение статических объектов на уровне (на примере лопастей ветряной мельницы);
- что почитать и посмотреть на тему программирования с помощью блюпринтов.
Общее определение
Блюпринт (от англ. blueprint) — система визуального программирования в UE4 и UE5 на основе нодов с данными: событиями и функциями. В нодах есть слоты (ещё их называют гнёздами или пинами), благодаря которым их можно связывать между собой и формировать элементы геймплея. Обычно они отмечены разными цветами в зависимости от функций, но встречаются и слоты с белыми стрелками, отвечающие за исполнение какой-либо операции.
Различают несколько видов блюпринтов, рассчитанных на определённые задачи — от создания события на уровне до интерфейсов и макросов, которые можно использовать как основу для другого блюпринта.
На практике блюпринт работает следующим образом. Представим, что в сцене есть дверь, которая должна открываться, если с ней взаимодействует игрок. С помощью блюпринта можно установить поворот меша двери на 90° против часовой стрелки и задать условие, что дверь повернётся только в случае, если игрок нажмёт определённую клавишу. А при повторном нажатии меш вернётся в исходное положение. При необходимости эту логику можно настроить для всех размещённых в сцене дверей.
В результате такой вид программирования помогает разработчикам выстроить логику игры без знания языка C++.
Предшественницей блюпринтов считается система Kismet из движка UE3 UDK.
Могут ли блюпринты заменить программирование на С++
И да, и нет. Всё зависит от самого проекта и возможностей разработчика. Кто-то делает игры целиком на C++, другие используют только блюпринты. Иногда применяется комплексный подход: прототип собирают на блюпринтах, а непосредственно сам проект пишут на C++.
В дискуссиях программисты часто упоминают, что проекты на C++ получаются более оптимизированными и в них проще делать отладки. К тому же рефакторинг блюпринтов реализован в несколько раз хуже, что критично для масштабных проектов.
Тем не менее блюпринты — важная составляющая движка, поэтому начинающим пользователям в любом случае стоит ознакомиться с ними.
Интерфейс блюпринтов
В качестве примера рассмотрим стандартный блюпринт персонажа из шаблона Third Person — BP_ThirdPersonCharacter. По умолчанию его можно найти в каталоге ресурсов (Content Browser): All — Содержимое (Content) — Third Person — Blueprints — BP_Third_Person.
Чтобы перейти в редактор текущего блюпринта, дважды кликаем по нему ЛКМ. Редактор откроется в отдельном окне, но для удобства его можно перетащить в виде вкладки в основную рабочую область. Сперва ознакомимся с Окном просмотра (Viewport).
Вьюпорт в редакторе блюпринтов работает по аналогии с обычным вьюпортом сцены Unreal Editor. В разделе Компоненты (Components) в левом верхнем углу показаны все физические элементы, задействованные в текущем блюпринте. В данном случае в списке можно увидеть меш персонажа, его коллизию, направление, привязанную к нему камеру и позицию её ракурса.
Как и во вьюпорте, все эти элементы можно перемещать, вращать, изменять их размер или отдельные свойства на панели Сведения (Details) справа. Например, если выделить меш персонажа и найти пункт Skeletal Mesh Asset, текущую модель можно заменить на другую, которая есть в наличии.
После любых внесённых изменений блюпринту требуется компиляция — для этого есть кнопка Компилировать (Compile). Подробнее эту функцию мы рассмотрим чуть позже, а пока продолжим обзор вьюпорта блюпринта.
Слева, чуть ниже меню Компоненты (Components), находится раздел Моя схема (My Blueprint). В нём представлен список всех скриптов, которые есть в данном блюпринте: Графы (Graphs), Функции (Functions), Макрос (Macros), Переменные (Variables) и Диспетчеры событий (Event Dispatchers), то есть функции с привязкой к определённым событиям. Если кликнуть по одному из компонентов, редактор автоматически покажет его расположение в графе Event Graph.
Последние две вкладки — Construction Script и Event Graph. В Construction Script создают функции для событий, которые происходят до начала игры. Это значит, что здесь можно задать объекту определённые характеристики, чтобы в дальнейшем разместить его в сцене без дополнительных настроек. По умолчанию в нашем блюпринте такие функции не заложены, поэтому граф Construction Script на скриншоте ниже пустой.
Вкладка Event Graph — основное пространство, где происходит сборка узлов. Так как в нём придётся работать чаще всего, рассмотрим функциональность основной панели инструментов подробнее.
- Значок дискеты — сохранение текущего ассета.
- Значок папки с лупой — открытие папки с блюпринтом в каталоге ресурсов.
- Компилировать (Compile) — кнопка, которую часто придётся использовать в работе с блюпринтами, так как любое внесённое изменение требует компиляции. В зависимости от обстоятельств на иконке появляются дополнительные метки:
- жёлтый знак вопроса — в блюпринт внесены изменения, нужна компиляция;
- восклицательный знак — предупреждение о необходимости компиляции;
- знак «стоп» — блюпринт невозможно скомпилировать, нужно внести правки или дополнительные данные;
- зелёная галочка — блюпринт скомпилирован, его можно сохранить.
- Различия (Diff) — проверка соответствия текущей версии блюпринта с предыдущими ревизиями.
- Найти (Find) — поиск функций через строку.
- Скрыть несвязанные (Hide Unrelated) — скрывает все ноды, которые не относятся к выделенному ноду в графе.
- Настройки класса (Class Settings) — вызов панели настроек для выделенного класса.
- Значения класса по умолчанию (Class Defaults) — вызов панели настроек с изначальными данными класса.
- Симуляция (Simulation) — включает симуляцию блюпринтов во вьюпорте.
- Значки проигрывателя работают так же, как и в стандартном вьюпорте Unreal Editor.
Примечание
Интерфейс панели инструментов может отличаться в зависимости от вида блюпринтов. Вид блюпринта всегда обозначен крупным шрифтом в правом нижнем углу графа.
С интерфейсом познакомились, теперь можно приступить к написанию первого блюпринта.
Первые шаги
Для начала соберём простую функцию, которая отобразит приветственную надпись «Hello World». Создадим новый блюпринт с нуля в отдельной папке. Для этого достаточно кликнуть ПКМ в каталоге ресурсов и в появившемся меню выбрать Класс Blueprint (Blueprint Class). Далее нам предложат выбрать класс будущего блюпринта.
Выбираем самый распространённый вариант — Actor. Под акторами в движке подразумеваются любые объекты, которые можно создать в игровом мире, например статические сетки (меши), источники освещения или камеры. Даём название новому блюпринту и открываем его.
По умолчанию в Event Graph заложено три основных события, которые считаются неактивными, пока к ним не начнут присоединять ноды.
- Event BeginPlay — событие, которое запускается на старте игры.
- Event ActionBeginOverlap — событие, взаимодействующее с другим актором, например зона-триггер или препятствие.
- Event Tick — потактовое событие.
Попробуем создать текстовое сообщение, которое будет отображаться на экране сразу после тестового запуска уровня. За вывод текста на экран или в журнал, то есть в логи, отвечают ноды Print Text или Print String. По сути, они выполняют одинаковые функции. Отличие только в том, что текстовую информацию, созданную с помощью Print Text можно локализовать. Удерживая ЛКМ, вытягиваем цепочку из Event BeginPlay и набираем в поиске любой из этих узлов.
Если раскрыть созданный нод, можно установить в нём дополнительные параметры. В поле In Text вводим приветственную фразу.
Компилируем и сохраняем созданный блюпринт. Если запустить проигрыватель сцены сейчас, ничего не произойдёт, потому что нового блюпринта в сцене физически не существует. Перетаскиваем готовый блюпринт из каталога ресурсов в сцену и запускаем демо. Теперь надпись должна появиться на экране — и сразу же исчезнуть, так как Event BeginPlay означает единоразовое событие.
А вот если вернуться в редактор графов и заменить Event BeginPlay на Event Tick, то строка будет появляться в каждом кадре.
При желании можно сделать множество вариаций этого события, модифицируя созданный блюпринт новыми функциями. Например, активировать строку нажатием клавиши, уменьшить интервал появления надписи во время Event Tick или добавить чередование цветов.
Попробуем сделать приветственную надпись на весь экран, которая будет появляться после нажатия клавиши. Создадим новый блюпринт для интерфейса: ПКМ в каталоге ресурсов вызываем меню создания ассетов и находим вкладку Пользовательский интерфейс (User Interface) — Схема создания виджетов (Widget Blueprint). В диалоговом окне выбираем User Widget, позволяющий расширить UI.
Даём виджету название и открываем его. В поисковой строке раздела Палитра (Palette) (в левом верхнем углу) набираем Canvas Panel. Это панель холста, которая подходит для создания виджетов вручную. Перетаскиваем её в область графа. С такой рамкой удобно расположить будущий текст на экране.
Аналогичным способом находим в строке поиска элемент Text. Существуют разные вариации этого элемента, и выбор во многом зависит от функции, которую будет выполнять текст на экране. В данном случае мы выбираем просто Text и переносим его на экран. После этого в углу рамки появится метка, напоминающая цветок.
Она служит своего рода направляющей для определения положения будущего виджета. Нажимая на «лепестки» или центр метки и удерживая Ctrl, можно точно разместить элементы на экране. То же самое выравнивание, но уже автоматическое, можно сделать во вкладке Якоря (Anchors), расположенная в панели Сведения (Details).
Сам текст можно изменить во вкладке Содержимое (Content), а в разделе Внешний вид (Appearance) — скорректировать цвет текста, шрифт и прочие параметры.
После всех манипуляций компилируем и сохраняем новый виджет. Теперь на него нужно сделать ссылку в блюпринте.
В этот раз нам нужно создать функцию, которая будет запускать интерфейс по нажатию кнопки. До версии движка 5.1 в этой операции был задействован раздел Назначение действий (Action Mappings). Его можно найти, перейдя в меню Правка (Edit) — Настройки проекта (Project Settings) — Движок (Engine) — Ввод (Input). Но, начиная с версии 5.1, раздел встретит нас надписью о том, что данные настройки клавиш для проекта устарели.
До версии 5.1 в Unreal Engine практиковалась система назначения клавиш и их применение в качестве действия в графе блюпринтов. Учитывая развитие технологии, нет гарантии, что в будущем эта функция не исчезнет окончательно. Поэтому мы рассмотрим более усовершенствованные системы назначения ввода — Расширенные действия ввода (Enhanced Input Actions) и Контексты назначения ввода (Input Mapping Contexts). В них есть более продвинутые настройки, например способы нажатия клавиш или клавишные комбинации.
ПКМ в каталоге ресурсов вызываем меню, открываем вкладку Ввод (Input) и в ней находим Действие ввода (Input Action). Создаём его. Перед названием желательно добавить префикс IA_ — обычно его используют в разработке для обозначения ресурсов с действиями ввода.
Когда откроете Действие ввода (Input Action), загрузится отдельное окно с настройками. В пункте Action Description можно указать для себя название или описание действия, чтобы не запутаться. Далее идут более тонкие настройки. Например, Trigger when Paused отмечается галочкой в том случае, если мы хотим вызвать будущий виджет, даже когда игра поставлена на паузу. Это может пригодиться разработчикам, которые методом виджета хотят установить в игре меню инвентаря или что-то похожее.
Предположим, что мы хотим вызывать будущий виджет нажатием клавиши E. В графе Triggers кнопкой + создаём Элемент массива (Array elements). Во вкладке Индекс (Index) указываем тип нажатия Pressed — таким образом действие будет активироваться по нажатию клавиши.
Сохраняем настройки и возвращаемся в редактор. Теперь нам необходимо задать клавишу для действия. Для этого нам потребуется ассет Контекста назначения ввода (Input Mapping Contexts), который также находится во вкладке Ввод (Input).
Примечание
Установка нового контекста назначения, представленная ниже, — лишь наглядный пример того, как создать его в пустом проекте или, скажем, сделать дополнительную систему ввода (управление транспортом, плавание и так далее). В игровых шаблонах Unreal Engine уже существует ассет для контекста действий ввода. В Third Person он содержится в файле IMC_Default. С этим ресурсом мы поработаем чуть позже.
Создаём и открываем новый ассет. В разделе Назначения (Mappings) выбираем созданный нами ресурс виджета (в данном случае IA_Widget), а затем назначаем клавишу: сначала нажимаем на кнопку с изображением клавиатуры, а затем — необходимую клавишу (в нашем случае E).
Примечание
Если помимо этого нам необходимо назначить кнопку другой системы ввода, например геймпада, добавляем привязку элемента (кнопка + рядом с названием действия на скриншоте). Появится ещё один пункт. В нём открываем меню рядом с перечнем всех устройств и выбираем тот тип ввода, который нам нужен.
Сохраняем внесённые изменения. Теперь нужно закрепить их в настройках проекта. Заходим в Настройки проекта (Project Settings) и в разделе Движок (Engine) находим Enhanced Input. Нам необходимо добавить созданные нами параметры ввода в Контексты сопоставления по умолчанию (Default Mapping Contexts). Кнопкой + добавляем Элемент массива (Array Element), раскрываем вкладку Индекс (Index) и указываем созданный ранее контекст назначения.
Закрываем окно, теперь можно приступить к настройке блюпринта. Так как у нас уже есть готовая система с персонажем в шаблоне, заходим в блюпринт персонажа, перемещаемся на свободный участок графа и создаём новую цепочку. Нажимаем ПКМ по полю графа и набираем в строке поиска название нашего виджета-блюпринта — в категории Enhanced Action Events высветится соответствующий компонент. Выбираем его, и в графе появится нод будущего действия. Если развернуть его, можно увидеть расширенный перечень слотов, каждый из которых имеет разные свойства.
Наведя на каждый из них, можно прочесть подробное описание их свойств. В данном случае мы выберем Started — то есть событие будет активироваться при нажатии.
От слота Started выводим связь и создаём функцию с виджетом интерфейса — Create Widget, чтобы при нажатии запускался виджет, который мы создавали ранее.
В созданном ноде открываем вкладку Class и находим среди компонентов созданный нами ранее виджет.
Чтобы надпись появилась во вьюпорте, из узла виджета выводим следующий нод — Add to Viewport. На скриншоте ниже можно заметить компонент с похожими свойствами — Add to Player Screen, но в данном случае мы его не выбираем, так как этот вариант практикуется в играх, где нужно вывести содержимое для конкретного игрока, например при разделённом экране.
Слот Return Value у нода с виджетом связываем со слотом Target у нода, отвечающего за отображение во вьюпорте, иначе блюпринт невозможно будет скомпилировать.
Чтобы надпись после выведения на экран со временем исчезла, добавим функцию задержки Delay. В параметре Duration выставим, к примеру, три секунды (3.0). Из нода виджета протянем ещё одну нить для функции Remove from Parent, которая позволит убрать виджет с экрана. Обратите внимание, что Remove from Parent можно протянуть только из гнезда Return Value.
Компилируем и сохраняем наш блюпринт. Запускаем проигрыватель в редакторе и смотрим результат.
Упорядочивание нодов
Любые связки нодов желательно упорядочивать. Во-первых, хаотичные формы связок сложно разобрать при большом объёме данных — в результате область графа приобретает вид, который в профессиональных кругах иронично называют «лапшой». Во-вторых, это негласное правило хорошего тона в программировании блюпринтов: вряд ли коллегам захочется тратить лишнее время на расшифровку узлов.
Рассмотрим, как можно упорядочить ноды в созданной нами связке.
В ней есть два звена, которые входят в один синий слот. Поэтому можно выбрать синюю нить и кликнуть по ней два раза. Появится дополнительное гнездо, которое можно подвинуть, удерживая Ctrl + ЛКМ, и присоединить продублированный нод. А чтобы связка была ровной, создаём дополнительный узел и выравниваем цепочку.
Если нодов в графе слишком много, к каждой связке желательно добавлять комментарии, чтобы избежать путаницы. Для этого нужно выделить все ноды и кликнуть по ним ПКМ. В появившейся вкладке выбираем Создать комментарий для выбранного (Create Comment from Selection) и добавляем описание на панели Сведения (Details) или в самом заголовке окна.
При желании можно даже настроить цвет рамки и фона. На скриншоте ниже основной фон рамки сделан прозрачным (альфа-канал), а сама рамка — серая по аналогии с шаблонными. Цвет можно выбрать в графе Comment Color c помощью цветовой палитры, пипетки или числовых значений.
Текущая схема виджета нам более не понадобится. Её можно просто удалить: выделить все компоненты, нажать ПКМ и выбрать Удалить (Delete) либо Разорвать ссылки узла (Break Node Link (s), чтобы потом при необходимости собрать его заново.
Взаимодействие со статичными объектами
Теперь попробуем создать более комплексный блюпринт — например, пропишем самое простое взаимодействие с объектом: когда игрок подойдёт к нему и нажмёт кнопку, в углу экрана появится текстовое уведомление.
В качестве клавиши взаимодействия мы оставим кнопку E. Создаём новый ресурс Действия ввода (Input Action), называем его IA_Interact и настраиваем по тому же принципу, что и ранее IA_Widget. Но в этот раз мы пропишем его Назначение (Mappings) не в отдельный файл, а в IMC_Default, который содержится в шаблоне по умолчанию. Найти его можно в каталоге ресурсов, воспользовавшись поиском.
Создаём новый Класс Blueprint (Blueprint Class) и в диалоговом окне выбираем Actor. Даём новому блюпринту название. В нашем примере блюпринт назван BP_Interact. Открываем его и переходим во вьюпорт.
В меню Компоненты (Components) нажимаем кнопку + Добавить (+ Add). Здесь нам нужно выбрать цель взаимодействия. Это может быть как новый меш-примитив (по умолчанию в списке доступны Plane, Cube, Sphere), так и статические сетки (меши). Мы возьмём меш синего кубика из сцены: выбираем Static Mesh и в панели Сведения (Details) в одноимённой вкладке находим синий куб (в списке ассетов он обозначен как SM_ChamferCube).
Компилируем, сохраняем и возвращаемся к блюпринту персонажа.
В пустой области схемы нажимаем ПКМ и в поиске набираем название действия ввода, которое мы создали ранее. В данном случае это IA_Interact. После того как название высветилось в категории событий, выбираем его.
Новое действие должно выполняться при трассировке столкновений с заданным объектом, то есть когда объект взаимодействия будет в поле зрения игрока. За это отвечает нод Line Trace By Channel. Выводим его из слота Started предыдущего нода, как мы делали это ранее.
Теперь нам необходимо настроить принцип трассировки. Из слота Start выводим функцию Get World Location (Follow Camera), так как трассировка условной линии соприкосновения исходит от камеры. Из появившегося компонента Follow Camera выводим функцию Get World Rotation, а из него, в свою очередь, выводим нод Get Forward Vector. В настоящий момент схема должна выглядеть следующим образом.
Создаём нод Multiply. Один его слот связываем с гнездом Return Value функции Get Forward Vector, а по второму кликаем ПКМ и преобразовываем в Плавающее значение с одиночной точностью (Float (single- precision).
Этим мы обозначим активацию действия в зависимости от расстояния между объектом и игроком. Так как камера от третьего лица расположена достаточно далеко, пропишем дистанцию в пять метров (500,0). В шаблоне игры от первого лица значение можно сделать меньше (например, 200,0).
Из третьего слота Multiply выводим узел Add из раздела Операторы (Operators). Новый нод связываем с ранее созданным Get World Location и с End в Line Trace By Channel, завершая таким образом цикл трассировки.
Теперь нам необходимо определить, что будет происходить, когда перед игроком окажется объект для взаимодействия. Из основного слота Line Trace By Channel вытягиваем нод Branch — оператор, который даёт логическое разветвление дальнейшего действия на True и False, то есть «Истину» или «Ложь».
При значении True персонаж начнёт взаимодействие с объектом, поэтому из True выводим функцию, которая будет ссылаться на ранее созданный блюпринт, в данном случае это BP_Interact. После набора блюпринта в поисковой строке выбираем Cast to [название блюпринта]. Из полученного нода выводим Print String и указываем текст, который будет отображаться при взаимодействии с будущим кубиком. При необходимости указываем дополнительные параметры, например цвет текста и время отображения.
Далее нам необходимо создать нод Break Hit Result, который связан с коллизиями и непосредственным взаимодействием с объектами. Слот Object у нода Cast to связываем с Hit Actor. А слот Hit связываем с Out Hit у Line Trace By Channel, обеспечивая таким образом трассировку попадания.
Компилируем и сохраняем блюпринт. Размещаем блюпринты BP_Interact с кубиками в сцене и проверяем результат.
Стоит отметить, что этот «рецепт» — самый простой и линейный способ настроить взаимодействие с объектом. Существуют и более сложные подходы, включая использование производных отдельных блюпринтов для более разнообразных вариантов взаимодействия, а также интеграцию виджетов, которые мы часто привыкли видеть в играх. Более подробно о создании блюпринтов для разных типов взаимодействия можно узнать из видеоурока на ютуб-канале JimDublace.
Взаимодействие с анимированными объектами
Теперь рассмотрим, как работает взаимодействие с анимированными объектами — например, настроим возможность открывать сундуки клавишей F. В качестве объекта для взаимодействия мы выбрали анимированную модель сундука от Mauricio Tonelli, которую можно бесплатно скачать с портала Sketchfab. Для начала создадим блюпринт интерфейса: жмём ПКМ в области каталога ресурсов, находим раздел Схемы Blueprints (Blueprints) — Интерфейс Blueprint (Blueprint Interface).
Блюпринты интерфейсов немного отличаются от стандартных. Пока всё, что нам нужно, — это переименовать для удобства текущую функцию: справа в разделе Функции (Functions) кликаем ПКМ по доступной функции, выбираем Переименовать (Rename) и вводим новое название. Компилируем и сохраняем блюпринт.
Загружаем модель и все её составляющие в отдельную папку и при импорте обязательно включаем галочку Import Animations. Если материалы по каким-то причинам не отображаются, их можно быстро настроить путём перемещения готовых текстур в соответствующие слоты шейдеров.
Читайте также:
Разобравшись с импортом, создаём новый Класс Blueprint (Blueprint Class) типа Actor, даём ему название и открываем. В разделе Компоненты (Components) кнопкой + Добавить (+Add) добавляем Skeletal Mesh. По аналогии с синим кубом открываем вкладку Skeletal Mesh Asset на панели Сведения (Details) и находим скелетную сетку сундука. Если модель кажется слишком большой, можно изменить её размер по всем осям в пункте Масштаб (Scale) в Сведениях (Details).
Далее открываем раздел Настройки класса (Class Settings) и в Сведениях (Details) находим параметр Интерфейсы (Interfaces). В пункте Использованные интерфейсы (Implemented Interfaces) нажимаем Добавить (Add) и с помощью поисковой строки выбираем блюпринт интерфейса, созданный ранее.
После этого в разделе Мои схемы (My Blueprint) появится новый интерфейс с названием выбранного блюпринта — BP_Interaction. Компилируем и переходим в Event Graph. Удаляем ноды, которые присутствуют по умолчанию, и создаём событие с функцией из блюпринта интерфейса, обозначенной ранее. В данном случае это Interaction.
Чтобы событие проигрывало анимацию один раз, выбираем нод контроля исполнения Do Once. Далее создаём функцию Play Animation, которая отвечает за проигрыш анимации. Во вкладке New Anim to Play выбираем ассет анимации сундука.
Компилируем блюпринт и переходим в его вьюпорт. Нам нужно создать коллизию сундука. Нажав кнопку + Добавить (+ Add), набираем в поиске Box Collision и подгоняем рамку c помощью настроек Преобразование (Transform) в Сведениях (Details) — так, чтобы сундук находился полностью внутри неё. На всякий случай не забудьте проверить пункт Готовые настройки коллизии (Collision Presets) в настройках коллизии Box: там должен быть выбран параметр OverlapAllDynamic.
Добавим в блюпринт описание — наподобие тех, что встречаются в туториалах. Кнопкой + Добавить (+ Add) добавляем элемент Text Render. Появившуюся надпись размещаем и настраиваем в Сведениях (Details) на своё усмотрение.
Компилируем полученный результат. Теперь прописываем действие ввода клавиши F, как мы делали это для взаимодействия с кубом, и добавляем контекст назначения в уже знакомый нам файл IMC_Default.
Закончив все подготовительные процессы, возвращаемся в блюпринт персонажа, чтобы прописать ему действие — открытие сундука.
Создаём ивент для клавиши F — набираем в поисковой строке действие ввода, в данном случае — IA_Open. Из списка выбираем нод, который относится к Enhanced Action Events. Связываем его с узлом цикла For Each Loop With Break. К слоту Array присоединяем Get Overlapping Actors, тем самым проверяя столкновение с другими акторами. При столкновении у игрока появится возможность взаимодействовать с объектом, в котором заложен интерфейс, поэтому к Array Element присоединяем функцию Does Object Implement Interface. В фиолетовом слоте указываем название блюпринта интерфейса, у нас это BP_Interaction.
От нода For Each Loop with Break выводим уже знакомый нам нод Branch. Из слота True выводим нод и в поисковой строке набираем Message. Нам нужен класс с названием блюпринта взаимодействия (в данном случае Interaction) с припиской Message. Связываем слот Target c Array Element и протягиваем из слота исполнения нить к слоту Break узла For Each Loop With Break, чтобы завершить цикл. Итоговая схема выглядит так.
Компилируем блюпринт. Размещаем блюпринт сундука в сцене. Запускаем проигрыватель и смотрим результат.
Динамическое окружение
Напоследок разберём ещё одну востребованную тему — создание интерактивного окружения на основе блюпринтов при помощи манипуляций со статическими мешами. В частности, как заставить меши вращаться по одной из осей.
В следующем примере мы попробуем «оживить» мельницу — в играх часто встречаются вращающиеся лопасти. Модель возьмём из личного проекта. Если у вас нет подходящего ассета, вы вполне можете отработать этот приём с любым другим статическим мешем, например с доской SM_PillarFrame из набора Starter Content.
Создаём Класс Blueprint (Blueprint Class), в диалоговом окне выбираем Actor. В Компонентах (Components) добавляем два Static Mesh и в Сведениях (Details) назначаем для них ассеты. Один меш послужит основой для будущих лопастей (в нашем случае это меш башни мельницы), а второй как раз будет лопастями.
После загрузки ассетов во вьюпорт размещаем их таким образом, чтобы лопасти располагались на основе и могли вращаться, не задевая её.
Также мы добавим ещё один компонент — RotatingMovement, который обеспечивает вращение. Но если сейчас оставить всё как есть, скомпилировать блюпринт и добавить его в сцену, то у нас будет крутиться на одном месте сама мельница. Чтобы задать вращение только лопастям, необходимо создать схему в Event Graph.
Связку начинаем с нода Event BeginPlay, так как анимация вращения происходит с момента запуска игры. Из него выводим нод Set Updated Component (Rotating Movement) с привязанным по умолчанию компонентом Rotating Movement. Теперь нам нужно задать компонент, к которому будет применяться вращение, — в данном случае это статический меш лопастей. Методом перетаскивания переносим его из меню Компоненты (Components) и присоединяем к слоту New Updated Component.
Теперь зададим направление вращения и скорость. Для этого нам нужно создать переменную. В разделе Переменные (Variables) создаём новую переменную кнопкой + и даём ей название. Нажимаем на вкладку, где по умолчанию стоит Булево значение (Boolean), с красным значком и меняем значение на Rotator (в списке отмечено сиреневым цветом).
Из нода Rotating Movement выводим ещё один нод Set Rotation Rate. Связываем его с узлом Set Updated Component. В слоте с параметрами представлены три слота осей, по которым происходит вращение, и в них можно указать скорость лопастей. Но намного удобнее связать этот слот показателя значений с нодом переменной (её нужно перетащить в граф и при создании отметить Получить (Get).
Теперь выделяем созданный узел переменной и в Сведениях (Details) ставим галочку напротив пункта Редактируемый экземпляр (Instance Editable). За счёт этого мы теперь сможем регулировать параметры блюпринта сразу в редакторе в панели Сведения (Details).
Компилируем, сохраняем блюпринт, размещаем его в сцене. В Сведениях (Details) появится параметр с названием переменной, через который можно откорректировать направление и скорость движения объекта по оси. В текущем примере лопасти в проекте расположены вертикально, поэтому значение скорости указано в пункте оси Y.
Теперь можно запустить симуляцию и проверить результат.
Итог
Начинающий пользователь вполне может освоить программирование на блюпринтах. Один из главных залогов успеха в изучении — понимание логики построения связок нодов. Знание английского тоже не помешает: так будет проще найти нужную функцию, набрав её в поиске.
Как и любое программирование, блюпринты требуют хорошей теоретической базы. Помните, что большинство функций перешло из предыдущей версии движка, поэтому изучение блюпринтов на Unreal Engine 4 станет хорошим подспорьем в визуальном программировании на Unreal Engine 5.
А напоследок оставим несколько ресурсов, которые помогут вам в дальнейшем изучении блюпринтов:
- Официальная документация Unreal Engine.
- Уроки по блюпринтам от канала Smart Poly — подойдут как для новичков, так и для продвинутых пользователей.
- Руководство на Habr, посвящённое созданию игры по сбору объектов на UE4.
- Экспресс-курс о создании игры на UE4 и UE5 с помощью блюпринтов от канала Cyberstars. Также на этом канале можно найти много полезной информации по изучению движка.
- Плейлист с туториалами по созданию множества действий, актуальных для игр на Unreal Engine 5, от канала Gorka Games.