Unreal Engine 4. Учебник для начинающих, часть 2: Blueprints Tutorial
В этом уроке, посвященном Unreal Engine 4 вы узнаете, как использовать Blueprints для создания игрового персонажа игрока и настройки его взаимодействий с различными объектами.
Blueprints – это своего рода система визуальных событий в Unreal Engine 4, которая позволяет быстро создать прототип вашей игры. Вместо того, чтобы писать подробный код, вам достаточно сделать визуальную поведенческую модель: создать и разместить узлы, а также соединить их в зависимости от последовательности событий и установить каждому определенные свойства.
Помимо того, что Blueprints является довольно быстрым и простым инструментом для создания прототипов, он также позволяет людям без навыков программирования самостоятельно создавать собственные игры и сценарии.
В этом уроке вы научитесь использовать Blueprints для:
- Установки вида камеры в пространстве;
- Создания игрового персонажа с набором базовых движений;
- Создания функций и свойств для игрового персонажа;
- Создания объекта, который будет исчезать при взаимодействии с ним игровым персонажем.
Примечание: В этом руководстве предполагается, что вы уже знаете, как ориентироваться в интерфейсе Unreal Engine 4. Из предыдущего урока вы должны были узнать основные понятия Blueprint, такие как компоненты и узлы. При необходимости вы можете посмотреть материал предыдущего занятия еще раз, чтобы освежить ваши знания. Также, если вам нужна переподготовка, то мы рекомендуем ознакомьтесь с нашим руководством для начинающих по Unreal Engine 4.
Это учебное руководство также основано на использовании векторов. Если Вы не знакомы с векторами, я рекомендую эту статью с gamedev.net
Это занятие является частью серии, которая состоит из 10 уроков, посвященных Unreal Engine:
Начало работы
В первую очередь вам необходимо скачать и разархивировать стартовый проект.
Для того, чтобы открыть его, вам нужно перейти в корневую папку, где находится скаченный файл BananaCollector.uproject и открыть его.
Примечание: Не пугайтесь, если вы увидите системное сообщение о том, что проект был создан с использованием более ранней версии программы Unreal, это нормально (для редактора часто выходят обновления).
Вы можете выбрать один из вариантов: «открыть копию», или «преобразовать» файл.
Посмотрите, так должна выглядеть игровая локация по которой в дальнейшем будет передвигаться персонаж и взаимодействовать с разными объектами.
Для вашего удобства все файлы проекта разбиты на категории и помещены в соответствующие папки, как на этом изображении:
Вы можете использовать фильтры для быстрой сортировки и поиска файлов, либо кнопку, обозначенную на картинке красным цветом для того, чтобы показать или скрыть панель источников материалов.
Создание персонажа
Для того, чтобы создать игрового персонажа вам нужно в меню Content Browser перейдите в папку «Blueprints» и нажать кнопку «Add New», выбрав команду «Blueprint Class».
Для того, чтобы вы могли в дальнейшем вносить редактируемые свойства для персонажа, вам необходимо выбрать класс «Pawn». Итак, выбирайте Pawn в появившемся окне и переименуйте его в «BP_Player».
Справка: Класс Character также подойдет для этих целей, кроме того, он может активировать команду движения по умолчанию. Однако в этот раз вы будете создавать свою собственную систему передвижения, поэтому класса Pawn будет достаточно.
Прикрепление камеры
Камера является своего рода способом для игрока осматривать игровое пространство. Сейчас вам нужно будет создать камеру с видом сверху. Для этого откройте двойным нажатием левой кнопки мыши BP_Player в Content Browser. Теперь вы можете приступить к редактированию.
Чтобы создать камеру вам нужно перейти к панели «Components», нажать «Add Component» и выбрать «Camera».
Для того, чтобы создать обзор сверху, необходимо разместить камеру непосредственно над плеером. Для этого выбирайте компонент камеры и переходите на вкладку Viewport.
Теперь активируйте манипулятор перемещения, нажав клавишу W, а затем переместите его в положение с координатами (-1100, 0, 2000). Вы также можете вписать эти значения в поля «Location», которое находится в разделе «Transform» на панели «Details».
Если вы потеряли из виду камеру, просто нажмите клавишу «F», чтобы сфокусироваться на ней. Вам также нужно активировать манипулятор вращения, нажав клавишу «E» и повернуть камеру на -60 градусов по оси Y.
Образ и расположение персонажа
Красный куб будет представлять собой игрового персонажа, поэтому вам нужно будет использовать компонент «Static Mesh» для его отображения.
Сначала отмените выбор компонента «Camera», щелкнув левой кнопкой мыши пустое место в области «Components». Это необходимо сделать для того, чтобы новый добавленный элемент не стал дополнительным компонентом камеры. Теперь нажмите «Add Component» и выберите «Static Mesh».
Вам необходимо выбрать компонент «Static Mesh» и перейти к вкладке «Details». В появившемся справа от Static Mesh меню выбирайте пункт SM_Cube, для того, чтобы в игровом пространстве получить отображение красного куба.
В конечном итоге вы должны увидеть такое изображение (напоминаем, если вы потерялись в пространстве редактора, нажмите «F», чтобы быстро переместится к месту камеры):
Теперь пришло время создать нового игрового персонажа с именем Pawn. Для сохранения результата вам нужно нажать кнопку Compile и вернуться в главный редактор.
Создание персонажа
Прежде чем игрок сможет контролировать своего персонажа, необходимо указать несколько важных вещей:
- Тип персонажа, которым игрок будет управлять;
- Место, где этот персонаж появится при старте игры.
Создание игрового режима
Игровой режим — это класс, который контролирует, как персонаж появляется в игре. Например, в многопользовательских играх необходимо применить специальный игровой режим который будет определять появление каждого игрока. Кроме того, игровой режим также определяет тип персонажа, которым будет пользоваться игрок.
Вам нужно перейти в Content Browser и найти папку Blueprints. Теперь нажмите кнопку Add New ⇒ Blueprint Class. В появившемся окне выберите Game Mode Base и назовите его GM_Tutorial.
Теперь вам нужно указать, какой класс персонаж Pawn будет использоваться по умолчанию. Для этого дважды щелкните GM_Tutorial, чтобы он открылся.
Перейдите на панель «Details» и в разделе «Classes» в появившемся списке «Default Pawn Class» выберите «BP_Player».
Прежде чем вы сможете использовать новый игровой режим, необходимо указать его для конкретного игрового уровня. Это делается в настройках игрового мира. Сейчас вам нужно нажать Compile и закрыть редактор Blueprint.
Каждый игровой уровень имеет свои настройки. Вы можете получить доступ к настройкам и изменять их по своему усмотрению, выбрав Window ⇒ World Settings. Другой вариант, как это можно сделать – перейти к панели инструментов и выбрать Settings ⇒ World Settings.
Новая вкладка World Settings откроется рядом с вкладкой Details. Тут вам нужно будет перейти к раскрывающемуся списку для изменения настроек GameMode и выбрать там GM_Tutorial.
Вы можете увидеть, что все классы изменились на те, которые вы выбрали в GM_Tutorial.
Наконец, вам нужно указать место, в котором где будет появляться игрок. Это делается при помощи специальной метки «Player Start» на карте.
Расположение метки Player Start
В процессе создания персонажа, система игрового режима автоматически ищет метку его расположения в игровом пространстве.
Для того, чтобы разместить Player Start, перейдите к панели управления и найдите там функцию Player Start. Теперь щелкните левой кнопкой мыши по Player Start и перетащите его из панели «Modes» в рабочую область, отпустите левую кнопку мыши.
Вы можете разместить метку в любом, понравившемся вам месте, а когда закончите, переходите на панель инструментов и нажимайте Play. Персонаж появится ровно в том месте, где вы установили метку Player Start.
Чтобы выйти из игрового режима, нажмите кнопку «Stop» на панели инструментов или клавишу «Esc» на клавиатуре. Кроме того, если вы не видите курсор, нажмите Shift + F1.
Следующей задачей будет настройка команды для движения игрового персонажа.
Настройка управления
Назначение команд для выполнения какого-либо действия называется привязкой ключа.
В Unreal вы можете настроить клавиши управления, которые будут выполнять определенное действие или вызывать событие при нажатии на них. События представляют собой это узлы, которые выполняются, когда происходят определенные действия (в этом случае, когда вы нажимаете связанную клавишу). Узлы, подключенные к событию выполняются после инициации события.
Этот метод связывания ключей подойдет даже ничего не понимающим в программировании людям, потому что не при этом не требуется прописывать специальный код. Например, вы связываете ключи при помощи левой кнопки мыши и называете это событие «Shoot». При желании, имя ключа можно изменить позже в его настройках.
Только представьте, насколько бы этот процесс был сложнее, если бы вы вводили для каждой команды специальный код.
Что такое Axis и Action Mappings
Для просмотра настроек ввода вам нужно перейти к Edit ⇒ Project Settings. Слева выберите Input в разделе Engine.
В разделе «Bindings» вы можете изменить данные входа.
В Unreal доступны два метода для создания привязок клавиш:
- Action Mapping (Отображение действий): при этом методе, функция имеет только два возможных состояния – активна или не активна. Все действия будут срабатывать только после того, как вы нажмете или отпустите клавишу. Обычно этот метод используется для действий, которые не имеют промежуточного состояния, таких, например, как стрельба из пистолета.
- Axis (Отображение оси): При выборе этого метода, программа будет показывать числовое значение, называемое значением оси (подробнее об этом позже). События Оси будут запускать каждый кадр, которые как правило используется для действий, требующих дополнительное устройство ввода (манипулятор или компьютерная мышь).
В этом уроке мы рассмотрим, как пользоваться методом Axis.
Создание Movement Mappings
Для начала вам нужно создать две группы отображения осей (Axis). Они дадут возможность создать несколько привязок ключей к одному событию.
Для того, чтобы создать новую группу axis осей, вам нужно нажать знак «+» сопоставлений осей. Назовите две новые группы и назовите их MoveForward и MoveRight.
MoveForward будет обрабатывать движение персонажа вперед и назад. MoveRight будет обрабатывать перемещение персонажа влево и вправо.
Вам нужно будет назначить для движения персонажа четыре стандартные клавиши: W, A, S и D. Добавьте еще одно сопоставление осей для каждой группы, щелкнув знак «+» рядом с соответствующем полем.
В окне редактора сопоставьте клавиши W и S с MoveForward и клавиши A и D с MoveRight.
Далее вам нужно установить поля Scale.
Функции Axis Value и Input Scale
Значение оси (Axis Value) — это числовое значение, которое определяется типом ввода и тем, как вы планируете его использовать. Посмотрите, как это выглядит на изображении ниже, чтобы лучше понимать, как распределяются числовые значения:
Вы также можете использовать значение Axis, чтобы контролировать скорость персонажа. Например, если вы сдвинете джойстик к краю, значение оси будет равно 1. Если вы поместите его посередине, значение будет равно 0,5.
Вы также можете использовать значение Axis, чтобы указать направление движения. Формула следующая – если вы умножите скорость персонажа на положительное значение Axis, то вы получите положительное смещение. Использование отрицательного значения оси приведет соответственно к отрицательному смещению. Конечное значение этого смещения по отношению к местоположению игрового персонажа определит, в каком направлении он будет двигаться.
Клавиши клавиатуры могут выводить значение оси только равное 1 или 0, однако вы можете использовать масштаб для преобразования его в отрицательное значение. Это делается путем умножения значения Axis на масштаб. Если вы умножите положительное значение (значение Axis) на отрицательное значение (Scale), вы получите отрицательное значение.
Установите значения клавиш S и A, нажав на поле Scale и введя -1.
Движение игрового персонажа
Для начала вам необходимо указать необходимые события которые будут отображать движение перка. Для этого правой кнопкой мыши пустое место на графике событий, чтобы получить список узлов. Добавьте узел MoveForward, который находится в разделе «Axis Events».
Обратите внимание: вы ищете красный узел в Axis Events, а не зеленый узел в Axis Values.
Повторите процесс для MoveRight.
Использование переменных
Чтобы ваш персонаж перемещался в пространстве, необходимо указать скорость его движения. Для этого перейдите к меню «My Blueprint» и нажмите кнопку «+», которая находится справа от раздела «Variables».
Теперь вам нужно перейти перейдите на вкладку Details и изменить название новой переменной на MaxSpeed и ее тип на Float.
Нажмите на панели инструментов кнопку Compile и переходите к следующему шагу. Убедитесь, что вы выбрали новую переменную и перейдите на вкладку Details. Вам нужно найти раздел «Default Value» и измените значение по умолчанию MaxSpeed=10.
Переместите переменную MaxSpeed на вкладке «My Blueprint» в график событий и выберите Get из меню.
Чтобы определить конечную скорость и направление движения необходимо умножить значение MaxSpeed и значение оси. Добавьте узел float * float и подключите к нему Axis Value и MaxSpeed.
Определение направления движения персонажа
Во-первых, вам нужно добавить узел под названием Get Actor Forward Vector:
Во-вторых, необходимо добавить узел Add Movement и соединить узлы между собой следующим образом:
Обратите внимание, белая линия выполняет функцию соединения цепочки исполнения команды. Другими словами, когда игрок перемещает входную ось, то автоматически генерируется событие, которое будет выполнять узел InputAxis MoveForward. Белая линия означает, что когда это произойдет, вы выполните узел Add Movement Input.
Узел Add Movement Input отвечает за выполнение следующих входных данных:
- Target: устанавливается на перка, который обозначается в таблице красным полем.
- World Direction: Направление которое служит для указания перемещения цели.
- Scale Value: в данном случае является максимальной скоростью персонажа.
Вам нужно повторить процесс также для MoveRight, но при этом заменить Get Actor Forward Vector на Get Actor Right Vector.
Добавление функции Offset
Вам нужно перейти к узлу Event Tick, который находится на графике событий. Он должен быть слева и отмечен серым цветом, однако если этот узел отсутствует, вам будет нужно создать его для продолжения работы.
Чтобы добавить функцию Offset, также создайте узлы Consume Movement Input Vector и AddActorLocalOffset и свяжите их следующим образом:
Это позволит вам получать любые сохраненные данные о движении персонажа и добавлять их в текущее местоположение перка.
Нажмите Compile, вернитесь в главный редактор и нажмите Play. Посмотрите, теперь вы можете управлять вашим персонажем!
При этом вам необходимо знать и учитывать один нюанс – более мощные компьютеры способны рендерить кадры с большей скоростью. То есть, персонаж будет двигаться с более высокой скоростью на мощных компьютерах и наоборот – на слабых машинах его движение будет снижено. Для того чтобы это исправить вам нужно сделать так, чтобы движение перка было независимым от частоты кадров.
Примечание: На данном этапе, для вашего удобства некоторые привязки клавиш уже настроены для того, чтобы продемонстрировать вам эффекты в зависимости от частоты кадров. Попробуйте нажать «0», чтобы ограничить частоту кадров до 60 и увидеть результат, затем нажмите 1, чтобы сбросить ограничение. Попробуйте перемещать персонажа при обоих значениях скорости, чтобы увидеть разницу.
Настройка частоты кадров
Выйдите из воспроизведения игры и откройте BP_Player. Далее перейдите к узлу Event Tick и посмотрите на панель Delta Seconds.
Delta Seconds определяет время, прошедшее с момента последнего события. Если при этом вы умножите значение смещения на Delta Seconds, то движение персонажа станет независимым от частоты кадров.
Приведем пример: персонаж имеет значение максимальной скорости=100. Если с момента последнего события прошла секунда, то получается, что перк переместится на 100 единиц. Соответственно, если прошло полсекунды, то его перемещение составит 50 единиц.
Чтобы умножить смещение на Delta Seconds, вам нужно добавить vector * float и подключить узлы следующим образом:
Посмотрите, время между кадрами (Delta Seconds) очень короткое, ваш персонаж будет двигаться намного медленнее, чем нужно. Чтобы это исправить, измените значение MaxSpeed на 600.
Столкновение с пространством
Чтобы иметь возможность взаимодействовать с окружающим пространством, персонажу необходимо присвоить значение так называемого столкновения. Вы можете использовать один из вариантов:
- Collision mesh: это событие генерируется автоматически при импорте или создании сетки.
- Collision component: может быть в виде куба, капсула или сферы и добавляется при помощи панели «Components».
Посмотрите, как это выглядит на изображении:
Взаимодействие персонажа активируется, когда его сфера соприкасается с сферой другого персонажа или объекта.
Активация столкновения
Когда вы перемещаете игрового персонажа, программа Unreal учитывает только корневой компонент для столкновений. Поскольку корневой компонент вашего персонажа еще не имеет значение столкновения, он проходит через все пространство беспрепятственно.
Примечание: Игровой персонаж, который не имеет определенный корневой компонент, может блокировать, у которого нет коллизии в качестве корня, может блокировать перемещение других персонажей. Однако он одновременно с этим будет беспрепятственно перемещаться по локации, сквозь стены и предметы.
Перейдите к панели «Components» и переместите StaticMesh в DefaultSceneRoot.
Теперь переключитесь на график событий и перейдите к узлу AddActorLocalOffset. Тут вам нужно найти вход Sweep и установить для него значение true, щелкнув левой кнопкой мыши по флажку.
Вернитесь в главный редактор и нажмите «Play». Куб теперь будет останавливаться, сталкиваясь с препятствиями!
Создание объектов
В этом уроке вы создадите объект с которым будет взаимодействовать ваш персонаж. В качестве этого объекта вы будете использовать BP_Banana. Чтобы определить момент, в который персонажа будет соприкасаться с элементом, необходимо создать узел события, который будет срабатывать при столкновении. Существует три типа реакции персонажа на столкновение: «Ignore», «Overlap» и «Block». Вот что происходит при активации каждого из них:
Настройка реакции на столкновение
Выйдите из игры и откройте BP_Banana. Теперь выберите компонент StaticMesh и перейдите на панель «Details». Раздел «Collision» — это место, где вы можете указать нужную реакцию на столкновение с каким-либо объектом.
Как видите, сейчас большинство настроек неактивны. Чтобы сделать их редактируемыми, щелкните левой кнопкой мыши раскрывающийся список, который находится рядом с пунктом «Collision Presets» и выберите Custom из списка.
Теперь вам нужно указать, как будет реагировать персонаж на столкновение с объектом. Если вы не забыли, то тип вашего персонажа – WorldDynamic, так что нужно выбрать реакцию на столкновение именно для этого типа. Теперь перейдите в раздел Collision Responses и измените реакцию на столкновение WorldDynamic на Overlap, щелкнув средний флажок справа от WorldDynamic.
Настройка столкновения
Перейдите в панель «Components» и щелкните правой кнопкой мыши StaticMesh. В контекстном меню вам нужно выбрать Add Event ⇒ Add OnComponentBeginOverlap.
Смотрите, теперь у вас есть новый узел OnComponentBeginOverlap (StaticMesh):
Далее создайте узел DestroyActor и свяжите его с узлом OnComponentBeginOverlap (StaticMesh):
Размещение объекта
Закройте редактор Blueprint и убедитесь, что вы находитесь в папке Blueprints. Теперь разместите несколько бананов (BP_Banana) по всему уровню при помощи мыши.
Теперь нажмите Play и попробуйте собрать несколько бананов при помощи вашего персонажа.
Что делать дальше?
Из этого урока вы узнали много нового о возможностях программы Unreal. Вы также можете скачать готовый проект и все материалы, которые нужны для работы на этой странице.
Чтобы продолжить ваше обучение основам Unreal Engine, вам нужно перейти к следующему уроку из которого вы узнаете много нового, в том числе о различных материалах в Unreal Engine.
В части №2
Раздел «Движение игрового персонажа» — все действия осуществляются в BP_Player или в GM_Tutorial?
Спасибо
Главное как я не записать скрипт в скрипт мира и не понимать почему же оно не работает
BP_Player
Почему то не удаляется объект при прохождении персонажем