Туториал по Unreal Engine для новичков. Часть 2: Blueprints

Автор оригинала: Tommy Tran

Blueprints — это система визуального скриптинга Unreal Engine 4. Она является быстрым способом создания прототипов игр. Вместо построчного написания кода всё можно делать визуально: перетаскивать ноды (узлы), задавать их свойства в интерфейсе и соединять их «провода».

Кроме быстрого прототипирования, Blueprints также упрощают создание скриптов для непрограммистов.

В этой части туториала мы будем использовать Blueprints для следующих операций:

  • Настройка камеры с видом сверху
  • Создание управляемого игроком актора с простыми движениями
  • Настройка ввода игрока
  • Создание элемента, исчезающего при контакте с игроком

Примечание:в этой части предполагается, чтоб вы знаете интерфейс Unreal Engine 4. Вы должны понимать основные концепции Blueprint, такие как компоненты и ноды. Если вам нужно освежить знания, то прочитайтепервую часть туториала по Unreal Engine 4.

В этой части также используются векторы. Если вы с ними незнакомы, то рекомендуюэтустатью про векторы на gamedev.net.

Примечание:эта статья является одной из восьми частей туториала, посвящённого Unreal Engine:

Приступаем к работе

Скачайтеначальный проекти распакуйте его. Чтобы открыть проект, перейдите в папку проекта и откройтеBananaCollector.uproject.

Примечание:если откроется окно, сообщающее, что проект создан в более ранней версии Unreal editor, то всё в порядке (движок часто обновляется). Можно или выбрать опцию создания копии, или опцию преобразования самого проекта.

На рисунке ниже показана сцена. Именно в ней игрок будет перемещаться и собирать предметы.

scene

Для простоты навигации я разбил файлы проекта на папки, как показано на рисунке:

Content Browser

Выделенную красным кнопку можно использовать, чтобы показать или скрыть панель исходников.

Создание игрока

В Content Browser перейдите к папкеBlueprints. Нажмите на кнопкуAdd Newи выберитеBlueprint Class.

Мы хотим, чтобы актор получал вводимую игроком информацию, поэтому нам подходит классPawn. Выберите во всплывающем окнеPawnи назовите егоBP_Player.

Parent Class

Примечание:классCharacterтоже подойдёт. В нём даже по умолчанию есть компонент перемещения. Однако мы будем реализовывать собственную систему движения, поэтому классаPawnнам достаточно.

Прикрепление камеры

Камера — это способ игрока смотреть на мир. Мы создадим камеру, смотрящую на игрока сверху вниз.

В Content Browserдважды нажмитенаBP_Player, чтобы открыть его в Blueprint editor.

Для создания камеры перейдите на панель Components. Нажмите наAdd Componentи выберитеCamera.

Components

Чтобы камера смотрела сверху вниз, нужно расположить её над игроком. Выбрав компонент камеры, перейдите во вкладку Viewport.

Активируйте манипулятор перемещения, нажав клавишуW, а затем переместите камеру в(-1100, 0, 2000). Или же можно ввести координаты в поляLocation. Она находится в разделеTransformпанели Details.

example

Если вы потеряли камеру из виду, нажмите клавишуF, чтобы сфокусироваться на ней.

Затем активируйте манипулятор поворота, нажав клавишуE. Поверните камеру вниз на-60градусов по осиY.

Туториал по Unreal Engine для новичков. Часть 2: Blueprints

Отображаем игрока

Мы обозначим персонажа игрока красным кубом, поэтому для его отображения нужно будет использовать компонент Static Mesh.

Во-первых, снимите выделение с компонентаCamera, нажавлевой клавишей мышана пустом пространстве в панели Components. Если этого не сделать, то следующий добавленный компонент будет дочерним по отношению к камере.

Нажмите наAdd Componentи выберитеStatic Mesh.

Components

Чтобы отобразить красный куб, выберите компонентStatic Mesh, а затем перейдите во вкладку Details. Нажмите нараскрывающийся список, находящийся справа отStatic Meshи выберитеSM_Cube.

Details

Вы должны увидеть следующее (можно нажатьFвнутри Viewport, чтобы сфокусироваться на кубе, если вы его не видите):

Red cube

Теперь настало время заспаунить актора Pawn игрока. Нажмите наCompileи вернитесь к основному редактору.

Спаун игрока

Чтобы игрок мог управлять Pawn, нужно указать две вещи:

  1. Класс Pawn, которым будет управлять игрок
  2. Место спауна Pawn

Первую задачу можно выполнить, создав новый классGame Mode.

Создание Game Mode

