0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>15 ноя 2024</li>
2
<ul><li>15 ноя 2024</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Разбираем понятие и делаем первые шаги в визуальном программировании в Unreal Engine 5.</p>
4
</ul><p>Разбираем понятие и делаем первые шаги в визуальном программировании в Unreal Engine 5.</p>
5
<p>Иллюстрация: Оля Ежак для SKillbox Media</p>
5
<p>Иллюстрация: Оля Ежак для SKillbox Media</p>
6
<p>Считает игры произведениями искусства и старается донести эту идею до широких масс. В свободное время стримит, рисует и часами зависает в фоторежимах.</p>
6
<p>Считает игры произведениями искусства и старается донести эту идею до широких масс. В свободное время стримит, рисует и часами зависает в фоторежимах.</p>
7
<p>Когда-то разработка игр предполагала обязательное знание языков программирования и понимание того, как следует писать код. Людям более творческих профессий было сложно сделать проект, не прибегая к помощи технических специалистов. Сейчас же всё больше игровых движков поддерживают системы визуального программирования. Одна из таких систем - блюпринты в Unreal Engine.</p>
7
<p>Когда-то разработка игр предполагала обязательное знание языков программирования и понимание того, как следует писать код. Людям более творческих профессий было сложно сделать проект, не прибегая к помощи технических специалистов. Сейчас же всё больше игровых движков поддерживают системы визуального программирования. Одна из таких систем - блюпринты в Unreal Engine.</p>
8
<p>Из этого материала вы узнаете:</p>
8
<p>Из этого материала вы узнаете:</p>
9
<ul><li>в чём суть<a>блюпринтов</a>и могут ли они<a>заменить C++</a>;</li>
9
<ul><li>в чём суть<a>блюпринтов</a>и могут ли они<a>заменить C++</a>;</li>
10
<li>что собой представляет<a>интерфейс</a>стандартного блюпринта;</li>
10
<li>что собой представляет<a>интерфейс</a>стандартного блюпринта;</li>
11
<li>как вывести текст на экран в виде<a>обычной строки</a>и в форме<a>виджета</a>в Unreal Engine 5;</li>
11
<li>как вывести текст на экран в виде<a>обычной строки</a>и в форме<a>виджета</a>в Unreal Engine 5;</li>
12
<li>зачем<a>упорядочивать</a>ноды;</li>
12
<li>зачем<a>упорядочивать</a>ноды;</li>
13
<li>как сделать простое взаимодействие со <a>статическими</a>и <a>анимированными</a>мешами по нажатию клавиши;</li>
13
<li>как сделать простое взаимодействие со <a>статическими</a>и <a>анимированными</a>мешами по нажатию клавиши;</li>
14
<li>как настроить<a>вращение</a>статических объектов на уровне (на примере лопастей ветряной мельницы);</li>
14
<li>как настроить<a>вращение</a>статических объектов на уровне (на примере лопастей ветряной мельницы);</li>
15
<li>что<a>почитать и посмотреть</a>на тему программирования с помощью блюпринтов.</li>
15
<li>что<a>почитать и посмотреть</a>на тему программирования с помощью блюпринтов.</li>
16
</ul><p>Блюпринт (от англ. blueprint) - система визуального программирования в UE4 и UE5 на основе нодов с данными: событиями и функциями. В нодах есть слоты (ещё их называют гнёздами или пинами), благодаря которым их можно связывать между собой и формировать элементы геймплея. Обычно они отмечены разными цветами в зависимости от функций, но встречаются и слоты с белыми стрелками, отвечающие за исполнение какой-либо операции.</p>
16
</ul><p>Блюпринт (от англ. blueprint) - система визуального программирования в UE4 и UE5 на основе нодов с данными: событиями и функциями. В нодах есть слоты (ещё их называют гнёздами или пинами), благодаря которым их можно связывать между собой и формировать элементы геймплея. Обычно они отмечены разными цветами в зависимости от функций, но встречаются и слоты с белыми стрелками, отвечающие за исполнение какой-либо операции.</p>
17
<p>Различают несколько<a>видов</a>блюпринтов, рассчитанных на определённые задачи - от создания события на уровне до интерфейсов и макросов, которые можно использовать как основу для другого блюпринта.</p>
17
<p>Различают несколько<a>видов</a>блюпринтов, рассчитанных на определённые задачи - от создания события на уровне до интерфейсов и макросов, которые можно использовать как основу для другого блюпринта.</p>
18
<p>На практике блюпринт работает следующим образом. Представим, что в сцене есть дверь, которая должна открываться, если с ней взаимодействует игрок. С помощью блюпринта можно установить поворот меша двери на 90° против часовой стрелки и задать условие, что дверь повернётся только в случае, если игрок нажмёт определённую клавишу. А при повторном нажатии меш вернётся в исходное положение. При необходимости эту логику можно настроить для всех размещённых в сцене дверей.</p>
18
<p>На практике блюпринт работает следующим образом. Представим, что в сцене есть дверь, которая должна открываться, если с ней взаимодействует игрок. С помощью блюпринта можно установить поворот меша двери на 90° против часовой стрелки и задать условие, что дверь повернётся только в случае, если игрок нажмёт определённую клавишу. А при повторном нажатии меш вернётся в исходное положение. При необходимости эту логику можно настроить для всех размещённых в сцене дверей.</p>
19
<p>В результате такой вид программирования помогает разработчикам выстроить логику игры без знания языка C++.</p>
19
<p>В результате такой вид программирования помогает разработчикам выстроить логику игры без знания языка C++.</p>
20
<p>Предшественницей блюпринтов считается система Kismet из движка UE3 UDK.</p>
20
<p>Предшественницей блюпринтов считается система Kismet из движка UE3 UDK.</p>
21
Вид системы нодов Kismet в Unreal Engine 3<a><em>Скриншот</em></a><em>: Unreal Engine 3 UDK / Epic Games</em><p>И да, и нет. Всё зависит от самого проекта и возможностей разработчика. Кто-то делает игры целиком на C++, другие используют только блюпринты. Иногда применяется комплексный подход: прототип собирают на блюпринтах, а непосредственно сам проект пишут на C++.</p>
21
Вид системы нодов Kismet в Unreal Engine 3<a><em>Скриншот</em></a><em>: Unreal Engine 3 UDK / Epic Games</em><p>И да, и нет. Всё зависит от самого проекта и возможностей разработчика. Кто-то делает игры целиком на C++, другие используют только блюпринты. Иногда применяется комплексный подход: прототип собирают на блюпринтах, а непосредственно сам проект пишут на C++.</p>
22
<p>В дискуссиях программисты часто<a>упоминают</a>, что проекты на C++ получаются более оптимизированными и в них проще делать отладки. К тому же рефакторинг блюпринтов реализован в несколько раз хуже, что критично для масштабных проектов.</p>
22
<p>В дискуссиях программисты часто<a>упоминают</a>, что проекты на C++ получаются более оптимизированными и в них проще делать отладки. К тому же рефакторинг блюпринтов реализован в несколько раз хуже, что критично для масштабных проектов.</p>
23
<p>Тем не менее блюпринты - важная составляющая движка, поэтому начинающим пользователям в любом случае стоит ознакомиться с ними.</p>
23
<p>Тем не менее блюпринты - важная составляющая движка, поэтому начинающим пользователям в любом случае стоит ознакомиться с ними.</p>
24
<p>В качестве примера рассмотрим стандартный блюпринт персонажа из шаблона<strong>Third Person</strong> -<strong>BP_ThirdPersonCharacter</strong>. По умолчанию его можно найти в каталоге ресурсов (Content Browser):<strong>All</strong> -<strong>Содержимое</strong>(Content) -<strong>Third Person</strong> -<strong>Blueprints</strong> -<strong>BP_Third_Person</strong>.</p>
24
<p>В качестве примера рассмотрим стандартный блюпринт персонажа из шаблона<strong>Third Person</strong> -<strong>BP_ThirdPersonCharacter</strong>. По умолчанию его можно найти в каталоге ресурсов (Content Browser):<strong>All</strong> -<strong>Содержимое</strong>(Content) -<strong>Third Person</strong> -<strong>Blueprints</strong> -<strong>BP_Third_Person</strong>.</p>
25
Файл с блюпринтом персонажа Third Person в каталоге ресурсов<em>Скриншот: Unreal Editor / Epic Games</em><p>Чтобы перейти в редактор текущего блюпринта, дважды кликаем по нему<strong>ЛКМ</strong>. Редактор откроется в отдельном окне, но для удобства его можно<a>перетащить</a>в виде вкладки в основную рабочую область. Сперва ознакомимся с <strong>Окном просмотра</strong>(Viewport).</p>
25
Файл с блюпринтом персонажа Third Person в каталоге ресурсов<em>Скриншот: Unreal Editor / Epic Games</em><p>Чтобы перейти в редактор текущего блюпринта, дважды кликаем по нему<strong>ЛКМ</strong>. Редактор откроется в отдельном окне, но для удобства его можно<a>перетащить</a>в виде вкладки в основную рабочую область. Сперва ознакомимся с <strong>Окном просмотра</strong>(Viewport).</p>
26
<em>Скриншот: Unreal Editor / Epic Games</em><p>Вьюпорт в редакторе блюпринтов работает по аналогии с обычным вьюпортом сцены Unreal Editor. В разделе<strong>Компоненты</strong>(Components) в левом верхнем углу показаны все физические элементы, задействованные в текущем блюпринте. В данном случае в списке можно увидеть меш персонажа, его коллизию, направление, привязанную к нему камеру и позицию её ракурса.</p>
26
<em>Скриншот: Unreal Editor / Epic Games</em><p>Вьюпорт в редакторе блюпринтов работает по аналогии с обычным вьюпортом сцены Unreal Editor. В разделе<strong>Компоненты</strong>(Components) в левом верхнем углу показаны все физические элементы, задействованные в текущем блюпринте. В данном случае в списке можно увидеть меш персонажа, его коллизию, направление, привязанную к нему камеру и позицию её ракурса.</p>
27
<p>Как и во вьюпорте, все эти элементы можно перемещать, вращать, изменять их размер или отдельные свойства на панели<strong>Сведения</strong>(Details) справа. Например, если выделить меш персонажа и найти пункт<strong>Skeletal Mesh Asset</strong>, текущую модель можно заменить на другую, которая есть в наличии.</p>
27
<p>Как и во вьюпорте, все эти элементы можно перемещать, вращать, изменять их размер или отдельные свойства на панели<strong>Сведения</strong>(Details) справа. Например, если выделить меш персонажа и найти пункт<strong>Skeletal Mesh Asset</strong>, текущую модель можно заменить на другую, которая есть в наличии.</p>
28
Замена женской версии стандартного манекена на мужскую<em>Unreal Editor / Epic Games</em><p>После любых внесённых изменений блюпринту требуется компиляция - для этого есть кнопка<strong>Компилировать</strong>(Compile). Подробнее эту функцию мы рассмотрим чуть позже, а пока продолжим обзор вьюпорта блюпринта.</p>
28
Замена женской версии стандартного манекена на мужскую<em>Unreal Editor / Epic Games</em><p>После любых внесённых изменений блюпринту требуется компиляция - для этого есть кнопка<strong>Компилировать</strong>(Compile). Подробнее эту функцию мы рассмотрим чуть позже, а пока продолжим обзор вьюпорта блюпринта.</p>
29
<p>Слева, чуть ниже меню<strong>Компоненты</strong>(Components), находится раздел<strong>Моя схема</strong>(My Blueprint). В нём представлен список всех скриптов, которые есть в данном блюпринте:<strong>Графы</strong>(Graphs),<strong>Функции</strong>(Functions),<strong>Макрос</strong>(Macros),<strong>Переменные</strong>(Variables) и <strong>Диспетчеры событий</strong>(Event Dispatchers), то есть функции с привязкой к определённым событиям. Если кликнуть по одному из компонентов, редактор автоматически покажет его расположение в графе<strong>Event Graph</strong>.</p>
29
<p>Слева, чуть ниже меню<strong>Компоненты</strong>(Components), находится раздел<strong>Моя схема</strong>(My Blueprint). В нём представлен список всех скриптов, которые есть в данном блюпринте:<strong>Графы</strong>(Graphs),<strong>Функции</strong>(Functions),<strong>Макрос</strong>(Macros),<strong>Переменные</strong>(Variables) и <strong>Диспетчеры событий</strong>(Event Dispatchers), то есть функции с привязкой к определённым событиям. Если кликнуть по одному из компонентов, редактор автоматически покажет его расположение в графе<strong>Event Graph</strong>.</p>
30
Быстрый переход в граф<em>Unreal Editor / Epic Games</em><p>Последние две вкладки -<strong>Construction Script</strong>и <strong>Event Graph</strong>. В <strong>Construction Script</strong>создают функции для событий, которые происходят<strong>до</strong>начала игры. Это значит, что здесь можно задать объекту определённые характеристики, чтобы в дальнейшем разместить его в сцене без дополнительных настроек. По умолчанию в нашем блюпринте такие функции не заложены, поэтому граф<strong>Construction Script</strong>на скриншоте ниже пустой.</p>
30
Быстрый переход в граф<em>Unreal Editor / Epic Games</em><p>Последние две вкладки -<strong>Construction Script</strong>и <strong>Event Graph</strong>. В <strong>Construction Script</strong>создают функции для событий, которые происходят<strong>до</strong>начала игры. Это значит, что здесь можно задать объекту определённые характеристики, чтобы в дальнейшем разместить его в сцене без дополнительных настроек. По умолчанию в нашем блюпринте такие функции не заложены, поэтому граф<strong>Construction Script</strong>на скриншоте ниже пустой.</p>
31
Вкладка Construction Script<em>Скриншот: Unreal Editor / Epic Games</em><p>Вкладка<strong>Event Graph</strong> - основное пространство, где происходит сборка узлов. Так как в нём придётся работать чаще всего, рассмотрим функциональность основной панели инструментов подробнее.</p>
31
Вкладка Construction Script<em>Скриншот: Unreal Editor / Epic Games</em><p>Вкладка<strong>Event Graph</strong> - основное пространство, где происходит сборка узлов. Так как в нём придётся работать чаще всего, рассмотрим функциональность основной панели инструментов подробнее.</p>
32
Event Graph в редакторе блюпринтов. Белой рамкой выделена панель инструментов<em>Скриншот: Unreal Editor / Epic Games</em><ul><li><strong>Значок дискеты</strong> - сохранение текущего ассета.</li>
32
Event Graph в редакторе блюпринтов. Белой рамкой выделена панель инструментов<em>Скриншот: Unreal Editor / Epic Games</em><ul><li><strong>Значок дискеты</strong> - сохранение текущего ассета.</li>
33
<li><strong>Значок папки с лупой</strong> - открытие папки с блюпринтом в каталоге ресурсов.</li>
33
<li><strong>Значок папки с лупой</strong> - открытие папки с блюпринтом в каталоге ресурсов.</li>
34
<li><strong>Компилировать</strong>(Compile)<strong></strong>- кнопка, которую часто придётся использовать в работе с блюпринтами, так как любое внесённое изменение требует компиляции. В зависимости от обстоятельств на иконке появляются дополнительные метки:</li>
34
<li><strong>Компилировать</strong>(Compile)<strong></strong>- кнопка, которую часто придётся использовать в работе с блюпринтами, так как любое внесённое изменение требует компиляции. В зависимости от обстоятельств на иконке появляются дополнительные метки:</li>
35
</ul><ul><li><strong>жёлтый знак вопроса</strong> - в блюпринт внесены изменения, нужна компиляция;</li>
35
</ul><ul><li><strong>жёлтый знак вопроса</strong> - в блюпринт внесены изменения, нужна компиляция;</li>
36
<li><strong>восклицательный знак</strong> - предупреждение о необходимости компиляции;</li>
36
<li><strong>восклицательный знак</strong> - предупреждение о необходимости компиляции;</li>
37
<li><strong>знак "стоп"</strong>- блюпринт невозможно скомпилировать, нужно внести правки или дополнительные данные;</li>
37
<li><strong>знак "стоп"</strong>- блюпринт невозможно скомпилировать, нужно внести правки или дополнительные данные;</li>
38
<li><strong>зелёная галочка</strong> - блюпринт скомпилирован, его можно сохранить.</li>
38
<li><strong>зелёная галочка</strong> - блюпринт скомпилирован, его можно сохранить.</li>
39
</ul><ul><li><strong>Различия</strong>(Diff) - проверка соответствия текущей версии блюпринта с предыдущими ревизиями.</li>
39
</ul><ul><li><strong>Различия</strong>(Diff) - проверка соответствия текущей версии блюпринта с предыдущими ревизиями.</li>
40
<li><strong>Найти</strong>(Find) - поиск функций через строку.</li>
40
<li><strong>Найти</strong>(Find) - поиск функций через строку.</li>
41
<li><strong>Скрыть несвязанные</strong>(Hide Unrelated) - скрывает все ноды, которые не относятся к выделенному ноду в графе.</li>
41
<li><strong>Скрыть несвязанные</strong>(Hide Unrelated) - скрывает все ноды, которые не относятся к выделенному ноду в графе.</li>
42
<li><strong>Настройки класса</strong>(Class Settings) - вызов панели настроек для выделенного класса.</li>
42
<li><strong>Настройки класса</strong>(Class Settings) - вызов панели настроек для выделенного класса.</li>
43
<li><strong>Значения класса по умолчанию</strong>(Class Defaults) - вызов панели настроек с изначальными данными класса.</li>
43
<li><strong>Значения класса по умолчанию</strong>(Class Defaults) - вызов панели настроек с изначальными данными класса.</li>
44
<li><strong>Симуляция</strong>(Simulation) - включает симуляцию блюпринтов во вьюпорте.</li>
44
<li><strong>Симуляция</strong>(Simulation) - включает симуляцию блюпринтов во вьюпорте.</li>
45
<li>Значки проигрывателя работают так же, как и в стандартном вьюпорте Unreal Editor.</li>
45
<li>Значки проигрывателя работают так же, как и в стандартном вьюпорте Unreal Editor.</li>
46
</ul><p><strong>Примечание</strong></p>
46
</ul><p><strong>Примечание</strong></p>
47
<p>Интерфейс панели инструментов может<a>отличаться</a>в зависимости от вида блюпринтов. Вид блюпринта всегда обозначен крупным шрифтом в правом нижнем углу графа.</p>
47
<p>Интерфейс панели инструментов может<a>отличаться</a>в зависимости от вида блюпринтов. Вид блюпринта всегда обозначен крупным шрифтом в правом нижнем углу графа.</p>
48
<p>С интерфейсом познакомились, теперь можно приступить к написанию первого блюпринта.</p>
48
<p>С интерфейсом познакомились, теперь можно приступить к написанию первого блюпринта.</p>
49
<p>Для начала соберём простую функцию, которая отобразит приветственную надпись "Hello World". Создадим новый блюпринт с нуля в отдельной папке. Для этого достаточно кликнуть<strong>ПКМ</strong>в каталоге ресурсов и в появившемся меню выбрать<strong>Класс Blueprint</strong>(Blueprint Class). Далее нам предложат выбрать класс будущего блюпринта.</p>
49
<p>Для начала соберём простую функцию, которая отобразит приветственную надпись "Hello World". Создадим новый блюпринт с нуля в отдельной папке. Для этого достаточно кликнуть<strong>ПКМ</strong>в каталоге ресурсов и в появившемся меню выбрать<strong>Класс Blueprint</strong>(Blueprint Class). Далее нам предложат выбрать класс будущего блюпринта.</p>
50
Выбор класса блюпринта<em>Скриншот: Unreal Editor / Epic Games</em><p>Выбираем самый распространённый вариант -<strong>Actor</strong>. Под акторами в движке подразумеваются любые объекты, которые можно создать в игровом мире, например статические сетки (меши), источники освещения или камеры. Даём название новому блюпринту и открываем его.</p>
50
Выбор класса блюпринта<em>Скриншот: Unreal Editor / Epic Games</em><p>Выбираем самый распространённый вариант -<strong>Actor</strong>. Под акторами в движке подразумеваются любые объекты, которые можно создать в игровом мире, например статические сетки (меши), источники освещения или камеры. Даём название новому блюпринту и открываем его.</p>
51
<p>По умолчанию в <strong>Event Graph</strong>заложено три основных события, которые считаются неактивными, пока к ним не начнут присоединять ноды.</p>
51
<p>По умолчанию в <strong>Event Graph</strong>заложено три основных события, которые считаются неактивными, пока к ним не начнут присоединять ноды.</p>
52
<ul><li><strong>Event BeginPlay</strong> - событие, которое запускается на старте игры.</li>
52
<ul><li><strong>Event BeginPlay</strong> - событие, которое запускается на старте игры.</li>
53
<li><strong>Event ActionBeginOverlap</strong> - событие, взаимодействующее с другим актором, например зона-триггер или препятствие.</li>
53
<li><strong>Event ActionBeginOverlap</strong> - событие, взаимодействующее с другим актором, например зона-триггер или препятствие.</li>
54
<li><strong>Event Tick</strong> - потактовое событие.</li>
54
<li><strong>Event Tick</strong> - потактовое событие.</li>
55
</ul>Ноды в Event Graph по умолчанию<em>Скриншот: Unreal Editor / Epic Games</em><p>Попробуем создать текстовое сообщение, которое будет отображаться на экране сразу после тестового запуска уровня. За вывод текста на экран или в журнал, то есть в логи, отвечают ноды<strong>Print Text</strong>или<strong>Print String</strong>. По сути, они выполняют одинаковые функции. Отличие только в том, что текстовую информацию, созданную с помощью<strong>Print Text</strong>можно локализовать. Удерживая<strong>ЛКМ</strong>, вытягиваем цепочку из <strong>Event BeginPlay</strong>и набираем в поиске любой из этих узлов.</p>
55
</ul>Ноды в Event Graph по умолчанию<em>Скриншот: Unreal Editor / Epic Games</em><p>Попробуем создать текстовое сообщение, которое будет отображаться на экране сразу после тестового запуска уровня. За вывод текста на экран или в журнал, то есть в логи, отвечают ноды<strong>Print Text</strong>или<strong>Print String</strong>. По сути, они выполняют одинаковые функции. Отличие только в том, что текстовую информацию, созданную с помощью<strong>Print Text</strong>можно локализовать. Удерживая<strong>ЛКМ</strong>, вытягиваем цепочку из <strong>Event BeginPlay</strong>и набираем в поиске любой из этих узлов.</p>
56
Поиск функции Print Text<em>Скриншот: Unreal Editor / Epic Games</em><p>Если раскрыть созданный нод, можно установить в нём дополнительные параметры. В поле<strong>In Text</strong>вводим приветственную фразу.</p>
56
Поиск функции Print Text<em>Скриншот: Unreal Editor / Epic Games</em><p>Если раскрыть созданный нод, можно установить в нём дополнительные параметры. В поле<strong>In Text</strong>вводим приветственную фразу.</p>
57
Настройки функции Print Text. Остальные связки нодов отодвинуты в сторону, чтобы они не мешались<em>Скриншот: Unreal Editor / Epic Games</em><p>Компилируем и сохраняем созданный блюпринт. Если запустить проигрыватель сцены сейчас, ничего не произойдёт, потому что нового блюпринта в сцене физически не существует. Перетаскиваем готовый блюпринт из каталога ресурсов в сцену и запускаем демо. Теперь надпись должна появиться на экране - и сразу же исчезнуть, так как<strong>Event BeginPlay</strong>означает единоразовое событие.</p>
57
Настройки функции Print Text. Остальные связки нодов отодвинуты в сторону, чтобы они не мешались<em>Скриншот: Unreal Editor / Epic Games</em><p>Компилируем и сохраняем созданный блюпринт. Если запустить проигрыватель сцены сейчас, ничего не произойдёт, потому что нового блюпринта в сцене физически не существует. Перетаскиваем готовый блюпринт из каталога ресурсов в сцену и запускаем демо. Теперь надпись должна появиться на экране - и сразу же исчезнуть, так как<strong>Event BeginPlay</strong>означает единоразовое событие.</p>
58
<p>А вот если вернуться в редактор графов и заменить<strong>Event BeginPlay</strong>на <strong>Event Tick</strong>, то строка будет появляться в каждом кадре.</p>
58
<p>А вот если вернуться в редактор графов и заменить<strong>Event BeginPlay</strong>на <strong>Event Tick</strong>, то строка будет появляться в каждом кадре.</p>
59
<em>Скриншот: Unreal Editor / Epic Games</em>Итоговый результат. Мы немного изменили традиционную надпись<em>Скриншот: Unreal Editor / Epic Games</em><p>При желании можно сделать множество вариаций этого события, модифицируя созданный блюпринт новыми функциями. Например, активировать строку нажатием клавиши, уменьшить интервал появления надписи во время Event Tick или добавить чередование цветов.</p>
59
<em>Скриншот: Unreal Editor / Epic Games</em>Итоговый результат. Мы немного изменили традиционную надпись<em>Скриншот: Unreal Editor / Epic Games</em><p>При желании можно сделать множество вариаций этого события, модифицируя созданный блюпринт новыми функциями. Например, активировать строку нажатием клавиши, уменьшить интервал появления надписи во время Event Tick или добавить чередование цветов.</p>
60
<p>Попробуем сделать приветственную надпись на весь экран, которая будет появляться после нажатия клавиши. Создадим новый блюпринт для интерфейса:<strong>ПКМ</strong>в каталоге ресурсов вызываем меню создания ассетов и находим вкладку<strong>Пользовательский интерфейс</strong>(User Interface) -<strong>Схема создания виджетов</strong>(Widget Blueprint). В диалоговом окне выбираем<strong>User Widget</strong>, позволяющий расширить UI.</p>
60
<p>Попробуем сделать приветственную надпись на весь экран, которая будет появляться после нажатия клавиши. Создадим новый блюпринт для интерфейса:<strong>ПКМ</strong>в каталоге ресурсов вызываем меню создания ассетов и находим вкладку<strong>Пользовательский интерфейс</strong>(User Interface) -<strong>Схема создания виджетов</strong>(Widget Blueprint). В диалоговом окне выбираем<strong>User Widget</strong>, позволяющий расширить UI.</p>
61
Создание User Widget<em>Скриншот: Unreal Editor / Epic Games</em><p>Даём виджету название и открываем его. В поисковой строке раздела<strong>Палитра</strong>(Palette) (в левом верхнем углу) набираем<strong>Canvas Panel</strong>. Это панель холста, которая подходит для создания виджетов вручную. Перетаскиваем её в область графа. С такой рамкой удобно расположить будущий текст на экране.</p>
61
Создание User Widget<em>Скриншот: Unreal Editor / Epic Games</em><p>Даём виджету название и открываем его. В поисковой строке раздела<strong>Палитра</strong>(Palette) (в левом верхнем углу) набираем<strong>Canvas Panel</strong>. Это панель холста, которая подходит для создания виджетов вручную. Перетаскиваем её в область графа. С такой рамкой удобно расположить будущий текст на экране.</p>
62
<em>Скриншот: Unreal Editor / Epic Games</em><p>Аналогичным способом находим в строке поиска элемент<strong>Text</strong>. Существуют разные вариации этого элемента, и выбор во многом зависит от функции, которую будет выполнять текст на экране. В данном случае мы выбираем просто<strong>Text</strong>и переносим его на экран. После этого в углу рамки появится метка, напоминающая цветок.</p>
62
<em>Скриншот: Unreal Editor / Epic Games</em><p>Аналогичным способом находим в строке поиска элемент<strong>Text</strong>. Существуют разные вариации этого элемента, и выбор во многом зависит от функции, которую будет выполнять текст на экране. В данном случае мы выбираем просто<strong>Text</strong>и переносим его на экран. После этого в углу рамки появится метка, напоминающая цветок.</p>
63
<em>Скриншот: Unreal Editor / Epic Games</em><p>Она служит своего рода направляющей для определения положения будущего виджета. Нажимая на "лепестки" или центр метки и удерживая<strong>Ctrl</strong>, можно точно разместить элементы на экране. То же самое выравнивание, но уже автоматическое, можно сделать во вкладке<strong>Якоря</strong>(Anchors), расположенная в панели<strong>Сведения</strong>(Details).</p>
63
<em>Скриншот: Unreal Editor / Epic Games</em><p>Она служит своего рода направляющей для определения положения будущего виджета. Нажимая на "лепестки" или центр метки и удерживая<strong>Ctrl</strong>, можно точно разместить элементы на экране. То же самое выравнивание, но уже автоматическое, можно сделать во вкладке<strong>Якоря</strong>(Anchors), расположенная в панели<strong>Сведения</strong>(Details).</p>
64
<p>Сам текст можно изменить во вкладке<strong>Содержимое</strong>(Content), а в разделе<strong>Внешний вид</strong>(Appearance) - скорректировать цвет текста, шрифт и прочие параметры.</p>
64
<p>Сам текст можно изменить во вкладке<strong>Содержимое</strong>(Content), а в разделе<strong>Внешний вид</strong>(Appearance) - скорректировать цвет текста, шрифт и прочие параметры.</p>
65
Создание виджета<em>Скриншот: Unreal Editor / Epic Games</em><p>После всех манипуляций компилируем и сохраняем новый виджет. Теперь на него нужно сделать ссылку в блюпринте.</p>
65
Создание виджета<em>Скриншот: Unreal Editor / Epic Games</em><p>После всех манипуляций компилируем и сохраняем новый виджет. Теперь на него нужно сделать ссылку в блюпринте.</p>
66
<p>В этот раз нам нужно создать функцию, которая будет запускать интерфейс по нажатию кнопки. До версии движка 5.1 в этой операции был задействован раздел<strong>Назначение действий</strong>(Action Mappings). Его можно найти, перейдя в меню<strong>Правка</strong>(Edit) -<strong>Настройки проекта</strong>(Project Settings) -<strong>Движок</strong>(Engine) -<strong>Ввод</strong>(Input). Но, начиная с версии 5.1, раздел встретит нас надписью о том, что данные настройки клавиш для проекта устарели.</p>
66
<p>В этот раз нам нужно создать функцию, которая будет запускать интерфейс по нажатию кнопки. До версии движка 5.1 в этой операции был задействован раздел<strong>Назначение действий</strong>(Action Mappings). Его можно найти, перейдя в меню<strong>Правка</strong>(Edit) -<strong>Настройки проекта</strong>(Project Settings) -<strong>Движок</strong>(Engine) -<strong>Ввод</strong>(Input). Но, начиная с версии 5.1, раздел встретит нас надписью о том, что данные настройки клавиш для проекта устарели.</p>
67
Интерфейс настроек Ввода (Input) в версиях 5.1 и выше<em>Скриншот: Unreal Editor / Epic Games</em><p>До версии 5.1 в Unreal Engine практиковалась система назначения клавиш и их применение в качестве действия в графе блюпринтов. Учитывая развитие технологии, нет гарантии, что в будущем эта функция не исчезнет окончательно. Поэтому мы рассмотрим более усовершенствованные системы назначения ввода -<strong>Расширенные действия ввода</strong>(Enhanced Input Actions) и <strong>Контексты назначения ввода</strong>(Input Mapping Contexts). В них есть более продвинутые настройки, например способы нажатия клавиш или клавишные комбинации.</p>
67
Интерфейс настроек Ввода (Input) в версиях 5.1 и выше<em>Скриншот: Unreal Editor / Epic Games</em><p>До версии 5.1 в Unreal Engine практиковалась система назначения клавиш и их применение в качестве действия в графе блюпринтов. Учитывая развитие технологии, нет гарантии, что в будущем эта функция не исчезнет окончательно. Поэтому мы рассмотрим более усовершенствованные системы назначения ввода -<strong>Расширенные действия ввода</strong>(Enhanced Input Actions) и <strong>Контексты назначения ввода</strong>(Input Mapping Contexts). В них есть более продвинутые настройки, например способы нажатия клавиш или клавишные комбинации.</p>
68
<p><strong>ПКМ</strong>в каталоге ресурсов вызываем меню, открываем вкладку<strong>Ввод</strong>(Input) и в ней находим<strong>Действие ввода</strong>(Input Action). Создаём его. Перед названием желательно добавить префикс<strong>IA_</strong> - обычно его используют в разработке для обозначения ресурсов с действиями ввода.</p>
68
<p><strong>ПКМ</strong>в каталоге ресурсов вызываем меню, открываем вкладку<strong>Ввод</strong>(Input) и в ней находим<strong>Действие ввода</strong>(Input Action). Создаём его. Перед названием желательно добавить префикс<strong>IA_</strong> - обычно его используют в разработке для обозначения ресурсов с действиями ввода.</p>
69
<p>Когда откроете<strong>Действие ввода</strong>(Input Action), загрузится отдельное окно с настройками. В пункте<strong>Action Description</strong>можно указать для себя название или описание действия, чтобы не запутаться. Далее идут более тонкие настройки. Например,<strong>Trigger when Paused</strong>отмечается галочкой в том случае, если мы хотим вызвать будущий виджет, даже когда игра поставлена на паузу. Это может пригодиться разработчикам, которые методом виджета хотят установить в игре меню инвентаря или что-то похожее.</p>
69
<p>Когда откроете<strong>Действие ввода</strong>(Input Action), загрузится отдельное окно с настройками. В пункте<strong>Action Description</strong>можно указать для себя название или описание действия, чтобы не запутаться. Далее идут более тонкие настройки. Например,<strong>Trigger when Paused</strong>отмечается галочкой в том случае, если мы хотим вызвать будущий виджет, даже когда игра поставлена на паузу. Это может пригодиться разработчикам, которые методом виджета хотят установить в игре меню инвентаря или что-то похожее.</p>
70
<p>Предположим, что мы хотим вызывать будущий виджет нажатием клавиши E. В графе<strong>Triggers</strong>кнопкой<strong>+</strong>создаём<strong>Элемент массива</strong>(Array elements). Во вкладке<strong>Индекс</strong>(Index) указываем тип нажатия<strong>Pressed</strong> - таким образом действие будет активироваться по нажатию клавиши.</p>
70
<p>Предположим, что мы хотим вызывать будущий виджет нажатием клавиши E. В графе<strong>Triggers</strong>кнопкой<strong>+</strong>создаём<strong>Элемент массива</strong>(Array elements). Во вкладке<strong>Индекс</strong>(Index) указываем тип нажатия<strong>Pressed</strong> - таким образом действие будет активироваться по нажатию клавиши.</p>
71
<em>Скриншот: Unreal Editor / Epic Games</em><p>Сохраняем настройки и возвращаемся в редактор. Теперь нам необходимо задать клавишу для действия. Для этого нам потребуется ассет<strong>Контекста назначения ввода</strong>(Input Mapping Contexts), который также находится во вкладке<strong>Ввод</strong>(Input).</p>
71
<em>Скриншот: Unreal Editor / Epic Games</em><p>Сохраняем настройки и возвращаемся в редактор. Теперь нам необходимо задать клавишу для действия. Для этого нам потребуется ассет<strong>Контекста назначения ввода</strong>(Input Mapping Contexts), который также находится во вкладке<strong>Ввод</strong>(Input).</p>
72
<p><strong>Примечание</strong></p>
72
<p><strong>Примечание</strong></p>
73
<p>Установка нового контекста назначения, представленная ниже, - лишь наглядный пример того, как создать его в пустом проекте или, скажем, сделать дополнительную систему ввода (управление транспортом, плавание и так далее). В игровых шаблонах Unreal Engine уже существует ассет для контекста действий ввода. В Third Person он содержится в файле<strong>IMC_Default</strong>. С этим ресурсом мы поработаем чуть позже.</p>
73
<p>Установка нового контекста назначения, представленная ниже, - лишь наглядный пример того, как создать его в пустом проекте или, скажем, сделать дополнительную систему ввода (управление транспортом, плавание и так далее). В игровых шаблонах Unreal Engine уже существует ассет для контекста действий ввода. В Third Person он содержится в файле<strong>IMC_Default</strong>. С этим ресурсом мы поработаем чуть позже.</p>
74
<p>Создаём и открываем новый ассет. В разделе<strong>Назначения</strong>(Mappings) выбираем созданный нами ресурс виджета (в данном случае<strong>IA_Widget</strong>), а затем назначаем клавишу: сначала нажимаем на кнопку с изображением клавиатуры, а затем - необходимую клавишу (в нашем случае E).</p>
74
<p>Создаём и открываем новый ассет. В разделе<strong>Назначения</strong>(Mappings) выбираем созданный нами ресурс виджета (в данном случае<strong>IA_Widget</strong>), а затем назначаем клавишу: сначала нажимаем на кнопку с изображением клавиатуры, а затем - необходимую клавишу (в нашем случае E).</p>
75
<em>Скриншот: Unreal Editor / Epic Games</em><p><strong>Примечание</strong></p>
75
<em>Скриншот: Unreal Editor / Epic Games</em><p><strong>Примечание</strong></p>
76
<p>Если помимо этого нам необходимо назначить кнопку другой системы ввода, например геймпада, добавляем привязку элемента (кнопка<strong>+</strong>рядом с названием действия на скриншоте). Появится ещё один пункт. В нём открываем меню рядом с перечнем всех устройств и выбираем тот тип ввода, который нам нужен.</p>
76
<p>Если помимо этого нам необходимо назначить кнопку другой системы ввода, например геймпада, добавляем привязку элемента (кнопка<strong>+</strong>рядом с названием действия на скриншоте). Появится ещё один пункт. В нём открываем меню рядом с перечнем всех устройств и выбираем тот тип ввода, который нам нужен.</p>
77
<p>Сохраняем внесённые изменения. Теперь нужно закрепить их в настройках проекта. Заходим в <strong>Настройки проекта</strong>(Project Settings) и в разделе<strong>Движок</strong>(Engine) находим<strong>Enhanced Input</strong>. Нам необходимо добавить созданные нами параметры ввода в <strong>Контексты сопоставления по умолчанию</strong>(Default Mapping Contexts). Кнопкой<strong>+</strong>добавляем<strong>Элемент массива</strong>(Array Element), раскрываем вкладку<strong>Индекс</strong>(Index) и указываем созданный ранее контекст назначения.</p>
77
<p>Сохраняем внесённые изменения. Теперь нужно закрепить их в настройках проекта. Заходим в <strong>Настройки проекта</strong>(Project Settings) и в разделе<strong>Движок</strong>(Engine) находим<strong>Enhanced Input</strong>. Нам необходимо добавить созданные нами параметры ввода в <strong>Контексты сопоставления по умолчанию</strong>(Default Mapping Contexts). Кнопкой<strong>+</strong>добавляем<strong>Элемент массива</strong>(Array Element), раскрываем вкладку<strong>Индекс</strong>(Index) и указываем созданный ранее контекст назначения.</p>
78
<em>Скриншот: Unreal Editor / Epic Games</em><p>Закрываем окно, теперь можно приступить к настройке блюпринта. Так как у нас уже есть готовая система с персонажем в шаблоне, заходим в блюпринт персонажа, перемещаемся на свободный участок графа и создаём новую цепочку. Нажимаем<strong>ПКМ</strong>по полю графа и набираем в строке поиска название нашего виджета-блюпринта - в категории<strong>Enhanced Action Events</strong>высветится соответствующий компонент. Выбираем его, и в графе появится нод будущего действия. Если развернуть его, можно увидеть расширенный перечень слотов, каждый из которых имеет разные свойства.</p>
78
<em>Скриншот: Unreal Editor / Epic Games</em><p>Закрываем окно, теперь можно приступить к настройке блюпринта. Так как у нас уже есть готовая система с персонажем в шаблоне, заходим в блюпринт персонажа, перемещаемся на свободный участок графа и создаём новую цепочку. Нажимаем<strong>ПКМ</strong>по полю графа и набираем в строке поиска название нашего виджета-блюпринта - в категории<strong>Enhanced Action Events</strong>высветится соответствующий компонент. Выбираем его, и в графе появится нод будущего действия. Если развернуть его, можно увидеть расширенный перечень слотов, каждый из которых имеет разные свойства.</p>
79
<em>Скриншот: Unreal Editor / Epic Games</em><p>Наведя на каждый из них, можно прочесть подробное описание их свойств. В данном случае мы выберем<strong>Started</strong> - то есть событие будет активироваться при нажатии.</p>
79
<em>Скриншот: Unreal Editor / Epic Games</em><p>Наведя на каждый из них, можно прочесть подробное описание их свойств. В данном случае мы выберем<strong>Started</strong> - то есть событие будет активироваться при нажатии.</p>
80
<p>От слота<strong>Started</strong>выводим связь и создаём функцию с виджетом интерфейса -<strong>Create Widget</strong>, чтобы при нажатии запускался виджет, который мы создавали ранее.</p>
80
<p>От слота<strong>Started</strong>выводим связь и создаём функцию с виджетом интерфейса -<strong>Create Widget</strong>, чтобы при нажатии запускался виджет, который мы создавали ранее.</p>
81
Поиск и создание интерфейса. Белым подчёркнута функция, которую нужно выбрать<em>Скриншот: Unreal Editor / Epic Games</em><p>В созданном ноде открываем вкладку<strong>Class</strong>и находим среди компонентов созданный нами ранее виджет.</p>
81
Поиск и создание интерфейса. Белым подчёркнута функция, которую нужно выбрать<em>Скриншот: Unreal Editor / Epic Games</em><p>В созданном ноде открываем вкладку<strong>Class</strong>и находим среди компонентов созданный нами ранее виджет.</p>
82
<em>Скриншот: Unreal Editor / Epic Games</em><p>Чтобы надпись появилась во вьюпорте, из узла виджета выводим следующий нод -<strong>Add to Viewport</strong>. На скриншоте ниже можно заметить компонент с похожими свойствами -<strong>Add to Player Screen</strong>, но в данном случае мы его не выбираем, так как этот вариант практикуется в играх, где нужно вывести содержимое для конкретного игрока, например при разделённом экране.</p>
82
<em>Скриншот: Unreal Editor / Epic Games</em><p>Чтобы надпись появилась во вьюпорте, из узла виджета выводим следующий нод -<strong>Add to Viewport</strong>. На скриншоте ниже можно заметить компонент с похожими свойствами -<strong>Add to Player Screen</strong>, но в данном случае мы его не выбираем, так как этот вариант практикуется в играх, где нужно вывести содержимое для конкретного игрока, например при разделённом экране.</p>
83
<em>Скриншот: Unreal Editor / Epic Games</em><p>Слот<strong>Return Value</strong>у нода с виджетом связываем со слотом<strong>Target</strong>у нода, отвечающего за отображение во вьюпорте, иначе блюпринт невозможно будет скомпилировать.</p>
83
<em>Скриншот: Unreal Editor / Epic Games</em><p>Слот<strong>Return Value</strong>у нода с виджетом связываем со слотом<strong>Target</strong>у нода, отвечающего за отображение во вьюпорте, иначе блюпринт невозможно будет скомпилировать.</p>
84
<em>Скриншот: Unreal Editor / Epic Games</em><p>Чтобы надпись после выведения на экран со временем исчезла, добавим функцию задержки<strong>Delay</strong>. В параметре<strong>Duration</strong>выставим, к примеру, три секунды (3.0). Из нода виджета протянем ещё одну нить для функции<strong>Remove from Parent</strong>, которая позволит убрать виджет с экрана. Обратите внимание, что<strong>Remove from Parent</strong>можно протянуть только из гнезда<strong>Return Value</strong>.</p>
84
<em>Скриншот: Unreal Editor / Epic Games</em><p>Чтобы надпись после выведения на экран со временем исчезла, добавим функцию задержки<strong>Delay</strong>. В параметре<strong>Duration</strong>выставим, к примеру, три секунды (3.0). Из нода виджета протянем ещё одну нить для функции<strong>Remove from Parent</strong>, которая позволит убрать виджет с экрана. Обратите внимание, что<strong>Remove from Parent</strong>можно протянуть только из гнезда<strong>Return Value</strong>.</p>
85
Итоговый вид связки<em>Скриншот: Unreal Editor / Epic Games</em><p>Компилируем и сохраняем наш блюпринт. Запускаем проигрыватель в редакторе и смотрим результат.</p>
85
Итоговый вид связки<em>Скриншот: Unreal Editor / Epic Games</em><p>Компилируем и сохраняем наш блюпринт. Запускаем проигрыватель в редакторе и смотрим результат.</p>
86
Активация надписи происходит при нажатии клавиши E. Согласно заданным свойствам виджет исчезает через три секунды<em>Unreal Editor / Epic Games</em><p>Любые связки нодов желательно упорядочивать. Во-первых, хаотичные формы связок сложно разобрать при большом объёме данных - в результате область графа приобретает вид, который в профессиональных кругах иронично называют "лапшой". Во-вторых, это негласное правило хорошего тона в программировании блюпринтов: вряд ли коллегам захочется тратить лишнее время на расшифровку узлов.</p>
86
Активация надписи происходит при нажатии клавиши E. Согласно заданным свойствам виджет исчезает через три секунды<em>Unreal Editor / Epic Games</em><p>Любые связки нодов желательно упорядочивать. Во-первых, хаотичные формы связок сложно разобрать при большом объёме данных - в результате область графа приобретает вид, который в профессиональных кругах иронично называют "лапшой". Во-вторых, это негласное правило хорошего тона в программировании блюпринтов: вряд ли коллегам захочется тратить лишнее время на расшифровку узлов.</p>
87
Если взглянуть на созданную нами связку и сравнить её с пресетами из шаблона Third Person, видно, что наша нуждается в упорядочивании<em>Скриншот: Unreal Editor / Epic Games</em><p>Рассмотрим, как можно упорядочить ноды в созданной нами связке.</p>
87
Если взглянуть на созданную нами связку и сравнить её с пресетами из шаблона Third Person, видно, что наша нуждается в упорядочивании<em>Скриншот: Unreal Editor / Epic Games</em><p>Рассмотрим, как можно упорядочить ноды в созданной нами связке.</p>
88
<p>В ней есть два звена, которые входят в один синий слот. Поэтому можно выбрать синюю нить и кликнуть по ней два раза. Появится дополнительное гнездо, которое можно подвинуть, удерживая<strong>Ctrl + ЛКМ</strong>, и присоединить продублированный нод. А чтобы связка была ровной, создаём дополнительный узел и выравниваем цепочку.</p>
88
<p>В ней есть два звена, которые входят в один синий слот. Поэтому можно выбрать синюю нить и кликнуть по ней два раза. Появится дополнительное гнездо, которое можно подвинуть, удерживая<strong>Ctrl + ЛКМ</strong>, и присоединить продублированный нод. А чтобы связка была ровной, создаём дополнительный узел и выравниваем цепочку.</p>
89
Процесс упорядочивания нодов<em>Unreal Editor / Epic Games</em><p>Если нодов в гр<strong>а</strong>фе слишком много, к каждой связке желательно добавлять комментарии, чтобы избежать путаницы. Для этого нужно выделить все ноды и кликнуть по ним<strong>ПКМ</strong>. В появившейся вкладке выбираем<strong>Создать комментарий для выбранного</strong>(Create Comment from Selection) и добавляем описание на панели<strong>Сведения</strong>(Details) или в самом заголовке окна.</p>
89
Процесс упорядочивания нодов<em>Unreal Editor / Epic Games</em><p>Если нодов в гр<strong>а</strong>фе слишком много, к каждой связке желательно добавлять комментарии, чтобы избежать путаницы. Для этого нужно выделить все ноды и кликнуть по ним<strong>ПКМ</strong>. В появившейся вкладке выбираем<strong>Создать комментарий для выбранного</strong>(Create Comment from Selection) и добавляем описание на панели<strong>Сведения</strong>(Details) или в самом заголовке окна.</p>
90
<em>Скриншот: Unreal Editor / Epic Games</em><p>При желании можно даже настроить цвет рамки и фона. На скриншоте ниже основной фон рамки сделан прозрачным (альфа-канал), а сама рамка - серая по аналогии с шаблонными. Цвет можно выбрать в графе<strong>Comment Color</strong>c помощью цветовой палитры, пипетки или числовых значений.</p>
90
<em>Скриншот: Unreal Editor / Epic Games</em><p>При желании можно даже настроить цвет рамки и фона. На скриншоте ниже основной фон рамки сделан прозрачным (альфа-канал), а сама рамка - серая по аналогии с шаблонными. Цвет можно выбрать в графе<strong>Comment Color</strong>c помощью цветовой палитры, пипетки или числовых значений.</p>
91
<em>Скриншот: Unreal Editor / Epic Games</em><p>Текущая схема виджета нам более не понадобится. Её можно просто удалить: выделить все компоненты, нажать<strong>ПКМ</strong>и выбрать<strong>Удалить</strong>(Delete) либо<strong>Разорвать ссылки узла</strong>(Break Node Link (s), чтобы потом при необходимости собрать его заново.</p>
91
<em>Скриншот: Unreal Editor / Epic Games</em><p>Текущая схема виджета нам более не понадобится. Её можно просто удалить: выделить все компоненты, нажать<strong>ПКМ</strong>и выбрать<strong>Удалить</strong>(Delete) либо<strong>Разорвать ссылки узла</strong>(Break Node Link (s), чтобы потом при необходимости собрать его заново.</p>
92
<p>Теперь попробуем создать более комплексный блюпринт - например, пропишем самое простое взаимодействие с объектом: когда игрок подойдёт к нему и нажмёт кнопку, в углу экрана появится текстовое уведомление.</p>
92
<p>Теперь попробуем создать более комплексный блюпринт - например, пропишем самое простое взаимодействие с объектом: когда игрок подойдёт к нему и нажмёт кнопку, в углу экрана появится текстовое уведомление.</p>
93
<p>В качестве клавиши взаимодействия мы оставим кнопку E. Создаём новый ресурс<strong>Действия ввода</strong>(Input Action), называем его<strong>IA_Interact</strong>и настраиваем по тому же принципу, что и ранее IA_Widget. Но в этот раз мы пропишем его<strong>Назначение</strong>(Mappings) не в отдельный файл, а в <strong>IMC_Default</strong>, который содержится в шаблоне по умолчанию. Найти его можно в каталоге ресурсов, воспользовавшись поиском.</p>
93
<p>В качестве клавиши взаимодействия мы оставим кнопку E. Создаём новый ресурс<strong>Действия ввода</strong>(Input Action), называем его<strong>IA_Interact</strong>и настраиваем по тому же принципу, что и ранее IA_Widget. Но в этот раз мы пропишем его<strong>Назначение</strong>(Mappings) не в отдельный файл, а в <strong>IMC_Default</strong>, который содержится в шаблоне по умолчанию. Найти его можно в каталоге ресурсов, воспользовавшись поиском.</p>
94
Добавление нового действия ввода. Снизу показан поиск IMC_Default в каталоге ресурсов<em>Скриншот: Unreal Editor / Epic Games</em><p>Создаём новый<strong>Класс Blueprint</strong>(Blueprint Class) и в диалоговом окне выбираем<strong>Actor</strong>. Даём новому блюпринту название. В нашем примере блюпринт назван<strong>BP_Interact</strong>. Открываем его и переходим во вьюпорт.</p>
94
Добавление нового действия ввода. Снизу показан поиск IMC_Default в каталоге ресурсов<em>Скриншот: Unreal Editor / Epic Games</em><p>Создаём новый<strong>Класс Blueprint</strong>(Blueprint Class) и в диалоговом окне выбираем<strong>Actor</strong>. Даём новому блюпринту название. В нашем примере блюпринт назван<strong>BP_Interact</strong>. Открываем его и переходим во вьюпорт.</p>
95
<p>В меню<strong>Компоненты</strong>(Components) нажимаем кнопку<strong>+ Добавить</strong>(+ Add). Здесь нам нужно выбрать цель взаимодействия. Это может быть как новый меш-примитив (по умолчанию в списке доступны Plane, Cube, Sphere), так и статические сетки (меши). Мы возьмём меш синего кубика из сцены: выбираем<strong>Static Mesh</strong>и в панели<strong>Сведения</strong>(Details) в одноимённой вкладке находим синий куб (в списке ассетов он обозначен как<strong>SM_ChamferCube</strong>).</p>
95
<p>В меню<strong>Компоненты</strong>(Components) нажимаем кнопку<strong>+ Добавить</strong>(+ Add). Здесь нам нужно выбрать цель взаимодействия. Это может быть как новый меш-примитив (по умолчанию в списке доступны Plane, Cube, Sphere), так и статические сетки (меши). Мы возьмём меш синего кубика из сцены: выбираем<strong>Static Mesh</strong>и в панели<strong>Сведения</strong>(Details) в одноимённой вкладке находим синий куб (в списке ассетов он обозначен как<strong>SM_ChamferCube</strong>).</p>
96
Установка объекта в блюпринте<em>Скриншот: Unreal Editor / Epic Games</em><p>Компилируем, сохраняем и возвращаемся к блюпринту персонажа.</p>
96
Установка объекта в блюпринте<em>Скриншот: Unreal Editor / Epic Games</em><p>Компилируем, сохраняем и возвращаемся к блюпринту персонажа.</p>
97
<p>В пустой области схемы нажимаем<strong>ПКМ</strong>и в поиске набираем название действия ввода, которое мы создали ранее<strong>.</strong>В данном случае это<strong>IA_Interact</strong>. После того как название высветилось в категории событий, выбираем его.</p>
97
<p>В пустой области схемы нажимаем<strong>ПКМ</strong>и в поиске набираем название действия ввода, которое мы создали ранее<strong>.</strong>В данном случае это<strong>IA_Interact</strong>. После того как название высветилось в категории событий, выбираем его.</p>
98
<em>Скриншот: Unreal Editor / Epic Games</em><p>Новое действие должно выполняться при трассировке столкновений с заданным объектом, то есть когда объект взаимодействия будет в поле зрения игрока. За это отвечает нод<strong>Line Trace By Channel</strong>. Выводим его из слота<strong>Started</strong>предыдущего нода, как мы делали это ранее.</p>
98
<em>Скриншот: Unreal Editor / Epic Games</em><p>Новое действие должно выполняться при трассировке столкновений с заданным объектом, то есть когда объект взаимодействия будет в поле зрения игрока. За это отвечает нод<strong>Line Trace By Channel</strong>. Выводим его из слота<strong>Started</strong>предыдущего нода, как мы делали это ранее.</p>
99
<em>Скриншот: Unreal Editor / Epic Games</em><p>Теперь нам необходимо настроить принцип трассировки. Из слота<strong>Start</strong>выводим функцию<strong>Get World Location (Follow Camera)</strong>, так как трассировка условной линии соприкосновения исходит от камеры. Из появившегося компонента<strong>Follow Camera</strong>выводим функцию<strong>Get World Rotation</strong>, а из него, в свою очередь, выводим нод<strong>Get Forward Vector</strong>. В настоящий момент схема должна выглядеть следующим образом.</p>
99
<em>Скриншот: Unreal Editor / Epic Games</em><p>Теперь нам необходимо настроить принцип трассировки. Из слота<strong>Start</strong>выводим функцию<strong>Get World Location (Follow Camera)</strong>, так как трассировка условной линии соприкосновения исходит от камеры. Из появившегося компонента<strong>Follow Camera</strong>выводим функцию<strong>Get World Rotation</strong>, а из него, в свою очередь, выводим нод<strong>Get Forward Vector</strong>. В настоящий момент схема должна выглядеть следующим образом.</p>
100
<em>Скриншот: Unreal Editor / Epic Games</em><p>Создаём нод<strong>Multiply</strong>. Один его слот связываем с гнездом<strong>Return Value</strong>функции<strong>Get Forward Vector</strong>, а по второму кликаем<strong>ПКМ</strong>и преобразовываем в <strong>Плавающее значение с одиночной точностью</strong>(Float (single- precision).</p>
100
<em>Скриншот: Unreal Editor / Epic Games</em><p>Создаём нод<strong>Multiply</strong>. Один его слот связываем с гнездом<strong>Return Value</strong>функции<strong>Get Forward Vector</strong>, а по второму кликаем<strong>ПКМ</strong>и преобразовываем в <strong>Плавающее значение с одиночной точностью</strong>(Float (single- precision).</p>
101
<em>Скриншот: Unreal Editor / Epic Games</em><p>Этим мы обозначим активацию действия в зависимости от расстояния между объектом и игроком. Так как камера от третьего лица расположена достаточно далеко, пропишем дистанцию в пять метров (500,0). В шаблоне игры от первого лица значение можно сделать меньше (например, 200,0).</p>
101
<em>Скриншот: Unreal Editor / Epic Games</em><p>Этим мы обозначим активацию действия в зависимости от расстояния между объектом и игроком. Так как камера от третьего лица расположена достаточно далеко, пропишем дистанцию в пять метров (500,0). В шаблоне игры от первого лица значение можно сделать меньше (например, 200,0).</p>
102
<p>Из третьего слота<strong>Multiply</strong>выводим узел<strong>Add</strong>из раздела<strong>Операторы</strong>(Operators). Новый нод связываем с ранее созданным<strong>Get World Location</strong>и с <strong>End</strong>в <strong>Line Trace By Channel</strong>, завершая таким образом цикл трассировки.</p>
102
<p>Из третьего слота<strong>Multiply</strong>выводим узел<strong>Add</strong>из раздела<strong>Операторы</strong>(Operators). Новый нод связываем с ранее созданным<strong>Get World Location</strong>и с <strong>End</strong>в <strong>Line Trace By Channel</strong>, завершая таким образом цикл трассировки.</p>
103
Промежуточный результат<em>Скриншот: Unreal Editor / Epic Games</em><p>Теперь нам необходимо определить, что будет происходить, когда перед игроком окажется объект для взаимодействия. Из основного слота<strong>Line Trace By Channel</strong>вытягиваем нод<strong>Branch</strong> - оператор, который даёт логическое разветвление дальнейшего действия на True и False, то есть "Истину" или "Ложь".</p>
103
Промежуточный результат<em>Скриншот: Unreal Editor / Epic Games</em><p>Теперь нам необходимо определить, что будет происходить, когда перед игроком окажется объект для взаимодействия. Из основного слота<strong>Line Trace By Channel</strong>вытягиваем нод<strong>Branch</strong> - оператор, который даёт логическое разветвление дальнейшего действия на True и False, то есть "Истину" или "Ложь".</p>
104
<p>При значении True персонаж начнёт взаимодействие с объектом, поэтому из <strong>True</strong>выводим функцию, которая будет ссылаться на ранее созданный блюпринт, в данном случае это<strong>BP_Interact</strong>. После набора блюпринта в поисковой строке выбираем<strong>Cast to</strong>[название блюпринта]. Из полученного нода выводим<strong>Print String</strong>и указываем текст, который будет отображаться при взаимодействии с будущим кубиком. При необходимости указываем дополнительные параметры, например цвет текста и время отображения.</p>
104
<p>При значении True персонаж начнёт взаимодействие с объектом, поэтому из <strong>True</strong>выводим функцию, которая будет ссылаться на ранее созданный блюпринт, в данном случае это<strong>BP_Interact</strong>. После набора блюпринта в поисковой строке выбираем<strong>Cast to</strong>[название блюпринта]. Из полученного нода выводим<strong>Print String</strong>и указываем текст, который будет отображаться при взаимодействии с будущим кубиком. При необходимости указываем дополнительные параметры, например цвет текста и время отображения.</p>
105
<em>Скриншот: Unreal Editor / Epic Games</em><p>Далее нам необходимо создать нод<strong>Break Hit Result</strong>, который связан с коллизиями и непосредственным взаимодействием с объектами. Слот<strong>Object</strong>у нода<strong>Cast to</strong>связываем с <strong>Hit Actor</strong>. А слот<strong>Hit</strong>связываем с <strong>Out Hit</strong>у <strong>Line Trace By Channel</strong>, обеспечивая таким образом трассировку попадания.</p>
105
<em>Скриншот: Unreal Editor / Epic Games</em><p>Далее нам необходимо создать нод<strong>Break Hit Result</strong>, который связан с коллизиями и непосредственным взаимодействием с объектами. Слот<strong>Object</strong>у нода<strong>Cast to</strong>связываем с <strong>Hit Actor</strong>. А слот<strong>Hit</strong>связываем с <strong>Out Hit</strong>у <strong>Line Trace By Channel</strong>, обеспечивая таким образом трассировку попадания.</p>
106
Вторая часть схемы<em>Скриншот: Unreal Editor / Epic Games</em>Итоговый вид блюпринта<em>Скриншот: Unreal Editor / Epic Games</em><p>Компилируем и сохраняем блюпринт. Размещаем блюпринты<strong>BP_Interact</strong>с кубиками в сцене и проверяем результат.</p>
106
Вторая часть схемы<em>Скриншот: Unreal Editor / Epic Games</em>Итоговый вид блюпринта<em>Скриншот: Unreal Editor / Epic Games</em><p>Компилируем и сохраняем блюпринт. Размещаем блюпринты<strong>BP_Interact</strong>с кубиками в сцене и проверяем результат.</p>
107
Каждый раз, когда игрок нажимает кнопку E рядом с синим кубом, происходит взаимодействие - и в результате в левом верхнем углу экрана появляется текст<p>Стоит отметить, что этот "рецепт" - самый простой и линейный способ настроить взаимодействие с объектом. Существуют и более сложные подходы, включая использование производных отдельных блюпринтов для более разнообразных вариантов взаимодействия, а также интеграцию виджетов, которые мы часто привыкли видеть в играх. Более подробно о создании блюпринтов для разных типов взаимодействия можно узнать из видеоурока на ютуб-канале JimDublace.</p>
107
Каждый раз, когда игрок нажимает кнопку E рядом с синим кубом, происходит взаимодействие - и в результате в левом верхнем углу экрана появляется текст<p>Стоит отметить, что этот "рецепт" - самый простой и линейный способ настроить взаимодействие с объектом. Существуют и более сложные подходы, включая использование производных отдельных блюпринтов для более разнообразных вариантов взаимодействия, а также интеграцию виджетов, которые мы часто привыкли видеть в играх. Более подробно о создании блюпринтов для разных типов взаимодействия можно узнать из видеоурока на ютуб-канале JimDublace.</p>
108
<p>Теперь рассмотрим, как работает взаимодействие с анимированными объектами - например, настроим возможность открывать сундуки клавишей F. В качестве объекта для взаимодействия мы выбрали анимированную модель сундука от Mauricio Tonelli, которую можно бесплатно скачать с портала<a>Sketchfab</a>. Для начала создадим блюпринт интерфейса: жмём<strong>ПКМ</strong>в области каталога ресурсов, находим раздел<strong>Схемы Blueprints</strong>(Blueprints) -<strong>Интерфейс Blueprint</strong>(Blueprint Interface).</p>
108
<p>Теперь рассмотрим, как работает взаимодействие с анимированными объектами - например, настроим возможность открывать сундуки клавишей F. В качестве объекта для взаимодействия мы выбрали анимированную модель сундука от Mauricio Tonelli, которую можно бесплатно скачать с портала<a>Sketchfab</a>. Для начала создадим блюпринт интерфейса: жмём<strong>ПКМ</strong>в области каталога ресурсов, находим раздел<strong>Схемы Blueprints</strong>(Blueprints) -<strong>Интерфейс Blueprint</strong>(Blueprint Interface).</p>
109
<p>Блюпринты интерфейсов немного отличаются от стандартных. Пока всё, что нам нужно, - это переименовать для удобства текущую функцию: справа в разделе<strong>Функции</strong>(Functions) кликаем<strong>ПКМ</strong>по доступной функции, выбираем<strong>Переименовать</strong>(Rename) и вводим новое название. Компилируем и сохраняем блюпринт.</p>
109
<p>Блюпринты интерфейсов немного отличаются от стандартных. Пока всё, что нам нужно, - это переименовать для удобства текущую функцию: справа в разделе<strong>Функции</strong>(Functions) кликаем<strong>ПКМ</strong>по доступной функции, выбираем<strong>Переименовать</strong>(Rename) и вводим новое название. Компилируем и сохраняем блюпринт.</p>
110
Мы переименовали функцию в Interaction<em>Скриншот: Unreal Editor / Epic Games</em><p>Загружаем модель и все её составляющие в отдельную папку и при импорте обязательно включаем галочку<strong>Import Animations</strong>. Если материалы по каким-то причинам не отображаются, их можно быстро настроить путём перемещения готовых текстур в соответствующие слоты шейдеров.</p>
110
Мы переименовали функцию в Interaction<em>Скриншот: Unreal Editor / Epic Games</em><p>Загружаем модель и все её составляющие в отдельную папку и при импорте обязательно включаем галочку<strong>Import Animations</strong>. Если материалы по каким-то причинам не отображаются, их можно быстро настроить путём перемещения готовых текстур в соответствующие слоты шейдеров.</p>
111
<p>Разобравшись с импортом, создаём новый<strong>Класс Blueprint</strong>(Blueprint Class) типа<strong>Actor</strong>, даём ему название и открываем. В разделе<strong>Компоненты</strong>(Components) кнопкой<strong>+ Добавить</strong>(+Add) добавляем<strong>Skeletal Mesh</strong>. По аналогии с синим кубом открываем вкладку<strong>Skeletal Mesh Asset</strong>на панели<strong>Сведения</strong>(Details) и находим скелетную сетку сундука. Если модель кажется слишком большой, можно изменить её размер по всем осям в пункте<strong>Масштаб</strong>(Scale) в <strong>Сведениях</strong>(Details).</p>
111
<p>Разобравшись с импортом, создаём новый<strong>Класс Blueprint</strong>(Blueprint Class) типа<strong>Actor</strong>, даём ему название и открываем. В разделе<strong>Компоненты</strong>(Components) кнопкой<strong>+ Добавить</strong>(+Add) добавляем<strong>Skeletal Mesh</strong>. По аналогии с синим кубом открываем вкладку<strong>Skeletal Mesh Asset</strong>на панели<strong>Сведения</strong>(Details) и находим скелетную сетку сундука. Если модель кажется слишком большой, можно изменить её размер по всем осям в пункте<strong>Масштаб</strong>(Scale) в <strong>Сведениях</strong>(Details).</p>
112
<p>Далее открываем раздел<strong>Настройки класса</strong>(Class Settings) и в <strong>Сведениях</strong>(Details) находим параметр<strong>Интерфейсы</strong>(Interfaces). В пункте<strong>Использованные интерфейсы</strong>(Implemented Interfaces) нажимаем<strong>Добавить</strong>(Add) и с помощью поисковой строки выбираем блюпринт интерфейса, созданный ранее.</p>
112
<p>Далее открываем раздел<strong>Настройки класса</strong>(Class Settings) и в <strong>Сведениях</strong>(Details) находим параметр<strong>Интерфейсы</strong>(Interfaces). В пункте<strong>Использованные интерфейсы</strong>(Implemented Interfaces) нажимаем<strong>Добавить</strong>(Add) и с помощью поисковой строки выбираем блюпринт интерфейса, созданный ранее.</p>
113
Название блюпринта высвечивается при поиске<em>Скриншот: Unreal Editor / Epic Games</em><p>После этого в разделе<strong>Мои схемы</strong>(My Blueprint) появится новый интерфейс с названием выбранного блюпринта - BP_Interaction. Компилируем и переходим в <strong>Event Graph</strong>. Удаляем ноды, которые присутствуют по умолчанию, и создаём событие с функцией из блюпринта интерфейса, обозначенной ранее. В данном случае это<strong>Interaction</strong>.</p>
113
Название блюпринта высвечивается при поиске<em>Скриншот: Unreal Editor / Epic Games</em><p>После этого в разделе<strong>Мои схемы</strong>(My Blueprint) появится новый интерфейс с названием выбранного блюпринта - BP_Interaction. Компилируем и переходим в <strong>Event Graph</strong>. Удаляем ноды, которые присутствуют по умолчанию, и создаём событие с функцией из блюпринта интерфейса, обозначенной ранее. В данном случае это<strong>Interaction</strong>.</p>
114
<em>Скриншот: Unreal Editor / Epic Games</em><p>Чтобы событие проигрывало анимацию один раз, выбираем нод контроля исполнения<strong>Do Once</strong>. Далее создаём функцию<strong>Play Animation</strong>, которая отвечает за проигрыш анимации. Во вкладке<strong>New Anim to Play</strong>выбираем ассет анимации сундука.</p>
114
<em>Скриншот: Unreal Editor / Epic Games</em><p>Чтобы событие проигрывало анимацию один раз, выбираем нод контроля исполнения<strong>Do Once</strong>. Далее создаём функцию<strong>Play Animation</strong>, которая отвечает за проигрыш анимации. Во вкладке<strong>New Anim to Play</strong>выбираем ассет анимации сундука.</p>
115
Финальный вид схемы<em>Скриншот: Unreal Editor / Epic Games</em><p>Компилируем блюпринт и переходим в его вьюпорт. Нам нужно создать коллизию сундука. Нажав кнопку<strong>+ Добавить</strong>(+ Add), набираем в поиске<strong>Box Collision</strong>и подгоняем рамку c помощью настроек<strong>Преобразование</strong>(Transform) в <strong>Сведениях</strong>(Details) - так, чтобы сундук находился полностью внутри неё. На всякий случай не забудьте проверить пункт<strong>Готовые настройки коллизии</strong>(Collision Presets) в настройках коллизии Box: там должен быть выбран параметр<strong>OverlapAllDynamic</strong>.</p>
115
Финальный вид схемы<em>Скриншот: Unreal Editor / Epic Games</em><p>Компилируем блюпринт и переходим в его вьюпорт. Нам нужно создать коллизию сундука. Нажав кнопку<strong>+ Добавить</strong>(+ Add), набираем в поиске<strong>Box Collision</strong>и подгоняем рамку c помощью настроек<strong>Преобразование</strong>(Transform) в <strong>Сведениях</strong>(Details) - так, чтобы сундук находился полностью внутри неё. На всякий случай не забудьте проверить пункт<strong>Готовые настройки коллизии</strong>(Collision Presets) в настройках коллизии Box: там должен быть выбран параметр<strong>OverlapAllDynamic</strong>.</p>
116
Белым отмечен пункт в настройках коллизии Box, который нужно проверить<em>Скриншот: Unreal Editor / Epic Games</em><p>Добавим в блюпринт описание - наподобие тех, что встречаются в туториалах. Кнопкой<strong>+ Добавить</strong>(+ Add) добавляем элемент<strong>Text Render</strong>. Появившуюся надпись размещаем и настраиваем в <strong>Сведениях</strong>(Details) на своё усмотрение.</p>
116
Белым отмечен пункт в настройках коллизии Box, который нужно проверить<em>Скриншот: Unreal Editor / Epic Games</em><p>Добавим в блюпринт описание - наподобие тех, что встречаются в туториалах. Кнопкой<strong>+ Добавить</strong>(+ Add) добавляем элемент<strong>Text Render</strong>. Появившуюся надпись размещаем и настраиваем в <strong>Сведениях</strong>(Details) на своё усмотрение.</p>
117
Добавление текста к текущему объекту<em>Скриншот: Unreal Editor / Epic Games</em><p>Компилируем полученный результат. Теперь прописываем действие ввода клавиши F, как мы делали это для взаимодействия с кубом, и добавляем контекст назначения в уже знакомый нам файл<strong>IMC_Default</strong>.</p>
117
Добавление текста к текущему объекту<em>Скриншот: Unreal Editor / Epic Games</em><p>Компилируем полученный результат. Теперь прописываем действие ввода клавиши F, как мы делали это для взаимодействия с кубом, и добавляем контекст назначения в уже знакомый нам файл<strong>IMC_Default</strong>.</p>
118
<em>Скриншот: Unreal Editor / Epic Games</em><p>Закончив все подготовительные процессы, возвращаемся в блюпринт персонажа, чтобы прописать ему действие - открытие сундука.</p>
118
<em>Скриншот: Unreal Editor / Epic Games</em><p>Закончив все подготовительные процессы, возвращаемся в блюпринт персонажа, чтобы прописать ему действие - открытие сундука.</p>
119
<p>Создаём ивент для клавиши<strong></strong>F - набираем в поисковой строке действие ввода, в данном случае -<strong>IA_Open</strong>. Из списка выбираем нод, который относится к <strong>Enhanced Action Events</strong>. Связываем его с узлом цикла<strong>For Each Loop With Break</strong>. К слоту<strong>Array</strong>присоединяем<strong>Get Overlapping Actors</strong>, тем самым проверяя столкновение с другими акторами. При столкновении у игрока появится возможность взаимодействовать с объектом, в котором заложен интерфейс, поэтому к <strong>Array Element</strong>присоединяем функцию<strong>Does Object Implement Interface</strong>. В фиолетовом слоте указываем название блюпринта интерфейса, у нас это<strong>BP_Interaction</strong>.</p>
119
<p>Создаём ивент для клавиши<strong></strong>F - набираем в поисковой строке действие ввода, в данном случае -<strong>IA_Open</strong>. Из списка выбираем нод, который относится к <strong>Enhanced Action Events</strong>. Связываем его с узлом цикла<strong>For Each Loop With Break</strong>. К слоту<strong>Array</strong>присоединяем<strong>Get Overlapping Actors</strong>, тем самым проверяя столкновение с другими акторами. При столкновении у игрока появится возможность взаимодействовать с объектом, в котором заложен интерфейс, поэтому к <strong>Array Element</strong>присоединяем функцию<strong>Does Object Implement Interface</strong>. В фиолетовом слоте указываем название блюпринта интерфейса, у нас это<strong>BP_Interaction</strong>.</p>
120
Промежуточный вариант схемы<em>Скриншот: Unreal Editor / Epic Games</em><p>От нода<strong>For Each Loop with Break</strong>выводим уже знакомый нам нод<strong>Branch</strong>. Из слота<strong>True</strong>выводим нод и в поисковой строке набираем<strong>Message</strong>. Нам нужен класс с названием блюпринта взаимодействия (в данном случае Interaction) с припиской Message. Связываем слот<strong>Target</strong>c <strong>Array Element</strong>и протягиваем из слота исполнения нить к слоту<strong>Break</strong>узла<strong>For Each Loop With Break</strong>, чтобы завершить цикл. Итоговая схема выглядит так.</p>
120
Промежуточный вариант схемы<em>Скриншот: Unreal Editor / Epic Games</em><p>От нода<strong>For Each Loop with Break</strong>выводим уже знакомый нам нод<strong>Branch</strong>. Из слота<strong>True</strong>выводим нод и в поисковой строке набираем<strong>Message</strong>. Нам нужен класс с названием блюпринта взаимодействия (в данном случае Interaction) с припиской Message. Связываем слот<strong>Target</strong>c <strong>Array Element</strong>и протягиваем из слота исполнения нить к слоту<strong>Break</strong>узла<strong>For Each Loop With Break</strong>, чтобы завершить цикл. Итоговая схема выглядит так.</p>
121
<em>Скриншот: Unreal Editor / Epic Games</em><p>Компилируем блюпринт. Размещаем блюпринт сундука в сцене. Запускаем проигрыватель и смотрим результат.</p>
121
<em>Скриншот: Unreal Editor / Epic Games</em><p>Компилируем блюпринт. Размещаем блюпринт сундука в сцене. Запускаем проигрыватель и смотрим результат.</p>
122
Разовое открытие сундука клавишей F<p>Напоследок разберём ещё одну востребованную тему - создание интерактивного окружения на основе блюпринтов при помощи манипуляций со статическими мешами. В частности, как заставить меши вращаться по одной из осей.</p>
122
Разовое открытие сундука клавишей F<p>Напоследок разберём ещё одну востребованную тему - создание интерактивного окружения на основе блюпринтов при помощи манипуляций со статическими мешами. В частности, как заставить меши вращаться по одной из осей.</p>
123
<p>В следующем примере мы попробуем "оживить" мельницу - в играх часто встречаются вращающиеся лопасти. Модель возьмём из личного проекта. Если у вас нет подходящего ассета, вы вполне можете отработать этот приём с любым другим статическим мешем, например с доской<strong>SM_PillarFrame</strong>из набора<strong>Starter Content</strong>.</p>
123
<p>В следующем примере мы попробуем "оживить" мельницу - в играх часто встречаются вращающиеся лопасти. Модель возьмём из личного проекта. Если у вас нет подходящего ассета, вы вполне можете отработать этот приём с любым другим статическим мешем, например с доской<strong>SM_PillarFrame</strong>из набора<strong>Starter Content</strong>.</p>
124
<p>Создаём<strong>Класс Blueprint</strong>(Blueprint Class), в диалоговом окне выбираем<strong>Actor</strong>. В <strong>Компонентах</strong>(Components) добавляем два<strong>Static Mesh</strong>и в <strong>Сведениях</strong>(Details) назначаем для них ассеты. Один меш послужит основой для будущих лопастей (в нашем случае это меш башни мельницы), а второй как раз будет лопастями.</p>
124
<p>Создаём<strong>Класс Blueprint</strong>(Blueprint Class), в диалоговом окне выбираем<strong>Actor</strong>. В <strong>Компонентах</strong>(Components) добавляем два<strong>Static Mesh</strong>и в <strong>Сведениях</strong>(Details) назначаем для них ассеты. Один меш послужит основой для будущих лопастей (в нашем случае это меш башни мельницы), а второй как раз будет лопастями.</p>
125
<p>После загрузки ассетов во вьюпорт размещаем их таким образом, чтобы лопасти располагались на основе и могли вращаться, не задевая её.</p>
125
<p>После загрузки ассетов во вьюпорт размещаем их таким образом, чтобы лопасти располагались на основе и могли вращаться, не задевая её.</p>
126
Размещение ассетов во вьюпорте блюпринта<em>Скриншот: Unreal Editor / Epic Games</em><p>Также мы добавим ещё один компонент -<strong>RotatingMovement</strong>, который обеспечивает вращение. Но если сейчас оставить всё как есть, скомпилировать блюпринт и добавить его в сцену, то у нас будет крутиться на одном месте сама мельница. Чтобы задать вращение только лопастям, необходимо создать схему в <strong>Event Graph</strong>.</p>
126
Размещение ассетов во вьюпорте блюпринта<em>Скриншот: Unreal Editor / Epic Games</em><p>Также мы добавим ещё один компонент -<strong>RotatingMovement</strong>, который обеспечивает вращение. Но если сейчас оставить всё как есть, скомпилировать блюпринт и добавить его в сцену, то у нас будет крутиться на одном месте сама мельница. Чтобы задать вращение только лопастям, необходимо создать схему в <strong>Event Graph</strong>.</p>
127
<p>Связку начинаем с нода<strong>Event BeginPlay</strong>, так как анимация вращения происходит с момента запуска игры. Из него выводим нод<strong>Set Updated Component (Rotating Movement)</strong>с привязанным по умолчанию компонентом<strong>Rotating Movement</strong>. Теперь нам нужно задать компонент, к которому будет применяться вращение, - в данном случае это статический меш лопастей. Методом перетаскивания переносим его из меню<strong>Компоненты</strong>(Components) и присоединяем к слоту<strong>New Updated Component</strong>.</p>
127
<p>Связку начинаем с нода<strong>Event BeginPlay</strong>, так как анимация вращения происходит с момента запуска игры. Из него выводим нод<strong>Set Updated Component (Rotating Movement)</strong>с привязанным по умолчанию компонентом<strong>Rotating Movement</strong>. Теперь нам нужно задать компонент, к которому будет применяться вращение, - в данном случае это статический меш лопастей. Методом перетаскивания переносим его из меню<strong>Компоненты</strong>(Components) и присоединяем к слоту<strong>New Updated Component</strong>.</p>
128
<em>Скриншот: Unreal Editor / Epic Games</em><p>Теперь зададим направление вращения и скорость. Для этого нам нужно создать переменную. В разделе<strong>Переменные</strong>(Variables) создаём новую переменную кнопкой<strong>+</strong>и даём ей название. Нажимаем на вкладку, где по умолчанию стоит<strong>Булево значение</strong>(Boolean), с красным значком и меняем значение на <strong>Rotator</strong>(в списке отмечено сиреневым цветом).</p>
128
<em>Скриншот: Unreal Editor / Epic Games</em><p>Теперь зададим направление вращения и скорость. Для этого нам нужно создать переменную. В разделе<strong>Переменные</strong>(Variables) создаём новую переменную кнопкой<strong>+</strong>и даём ей название. Нажимаем на вкладку, где по умолчанию стоит<strong>Булево значение</strong>(Boolean), с красным значком и меняем значение на <strong>Rotator</strong>(в списке отмечено сиреневым цветом).</p>
129
<p>Из нода<strong>Rotating Movement</strong>выводим ещё один нод<strong>Set Rotation Rate</strong>. Связываем его с узлом<strong>Set Updated Component</strong>. В слоте с параметрами представлены три слота осей, по которым происходит вращение, и в них можно указать скорость лопастей. Но намного удобнее связать этот слот показателя значений с нодом переменной (её нужно перетащить в граф и при создании отметить<strong>Получить</strong>(Get).</p>
129
<p>Из нода<strong>Rotating Movement</strong>выводим ещё один нод<strong>Set Rotation Rate</strong>. Связываем его с узлом<strong>Set Updated Component</strong>. В слоте с параметрами представлены три слота осей, по которым происходит вращение, и в них можно указать скорость лопастей. Но намного удобнее связать этот слот показателя значений с нодом переменной (её нужно перетащить в граф и при создании отметить<strong>Получить</strong>(Get).</p>
130
<p>Теперь выделяем созданный узел переменной и в <strong>Сведениях</strong>(Details) ставим галочку напротив пункта<strong>Редактируемый экземпляр</strong>(<em>Instance Editable</em>). За счёт этого мы теперь сможем регулировать параметры блюпринта сразу в редакторе в панели<strong>Сведения</strong>(Details).</p>
130
<p>Теперь выделяем созданный узел переменной и в <strong>Сведениях</strong>(Details) ставим галочку напротив пункта<strong>Редактируемый экземпляр</strong>(<em>Instance Editable</em>). За счёт этого мы теперь сможем регулировать параметры блюпринта сразу в редакторе в панели<strong>Сведения</strong>(Details).</p>
131
Финальная схема и расположение пункта, который нужно отметить для переменной<em>Скриншот: Unreal Editor / Epic Games</em><p>Компилируем, сохраняем блюпринт, размещаем его в сцене. В <strong>Сведениях</strong>(Details) появится параметр с названием переменной, через который можно откорректировать направление и скорость движения объекта по оси. В текущем примере лопасти в проекте расположены вертикально, поэтому значение скорости указано в пункте оси Y.</p>
131
Финальная схема и расположение пункта, который нужно отметить для переменной<em>Скриншот: Unreal Editor / Epic Games</em><p>Компилируем, сохраняем блюпринт, размещаем его в сцене. В <strong>Сведениях</strong>(Details) появится параметр с названием переменной, через который можно откорректировать направление и скорость движения объекта по оси. В текущем примере лопасти в проекте расположены вертикально, поэтому значение скорости указано в пункте оси Y.</p>
132
Белой рамкой выделены настройки для направления и скорости вращения. Лопасти массивные, поэтому вращаются достаточно медленно<em>Скриншот: Unreal Editor / Epic Games</em><p>Теперь можно запустить симуляцию и проверить результат.</p>
132
Белой рамкой выделены настройки для направления и скорости вращения. Лопасти массивные, поэтому вращаются достаточно медленно<em>Скриншот: Unreal Editor / Epic Games</em><p>Теперь можно запустить симуляцию и проверить результат.</p>
133
При желании текущий блюпринт можно усовершенствовать - например, добавить задержку, чтобы лопасти вращались более реалистично.<p>Начинающий пользователь вполне может освоить программирование на блюпринтах. Один из главных залогов успеха в изучении - понимание логики построения связок нодов. Знание английского тоже не помешает: так будет проще найти нужную функцию, набрав её в поиске.</p>
133
При желании текущий блюпринт можно усовершенствовать - например, добавить задержку, чтобы лопасти вращались более реалистично.<p>Начинающий пользователь вполне может освоить программирование на блюпринтах. Один из главных залогов успеха в изучении - понимание логики построения связок нодов. Знание английского тоже не помешает: так будет проще найти нужную функцию, набрав её в поиске.</p>
134
<p>Как и любое программирование, блюпринты требуют хорошей теоретической базы. Помните, что большинство функций перешло из предыдущей версии движка, поэтому изучение блюпринтов на Unreal Engine 4 станет хорошим подспорьем в визуальном программировании на Unreal Engine 5.</p>
134
<p>Как и любое программирование, блюпринты требуют хорошей теоретической базы. Помните, что большинство функций перешло из предыдущей версии движка, поэтому изучение блюпринтов на Unreal Engine 4 станет хорошим подспорьем в визуальном программировании на Unreal Engine 5.</p>
135
<p>А напоследок оставим несколько ресурсов, которые помогут вам в дальнейшем изучении блюпринтов:</p>
135
<p>А напоследок оставим несколько ресурсов, которые помогут вам в дальнейшем изучении блюпринтов:</p>
136
<ul><li><a>Официальная документация</a>Unreal Engine.</li>
136
<ul><li><a>Официальная документация</a>Unreal Engine.</li>
137
<li><a>Уроки</a>по блюпринтам от канала Smart Poly - подойдут как для новичков, так и для продвинутых пользователей.</li>
137
<li><a>Уроки</a>по блюпринтам от канала Smart Poly - подойдут как для новичков, так и для продвинутых пользователей.</li>
138
<li><a>Руководство</a>на Habr, посвящённое созданию игры по сбору объектов на UE4.</li>
138
<li><a>Руководство</a>на Habr, посвящённое созданию игры по сбору объектов на UE4.</li>
139
<li><a>Экспресс-курс</a>о создании игры на UE4 и UE5 с помощью блюпринтов от канала Cyberstars. Также на этом канале можно найти много полезной информации по изучению движка.</li>
139
<li><a>Экспресс-курс</a>о создании игры на UE4 и UE5 с помощью блюпринтов от канала Cyberstars. Также на этом канале можно найти много полезной информации по изучению движка.</li>
140
<li><a>Плейлист с туториалами</a>по созданию множества действий, актуальных для игр на Unreal Engine 5, от канала Gorka Games.</li>
140
<li><a>Плейлист с туториалами</a>по созданию множества действий, актуальных для игр на Unreal Engine 5, от канала Gorka Games.</li>
141
</ul><a>Научитесь: Профессия Разработчик игр на Unreal Engine с нуля до Middle Узнать больше</a>
141
</ul><a>Научитесь: Профессия Разработчик игр на Unreal Engine с нуля до Middle Узнать больше</a>