Уроки Unreal Engine

Как создать простую игру в Unreal Engine 4

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

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

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

  • Как создать непрерывное движение для игрового персонажа;
  • Как создать препятствия, которые персонаж должен преодолевать разными способами;
  • Как расположить на игровой локации разные объекты;
  • Как создать кнопку перезапуска игры, которая будет отображаться, если персонаж врежется в препятствие.

В конечном итоге у вас получится игра, которая будет выглядеть так:

Обратите внимание: вы будете использовать Blueprints и UMG в этом уроке. Если вам необходимо освежить знания об этих инструментах, пожалуйста, вернитесь к предыдущим частям руководства прежде чем продолжить.

Это занятие является частью серии, которая состоит из 10 уроков, посвященных Unreal Engine:

Начало работы

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

После этого перейдите в папку проекта и откройте InfiniteMatrix.uproject.

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

Находясь в редакторе нажмите Play, чтобы проверить элементы управления движением. Смотрите, вы можете перемещаться по вертикали и горизонтали, используя при этом мышь:

Движение игрока вперед

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

Во-первых, вам нужно создать переменную для определения скорости движения игрока вперед. Создайте новую переменную Float с именем ForwardSpeed и установите ее значение по умолчанию = 2000.

Убедитесь, что вы находитесь в Event Graph и найдите узел «Event Tick». Свяжите узлы так, как показано на рисунке:

Умножив ForwardSpeed на Delta Seconds, вы получите результат, который не будет зависеть от частоты кадров.

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

Движение по одной оси

Чтобы переместить игрока, вам нужно создать узел AddActorWorldOffset. Установите значение Sweep = true, щелкнув левой кнопкой мыши по квадратику рядом с ним:

Если сейчас вы попробуете подключить полученный результат Float к входу Delta Location, редактор Unreal автоматически преобразует его в вектор.

Однако это поместит значение Float на X, Y и Z вектора, но в этой игре движение вперед должно быть только вдоль оси X. Чтобы это исправить нужно разделить вектор на три компонента Float.

Выход Delta Location узла AddActorWorldOffset не должен быть ни с чем соединен. Нажмите правой кнопкой мыши на контакт Delta Location и выберите в сплывающем меню Split Struct Pin:

Соедините узлы следующим образом:

Подведем итоги:

  1. Каждый кадр игра будет умножать на значения ForwardSpeed и Delta Seconds, чтобы получить независимый от частоты кадров результат.
  2. AddActorWorldOffset будет использовать выше полученный результат для перемещения игрока по оси X.
  3. Так как Sweep находится во включенном положении, игрок перестанет двигаться вперед, если наткнется на преграду.

Нажмите кнопку Compile, чтобы сохранить результат и вернитесь в главный редактор. Если вы нажмете Play, то вы сможете двигаться вперед через туннель.

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

Создание Tunnel Spawner

Для продолжения вам нужно перейти в Content Browser и найти папку Blueprints. Теперь создайте новый класс Blueprint с Actor в качестве основного, назовите его BP_TunnelSpawner и откройте.

Поскольку в игре будут постоянно появляться туннели, рекомендуется создать функцию под названием «spawning ». Для этого перейдите на панель My Blueprint и создайте новую функцию с именем SpawnTunnel. Целью этой функции будет создание туннеля в указанном месте.

Чтобы передать местоположение функции, ей нужно присвоить входной параметр:

Кроме того, на узле функции также будет находиться и выходной канал:

Убедитесь, что вы находитесь на графике для функции SpawnTunnel и выберите узел «Entry». Теперь вам нужно перейти на панель «Details» и нажать знак «+» рядом с разделом «Inputs».

Переименуйте входной параметр в SpawnLocation и измените его тип на Vector:

Чтобы создать функцию spawn для вашего туннеля, необходимо добавьте узел Spawn Actor From Class. Щелкните раскрывающийся список, расположенный справа от вывода класса, и выберите команду BP_Tunnel:

Чтобы назначить место появления, щелкните правой кнопкой мыши по полю Spawn Transform и выберите Split Struct Pin. Затем свяжите узел Spawn Actor From Class с узлом Entry следующим образом:

Теперь всякий раз при вызове функции SpawnTunnel, она будет создавать новый экземпляр BP_Tunnel в указанном вами месте.

Тестирование Tunnel Spawner

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