Класс Game Mode (игровой режим) — это класс, управляющий тем, как игрок входит в игру. Например, в многопользовательской игре Game Mode используется для задания спауна каждого игрока. Что более важно, Game Mode определяет, какой Pawn будет использовать игрок.

Перейдите к Content Browser и зайдите в папкуBlueprints. Нажмите на кнопкуAdd Newи выберитеBlueprint Class.

Во всплывающем меню выберитеGame Mode Baseи назовите егоGM_Tutorial.

Parent Class

Теперь нужно указать, какой класс Pawn будет использоваться по умолчанию.Дважды нажмитенаGM_Tutorial, чтобы открыть его.

Перейдите на панель Details и загляните в разделClasses. Нажмите нараскрывающийся списокDefault Pawn Classи выберитеBP_Player.

Details

Чтобы использовать новый Game Mode, нужно сообщить уровню, какой Game Mode он должен использовать. Это можно указать вWorld Settings. Нажмите наCompileи закройте Blueprint editor.

Каждый уровень имеет собственные параметры. Получить доступ к этим параметрам можно, выбравWindow\World Settings. Или же можно зайти в Toolbar и выбратьSettings\World Settings.

toolbar

Рядом со вкладкой Details откроется новая вкладка World Settings. В ней нажмите нараскрывающийся списокGameMode Overrideи выберитеGM_Tutorial.

World Setting

Теперь вы увидите, что классы сменились на те, которые выбраны вGM_Tutorial.

Game Mode

Наконец, нам нужно задать точку спауна игрока. Это реализуется размещением на уровне актораPlayer Start.

Размещение Player Start

В процессе спауна игрока Game Mode ищет актор Player Start. Если Game Mode находит его, то предпринимает попытку заспаунить игрока там.

Чтобы разместить Player Start, перейдите к панели Modes и найдитеPlayer Start.Нажмите левой клавишейи перетащитеPlayer Startиз панели Modes во Viewport. Отпустителевую клавишу мыши, чтобы разместить его.

example

Можете разместить его где угодно. Когда закончите, перейдите в Toolbar и нажмитеPlay. Вы будете заспаунены в точке расположения Player Start.

example

Чтобы выйти из игры, нажмите кнопкуStopв Toolbar или нажмите клавишуEsc. Если вы не видите курсор, нажмитеShift+F1.

Это не похоже на игру, если мы не можем двигаться. Наша следующая задача — настроить параметры ввода.

Настройка ввода

Назначение клавиши действию называется привязкой клавиши.

В Unreal можно настроить привязки клавиш, чтобы при их нажатии срабатывалисобытия. События — это ноды, выполняющиеся при определённых действиях (в этом случае — при нажатии указанной клавиши). При срабатывании события выполняются все ноды, соединённые с событием.

example blueprints

Такой способ привязки клавиш удобен, потому что он означает, что нам не нужно жёстко задавать клавиши в коде.

Например, можно привязать нажатие левой клавиши мыши и назвать её Shoot. Любой актор, умеющий стрелять, может использовать событие Shoot, чтобы знать, когда игрок нажимает на левую клавишу мыши. Если вы хотите изменить клавишу, то это можно сделать в параметрах ввода.

Туториал по Unreal Engine для новичков. Часть 2: Blueprints

Если мы будем задавать клавиши жёстко, то нам придётся заходить в каждый актор и менять клавиши отдельно.

Привязка осей и действий

Чтобы перейти к параметрам ввода, зайдите вEdit\Project Settings. В разделеEngineвыберите слеваInput.

Engine

В разделеBindingsвыполняется настройка ввода.

Engine - Input

Unreal предоставляет два способа создания привязок клавиш:

  • Привязка действий:они могут находиться всего в двух состояниях — нажато и не нажато. События действий срабатывают только когда вы нажимаете или отпускаете клавишу. Используются для действий, не имеющих промежуточных состояний, например, для стрельбы из пушки.
  • Привязка осей:оси передают на выход численное значение, называемоезначением оси(подробнее об этом позже). События оси срабатывают каждый кадр. Обычно используются для действий, требующих управления стиками или мышью.

В этом туториале мы будем использовать привязкиосей.

Создание привязок движения

Во-первых, мы создадим двегруппы привязки осей. Группы позволяют привязывать несколько клавиш к одному событию.

Для создания новойгруппы привязки осейнажмите на значок+справа отAxis Mappings. Создайте две группы и назовите ихMoveForwardиMoveRight.

Engine - Input

MoveForwardбудет управлять движением вперёд и назад.MoveRightбудет управлять движением влево и вправо.

Мы привяжем движение к четырём клавишам:W,A,SиD. Пока у нас есть только два слота для привязки клавиш. Добавим к каждой группе ещё однупривязку осей, нажав на значок+рядом с полемимени группы.