На узле SpawnTunnel установите координаты Spawn Location в положение: (2000, 0, 500):

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

Вам необходимо удалить с вашего уровня BP_Tunnel. Сделайте это, щелкнув левой кнопкой мыши на BP_Tunnel в World Outliner и после этого нажмите клавишу Delete.

Теперь перейдите в Content Browser и при помощи мыши перетащите BP_TunnelSpawner в область просмотра (Viewport). Таким образом у вас появится этого уровня. Если вы нажмете Play, игра покажет вам расположение туннеля в стороне от игрока.

Как только вы закончите тестирование, вернитесь к BP_TunnelSpawner. Укажите теперь координаты Spawn Location узла SpawnTunnel = (0, 0, 0).

После этого снова нажмите Compile и затем вернитесь в главный редактор.

Настройки Blueprint для туннеля

BP_Tunnel будет отвечать за две вещи:

Первое – определять, когда в игре будет появляться новый туннель.  Для этого вам будет нужно создать специальную триггерную зону. После запуска игры BP_Tunnel отправит команду BP_TunnelSpawner создать новый туннель. Таким образом можно создать иллюзию бесконечного туннеля.

Во-вторых, он определяет месторасположение точки появления тоннеля. BP_TunnelSpawner будет использовать эту точку в качестве следующей локации spawn.

Создание триггерной зоны

Вам нужно открыть BP_Tunnel и перейти к панели «Components». Добавьте компонент Box Collision и назовите его TriggerZone.

Чтобы увеличить площадь столкновения необходимо перейти на панель «Details» в раздел «Shape» и установить для свойства Box Extent значение (32, 500, 500).

Теперь установите для свойства Location значение (2532, 0, 0), чтобы TriggerZone расположилось непосредственно в конце туннельной сетки. Это будет значить, что новый туннель появится только тогда, когда игрок достигнет конца старого туннеля.

Создание Spawn Point

Чтобы определить местоположение точки появления игрока в локации, вы можете использовать компонент Scene. Этот компонент идеально подходят для определения местоположений того или иного объекта, потому что он содержит только значение Transform. Кроме того, эта функция отображается в окне Viewport, что позволяет визуально определять точку появления игрока.

Перейдите на панель «Components» предварительно убедившись, что у вас не выбран ни один элемент и добавьте компонент Scene, переименовав его в SpawnPoint.

Туннельная сетка имеет длину 2500 единиц по оси X, поэтому она должна иметь точку состыковки. Перейдите на панель «Details» и установите для свойства Location значение (2500, 0, 0).

Spawning Tunnels в точке появления

Для сохранения результата нажмите Compile и затем переключитесь на BP_TunnelSpawner.

Следующий BP_Tunnel должен появиться в SpawnPoint самого отдаленного туннеля, чтобы создать эффект бесконечности.

Поскольку самый дальний туннель всегда является последним созданным туннелем, вы можете всегда легко получить ссылку на него.

Для этого откройте график SpawnTunnel и щелкните правой кнопкой мыши на значке «Return Value» узла «Spawn Actor From Class». Вам нужно выбрать команду Promote to Variable и переименовать новую переменную в NewestTunnel.

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

Создайте новую функцию и назовите ее SpawnTunnelAtSpawnPoint, разместите ее в рабочей области таким образом:

Эта функция создаст новый туннель вместе с расположением его компонента SpawnPoint, и разместит его в указанном месте.

Чтобы BP_Tunnel связывался с BP_TunnelSpawner, ему нужна ссылка. Без связи BP_TunnelSpawner не будет знать, когда нужно создавать следующий туннель.

Создание ссылки для Tunnel Spawner

Нажмите Compile и затем закройте график SpawnTunnelAtSpawnPoint. После этого переключитесь на BP_Tunnel. Добавьте новую переменную и назовите ее TunnelSpawner. Установите его тип переменной в BP_TunnelSpawner\Object Reference.

Нажмите Compile, а затем переключитесь обратно на BP_TunnelSpawner.

Теперь вам нужно открыть график SpawnTunnel и добавить следующие узлы:

Таким образом, каждый туннель будет иметь ссылку на BP_TunnelSpawner.

Сценарий триггерной зоны

Не забудьте нажать Compile и затем переключитесь на BP_Tunnel.

Перейдите на панель «Components» и щелкните правой кнопкой мыши TriggerZone. В меню выберите команду Add Event\Add OnComponentBeginOverlap. Это добавит следующий узел в ваш график событий:

Этот узел будет выполняться всякий раз, когда персонаж или какой-либо объект пересечет TriggerZone.

В первую очередь необходимо дать программе установку проверить, является ли этот объект игроком. Для этого переместите в свободное место при помощи мыши значок Other Actor и выберете из меню пункт «Cast to BP_Player».

Примечание: Поскольку новый туннель каждый раз появляется в конце другого туннеля, то автоматически запускается TriggerZone этого туннеля.

Подключение к BP_Player будет препятствовать выполнению любых других узлов, если Other Actor является туннелем.

Затем добавьте новые узлы, соединив их с Cast to BP_Player как на изображении:

Давайте еще раз пройдемся по шагам:

  1. Когда Актер пересекает TriggerZone, будет выполняться узел On Component Begin Overlap (TriggerZone);
  2. Узел Cast to BP_Player будет проверять, является ли объект игроком;
  3. Если это действительно игрок, то BP_TunnelSpawner создаст новый туннель. Его местоположение будет в компоненте SpawnPoint последнего появившегося туннеля.
  4. Поскольку старый туннель больше не используется, игра удалит его с помощью узла DestroyActor.

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

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

Соединение большего количества туннелей

Первое, что вам нужно сделать, это создать функцию, которая будет создавать определенное количество туннелей.

Для этого откройте BP_TunnelSpawner и создайте новую функцию под названием SpawnInitialTunnels.

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

Чтобы узел For Loop выполнялся n количество раз, вам нужно установить для Last Index значение n = 1.

В этом уроке вам нужно создать три туннеля. Для выполнения трех циклов установите значение последнего индекса = 2.

Примечание: Если вы не установите значения для полей «First Index» или «Last Index», то по умолчанию они будут равны 0.

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

Размещение первого туннеля

Чтобы определить, появился первый туннель в нужном месте или нет, вам нужно проверить, установлен ли NewestTunnel. Если он не установлен, это означает, что первый туннель не был создан. Параметр NewestTunnel устанавливается только после того, как игра создает новый туннель.

Выполняя эту проверку, разместите узел IsValid (узел со значком вопросительного знака) после узла ForLoop. Теперь вам нужно получить ссылку на NewestTunnel и подключить ее к выходу Input Object узла IsValid.

Если NewestTunnel не установлен, вывод Is Not Valid будет благополучно выполняться, и наоборот.

Теперь создайте новый узел, как на изображении и подключите его к выводу Is Not Valid узла IsValid:

Это заставит туннель появиться в том месте, где находится игрок.

Создание следующих туннелей

Добавьте узел SpawnTunnelAtSpawnPoint и подключите его к выводу Is Valid узла IsValid:

Вот как должен теперь выглядеть ваш график:

В итоге:

  1. Узел ForLoop будет выполнен в общей сложности три раза;
  2. В первом цикле туннель будет появляться на месте игрока;
  3. Во время последующих циклов программа будет создавать туннель в SpawnPoint в конце последнего туннеля.

Затем перейдите к меню Event Graph и удалите узел SpawnTunnel. После этого добавьте узел SpawnInitialTunnels и разместите его после события BeginPlay.

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

Создание препятствий

Перед вами трафареты, которые вы будете использовать в качестве препятствий:

Откройте BP_Tunnel и перейдите на панель «Components». Добавьте компонент Static Mesh и назовите его WallMesh.

Теперь перейдите на панель «Details» и измените свойство статической сетки на SM_Hole_01.

Вам также необходимо установить параметр Location в координаты (2470, 0, 0). Это поместит препятствие в конец туннеля.

Чтобы игра была более интересной, лучше, чтобы препятствия вращались. Для этого добавьте новую переменную Float и назовите ее RotateSpeed. Установите значение по умолчанию = 30.

Далее переключитесь на График событий и найдите узел Event Tick. Создайте следующую последовательность:

Это заставит WallMesh вращать каждый кадр с изображением ваших трафаретов с указанной скоростью.

Нажмите Compile и затем вернитесь в главный редактор. Нажмите Play, чтобы увидеть, как происходит вращение.

Создание разных вариантов препятствий