Engine - Input

Чтобы привязать клавишу, нажмите нараскрывающийся списокс перечислением клавиш. Привяжите клавишиWиSкMoveForward. Привяжите клавишиAиDкMoveRight.

Туториал по Unreal Engine для новичков. Часть 2: Blueprints

Теперь нужно задать значения в поляхScale.

Значение оси и масштаб ввода

Перед заданием полей Scale нам нужно больше узнать о том, как работать созначениями осей.

Значение оси — это численное значение, определяемое типом ввода и способом его использования. При нажатии на кнопки и клавиши на выход подаётся 1. Стики имеют выходные значения от -1 до 1, зависящие от направления и наклона стика.

example

Мы можем использовать значение оси для управления скоростью Pawn. Например, если мы нажмём стик до упора, то значение оси будет 1. Если нажать наполовину, то значение будет 0.5.

Умножая значение оси на переменную скорости, мы можем регулировать с помощью стика скорость движения.

example

Также значение оси можно использовать для задания направления вдоль оси. Если умножить скорость Pawn на положительное значение оси, то мы получим положительное смещение. При использовании отрицательного значения оси получим отрицательное смещение. Прибавляя это смещение к местонахождению Pawn, мы задаём направление его движения.

example

Клавиши клавиатуры могут подавать на выход только значения 1 или 0, то можно использоватьscaleдля преобразования их в отрицательные числа. Это можно сделать, взяв значение оси и умножив его на масштаб.

Умножив положительное (значение оси) на отрицательный (масштаб), мы получим отрицательное значение.

Задайте масштаб клавишSиA, нажав на полеScaleи введя-1.

Engine - Input

Теперь начинается интересное: заставим Pawn двигаться! Закройте Project Settings и откройтеBP_Playerв Blueprints editor, дважды нажав на него.

Перемещение игрока

Сначала нам нужно выбрать события для привязок движения.Нажмите правой клавишей мышина пустом пространстве в Event Graph, чтобы открыть список нодов. Найдите в этом менюMoveForward. Добавьте нодMoveForwardиз спискаAxis Events. Учтите, что вам нужен красный нод в Axis Events, а не зелёный нод в Axis Values.

Повторите процесс дляMoveRight.

blueprints

Теперь мы настроим ноды дляMoveForward.

Использование переменных

Для перемещения необходимо указать, с какой скоростью будет двигаться Pawn. Один из простых способов указания скорости — хранение её впеременной.

Чтобы создать переменную, зайдите во вкладку My Blueprint и нажмите на значок+в правой части разделаVariables.

My Blueprint

Выбрав новую переменную, перейдите во вкладку Details. Измените имя переменной наMaxSpeed. После этого замените тип переменной наFloat. Для этого нужно нажать нараскрывающийся списокрядом сVariable Typeи выбратьFloat.

Details

Теперь необходимо задать значение по умолчанию. Но чтобы его задать, нужно будет нажатьCompileв Toolbar.

Выбрав переменную, перейдите ко вкладке Details. Зайдите в разделDefault Valueи измените значениеMaxSpeedпо умолчанию на10.

Default Value

ЗатемперетащитепеременнуюMaxSpeedиз вкладки My Blueprint на Event Graph. Выберите из меню пунктGet.

My Blueprint

Теперь нужно умножитьMaxSpeedназначение оси, чтобы получить конечную скорость и направление. Добавим нодfloat * floatи присоединим к немуAxis ValueиMaxSpeed.

Туториал по Unreal Engine для новичков. Часть 2: Blueprints

Получение направления игрока

Чтобы двигаться вперёд, нам нужно знать, куда смотрит Pawn. К счастью, в Unreal есть для этого нод. Добавьте нодGet Actor Forward Vector.

example

Затем добавьте нодAdd Movement Input. Этот нод получает направление и значение, преобразуя их в хранимое смещение. Соедините ноды следующим образом:

example

Белая линия обозначает цепочку выполнения. Другими словами, когда игрок перемещает ось ввода, то генерируется событие, выполняющее нодInputAxis MoveForward. Белая линия показывает, что после этого выполняется нодAdd Movement Input.

НодAdd Movement Inputполучает на входе следующие данные:

  • Target: задайте self, что в нашем случае является персонажем игрока (красным кубом).
  • World Direction: направление для движения цели, которое в нашем случае является направлением, в котором смотрит игрок.
  • Scale Value: как далеко мы двигаем игрока, в нашем случае это макс_скорость * значение_оси (которое, как мы помним, является значением в интервале от -1 до 1).