Вместо создания нового Blueprint для каждого трафарета, вы можете просто рандомизировать WallMesh. Для этого вам необходимо открыть BP_Tunnel и создать новую функцию с именем RandomizeWall. Разместите график следующим образом:

Узел Set Static Mesh установит WallMesh на в нужное вам место. Чтобы составить список статических сеток, вы можете использовать узел Select. Для этого при помощи мышки переместите значок «New Mesh» в рабочее поле и добавьте новый узел.

Узел Select позволит вам установить список необходимых опций, а вход Index определит, какую именно опцию выбирает узел Select.

Поскольку сейчас у вас имеется четыре разных трафарета, то вам потребуется создать еще две дополнительные опции для них. Вы можете сделать это, щелкнув правой кнопкой мыши узел Select и выбрав Add Option Pin. Проделайте эту манипуляцию еще несколько раз, пока у вас не появится четыре варианта выбора опций.

Затем пропишите каждый параметр следующим образом:

Вариант 0: SM_Hole_01

Вариант 1: SM_Hole_02

Вариант 2: SM_Hole_03

Вариант 3: SM_Hole_04

Рандомизация препятствий

Вы можете использовать Random Integer в узле Range, чтобы получить случайное значение. Этот узел возвращает значение, которое > = Min и <= Max.

Добавьте Random Integer в узле Range и подключите его к выводу Index узла Select.

Теперь установите максимальное значение = 3. Это даст вам четыре возможных числа: 0, 1, 2 и 3.

Чтобы создать немного больше рандомизации, давайте добавим случайное вращение в WallMesh. Для этого вам нужно добавить следующие значения, которые будут находиться после узла Set Static Mesh:

Это добавит случайное вращение с диапазоном между 0 и 360 градусами в WallMesh.

Вот как теперь должен выглядеть ваш график:

Резюмируем:

  1. Узел выбора предоставляет собой список трафаретов;
  2. Случайный трафарет выбирается с помощью случайного целого числа в узле Range;
  3. Узел Set Static Mesh устанавливает WallMesh для выбранного трафарета;
  4. Узел AddLocalRotation добавляет случайную скорость и смещение вращения в

Нажмите Compile и закройте график RandomizeWall.

Переключитесь на BP_TunnelSpawner и откройте график SpawnTunnel. Добавьте выделенный на изображении узел:

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

Закройте график SpawnTunnel и нажмите «Compile». Вернитесь в главный редактор и нажмите Play, чтобы увидеть результат вашей работы!

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

Установка действий при столкновении

Чтобы включить или отключить движение вперед, вы можете использовать функцию Boolean variable, которая имеет всего два значения true и false.

Вам нужно открыть BP_Player и создать новую логическую переменную (Boolean variable) с именем IsDead. Теперь перейдите к узлу Event Tick и создайте еще один узел Branch. Получите ссылку на IsDead и подключите ее к выводу Condition узла Branch.

Теперь подключите узел Event Tick к узлу Branch и контакт False узла Branch к узлу AddActorWorldOffset:

Теперь, когда для IsDead установлено значение true, игрок перестает двигаться вперед.

Настройки для переменной IsDead

Нажмите Compile и затем переключитесь на BP_Tunnel. На панели «Components» щелкните правой кнопкой мыши WallMesh и выберите «Add Event\Add OnComponentHit». Это добавит следующий узел в ваш график событий:

Этот узел будет выполняться всякий раз, когда какой-либо объект будет сталкивается с WallMesh.

Теперь необходимо сделать так, чтобы система проверяла является ли объект, столкнувшийся с WallMesh, игроком. Для этого поместите значок Other Actor в рабочую область и выберите «Cast to BP_Player» из меню.

Переместите выход BP_Player узла Cast к выходу BP_Player и добавьте рядом новый узел Set Is Dead с положением флажка true, как показано на изображении ниже:

Нажмите Compile и вернитесь в главный редактор. Нажмите Play и попробуйте теперь врезаться в стену. Посмотрите, игрок больше не может продолжать движение, после столкновения с прептствием.

Отображение кнопки перезапуска

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

Для того чтобы отобразить или скрыть виджет, вам нужна ссылка на него. Откройте BP_Player и затем создайте новую переменную с именем RestartWidget. Измените тип переменной на WBP_Restart\Object Reference.

Затем перейдите на графике событий найдите узел Event BeginPlay и добавьте рядом с ним узел Create Widget, со значением Class в WBP_Restart. Также вам необходимо добавить узел Set Restart Widget, а затем подключить все следующим образом:

Теперь, когда игрок появляется в начале игры, программа создает экземпляр WBP_Restart. Следующим шагом является создание функции, которая будет отображаться этим экземпляром.

Создание функции отображения

Создайте новую функцию и назовите ее DisplayRestart. Сделав это, составьте следующий график:

Резюмируя:

  1. Viewport отображает RestartWidget на экране;
  2. Set Input Mode UI Only ограничивает взаимодействие игрока с пользовательским интерфейсом. Это нужно для того, чтобы игрок не мог передвигаться, если он мертв.
  3. Set Show Mouse Cursor просто отображает курсор мыши;
  4. Чтобы отобразить кнопку перезагрузки, все, что вам нужно сделать, это вызвать команду DisplayRestart после столкновения игрока со стеной.

Вызов дисплея функций

Закройте график DisplayRestart и нажмите «Compile», а затем переключитесь на BP_Tunnel и найдите узел On Component Hit (WallMesh). Добавьте узел DisplayRestart в самый конец цепочки всех ваших узлов.

Нажмите Compile, закройте BP_Tunnel и вернитесь в главный редактор. Нажмите «Play», чтобы увидеть результат своих стараний. Теперь, если вы врежетесь в стену, появится кнопка перезагрузки.

Перезапуск игры

При перезапуске игра должна сделать две вещи:

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

Перезагрузка плеера

Откройте BP_Player, а затем создайте новую функцию с именем RestartGame. Создайте следующую последовательность:

Резюмируя:

  1. Set Is Dead устанавливает IsDead в положение false. Это повторно включает возможность движения вперед.
  2. Remove From Parent удаляет RestartWidget с экрана.
  3. Set Input Mode Game Only — активирует игровой ввод, чтобы игрок снова мог передвигаться.
  4. Set Show Mouse Cursor скрывает/показывает курсор мыши

Перезапуск туннелей

Нажмите Compile, закройте BP_Player и откройте BP_TunnelSpawner. Убедитесь, что вы находитесь в графе SpawnInitialTunnels.

Во-первых, вам нужно удалить существующие туннели, прежде чем создавать новые. Для этого добавьте узел Sequence после узла Entry и подключите контакт «То 1» к узлу ForLoop.

Примечание: Узел Sequence выполняет свою функцию в последовательном порядке. Это отличный способ организовать ваш график по вертикали, тем более что цепочки узлов могут быть очень длинными.

Далее создайте следующие узлы:

Эта настройка получит информацию о всех существующих туннелях и удалит их из игры.

Далее вам нужно подключить вывод «0» узла «Sequence» к узлу «Get All Actors of Class». Это обеспечит удаление туннелей перед их дублированием.

Вот как теперь должен выглядеть ваш график:

Обновление кнопок

Нажмите Compile, а затем закройте BP_TunnelSpawner. Вам нужно перейти в Content Browser и там найти папку пользовательского интерфейса. Дважды щелкните WBP_Restart, чтобы открыть его в редакторе.

Выберите RestartButton и перейдите на панель «Details». Перейдите в раздел «Events» и нажмите кнопку рядом с OnClicked.

Это создаст новый узел On Clicked (RestartButton), который будет выполняться, когда игрок нажмет кнопку RestartButton:

Резюмируя:

  1. Get Owning Player Pawn возвращает игрока в начало уровня.
  2. BP_Player проверяет, принадлежит ли объект к классу BP_Player.
  3. Если это так, то он вызовет функцию RestartGame. Эта функция сбрасывает плеер и скрывает кнопку перезагрузки.
  4. Get All Actors of Class и Get возвращают BP_TunnelSpawner и затем вызывают SpawnInitialTunnels. Эта функция удалит существующие туннели и создаст новые.

Снова нажмите «Compile», а затем закройте редактор Blueprint. Нажмите Play, чтобы проверить работу кнопки перезапуска!

Что делать дальше?

Вы можете скачать готовый проект.

Теперь, когда у вас есть простая игра, вы можете работать с ее основой для освоения более сложных функций.

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

Кроме того, ваших знаний достаточно чтобы создать такие простые игры как пинг понг или даже тетрис!

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

Перевод
raywenderlich.com
Показать больше

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Закрыть
Закрыть