Повторим процесс дляMoveRight, но заменимGet Actor Forward VectorнаGet Actor Right Vector. Попробуйте сделать всё сами, не сверяясь с вышеприведёнными инструкциями!

example

Добавление смещения

Чтобы действительно двигать Pawn, нам нужно получить смещение, вычисленное Add Movement Input, и прибавить его к местоположению Pawn.

В сущности, наша стратегия будет заключаться в перемещении игрока на небольшую величину в каждом кадре игры, поэтому нам нужно добавить перемещение к событиюEvent Tick, которое генерируется каждый кадр.

Перейдите к нодуEvent Tickв Event Graph. Он должен быть неактивным и находиться слева, но если его нет, то создайте нод самостоятельно.

example

Добавление смещения

Чтобы действительно двигать Pawn, нам нужно получить смещение, вычисленное Add Movement Input, и прибавить его к местоположению Pawn.

В сущности, наша стратегия будет заключаться в перемещении игрока на небольшую величину в каждом кадре игры, поэтому нам нужно добавить перемещение к событиюEvent Tick, которое генерируется каждый кадр.

Перейдите к нодуEvent Tickв Event Graph. Он должен быть неактивным и находиться слева, но если его нет, то создайте нод самостоятельно.

example

Это означает, что в каждом кадре игры мы будем сохранять весь ввод перемещения и прибавлять его к текущему местоположению актора.

НажмитеCompile, перейдите к основному редактору и нажмите наPlay. Теперь вы можете двигаться в сцене!

example

Однако у нас есть небольшая проблема. Мощные компьютеры могут рендерить кадры с большей частотой. Event Tick вызывается каждый кадр, поэтому ноды перемещения будут выполняться чаще. Это значит, что Pawn будет двигаться на мощных компьютерах быстрее, и наоборот.

Чтобы решить эту проблему, наше движение должно бытьнезависимым от частоты кадров.

Примечание:я настроил привязки клавиш, чтобы показать влияние зависимости от частоты кадров. Нажмите0, чтобы ограничить частоту 60 кадрами в секунду, и нажмите1, чтобы снять ограничение. Попробуйте перемещаться при обоих частотах кадров и вы заметите разницу в скорости.

Независимость от частоты кадров

Независимость от частоты кадров означает, что мы постоянно будем получать одинаковые результаты, вне зависимости от частоты кадров. К счастью, достичь такой независимости в Unreal очень просто.

Выйдите из игры, а затем откройтеBP_Player. Затем перейдите к узлуEvent Tickи посмотрите наDelta Seconds.

Event Tick

Delta Seconds — это величина времени, прошедшего после предыдущего Event Tick. Умножив смещение на Delta Seconds, мы сделаем перемещение независимым от частоты кадров.

Например, наш Pawn имеет максимальную скорость 100. Если после предыдущего Event Tick прошла одна секунда, то Pawn переместится на полные 100 единиц. Если прошли полсекунды, то он переместится на 50 единиц.

example

Если движение зависимо от частоты кадров, то Pawn будет перемещаться на 100 единиц в каждом кадре, вне зависимости от времени между кадрами.

Чтобы умножить смещение на Delta Seconds, добавьте нодvector * float. После этого соедините ноды следующим образом:

example

Время между кадрами (Delta Seconds) очень мало, поэтому Pawn будет двигаться намного медленнее. Это можно исправить, заменив значениеMaxSpeedпо умолчанию на600.

Default Value

Поздравляю вам удалось добиться независимости от частоты кадров!

Можно заметить, что куб проходить сквозь все объекты. Чтобы исправить это, нам нужно познакомиться сколлизиями.

Надевайте шлем, потому что сейчас нам придётсястолкнутьсяс теорией!

Коллизии актора

Когда мы вспоминаем о столкновениях, то представляем автомобильные аварии. К счастью, коллизии в Unreal намного безопаснее.

Чтобы иметь возможность сталкиваться с объектами, актору нужно обозначение его пространства столкновений (обычно называемого коллизией). Можно использовать одно из следующих пространств:

  • Меш коллизии:они автоматически генерируются (если выбрать такую опцию) при импорте мешей. Пользователь также может создать в 3D-редакторе произвольный меш коллизии. У красного куба уже есть автоматически сгенерированный меш коллизии.
  • Компоненты коллизии:они могут иметь одну из трёх форм: параллелепипед, капсула и сфера. Их можно добавлять на панели Components. Обычно используются для простых коллизий.

Ниже представлен пример персонажа и его коллизии.

example

Коллизия происходит, когда коллизия актора касается коллизии другого актора.

Туториал по Unreal Engine для новичков. Часть 2: Blueprints

Теперь настало время включить коллизии.

Включение коллизий

Вы, наверно, недоумеваете, почему куб не сталкивается с объектами, хотя у него есть меш коллизии. При перемещении актора Unreal учитывает для коллизий толькокорневойкомпонент. Поскольку корневой компонент Pawn не имеет коллизии, он проходит сквозь все объекты.

Примечание:актор, не имеющий коллизии в корневом компоненте, всё равно может блокировать других акторов. Но еслиперемещатьактора, то он не будет ни с чем сталкиваться.

Итак, чтобы использовать меш коллизии,StaticMeshдолжен бытькорневым. Для этого перейдите в панель Components. Затемзажмите левую клавишу мышииперетащитеStaticMeshнаDefaultSceneRoot. Отпустителевую клавишу мыши, чтобы сделатьStaticMeshновым корневым компонентом.

components

Чтобы коллизии начали работать, нужно выполнить ещё одно действие. Переключитесь на Event Graph и перейдите к узлуAddActorLocalOffset. Найдите входSweepи измените значение наtrue,нажав левой клавишей мышинафлажок.

AddActorLocalOffset

AddActorLocalOffsetзанимается тем, что телепортирует актора в новое место.Sweepгарантирует, что актор будет сталкиваться со всем, что находится между старым и новым местоположением.

Перейдите в основной редактор и нажмите наPlay. Теперь куб будет реагировать на коллизии с уровнем!

example

Последнее, что мы создадим — этопредмет, исчезающий при контакте с персонажем игрока.

Создание предмета

В общем случае предметом является любой собираемый игроком объект. Мы используем в качестве предметаBP_Banana.

Чтобы распознать контакт куба и предмета, нам нужен нод события, срабатывающего при коллизии. Для генерирования таких событий можно использоватьреакции на коллизи.

Реакция на коллизию также определяет, как актор реагирует на коллизию с другим актором. Существует три типа реакций на коллизии:Ignore,OverlapиBlock. Вот как они взаимодействуют друг с другом:

example

Хотя здесь можно использовать и Overlap, и Block, в этом туториале мы будем использовать только Overlap.

Задание реакции на коллизию

Закройте игру и откройтеBP_Banana. Выберите компонентStaticMesh, а затем перейдите в панель Details. Реакции на коллизии задаются в разделеCollision.

Details

Как вы видите, большинство параметров неактивно. Чтобы сделать их изменяемыми,нажмитенараскрывающийся списокрядом сCollision Presets. Выберите в спискеCustom.

example

Теперь нам нужно указать реакцию на коллизию между предметом и кубом.

Компоненты имеют атрибут под названиемobject type(тип объекта). Тип объекта — это просто удобный способ группировки похожих акторов. Подробнее о типах объектов можно прочитатьздесь.

Куб имеет типWorldDynamic, поэтому нам нужно изменить реакцию на коллизию этого типа. В разделеCollision Responsesизмените реакцию на коллизиюWorldDynamicнаOverlap. Это можно сделать,нажавнасредний флажоксправа отWorldDynamic.

example

Обработка коллизий

Для обработки коллизий нужно использовать событиеналожения. Перейдите в панель Components инажмите правой клавишей мышинаStaticMesh. В контекстном меню выберитеAdd Event\Add OnComponentBeginOverlap.

Components

Так мы добавим в Event Graph нодOnComponentBeginOverlap (StaticMesh).

nod-OnComponentBeginOverlap(StaticMesh)

Наконец, создадим нодDestroyActorи соедините его с нодомOnComponentBeginOverlap (StaticMesh). Как можно догадаться по названию, он удаляет целевой актор из игры. Однако поскольку целевого актора нет, он уничтожит актор,вызвавшийего.

example

Размещение предмета

Закройте Blueprint editor и перейдите в папкуBlueprints.

Начните располагать бананы на уровнезажав левую клавишу мышииперетаскиваяBP_Bananaво Viewport.

Туториал по Unreal Engine для новичков. Часть 2: Blueprints

НажмитеPlayи начните собирать бананы!

Туториал по Unreal Engine для новичков. Часть 2: Blueprints

Куда двигаться дальше?

Готовый проект можно скачатьотсюда.

Вы сделали ещё один шаг к тому, чтобы стать специалистом по Unreal Engine.

Если вы хотите продолжить обучение, то прочитайтеследующий пост в серии, где мы подробнее рассмотрим материалы Unreal Engine.

Перевод

Поделится

Добавить комментарий

Мы используем cookie-файлы для наилучшего представления нашего сайта. Продолжая использовать этот сайт, вы соглашаетесь с использованием cookie-файлов.
Принять