Создание игры на unreal engine 4 с нуля: Как сделать игру на Unreal Engine 4 ☰ Polycent — детский образовательный центр

Содержание

Как сделать игру на Unreal Engine 4 ☰ Polycent — детский образовательный центр

Unreal Engine – это игровой движок, первая игра на котором вышла еще в 1998 году (игра шутер Unreal). Изначально движок предназначался для создания шутеров от первого лица. Но последующие версии были адаптированы для создания игр различных жанров, включая многопользовательские ролевые онлайн-игры.

С 2015 года Unreal Engine стал бесплатным, но разработчики игр обязаны перечислять 5% дохода от продаж.

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

Как устроена Unreal Engine 4

По сути это набор инструментов для разработки игр. На этом движке созданы такие игры, как Tekken 7, Kingdom Hearts III и Survival Evolved. 

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

Установка движка

Для установки Unreal Engine 4 используется Epic Games Launcher. Сначала создайте учетную запись, установите программу. Далее скачайте программу запуска, которая соответствует вашей операционной системе. Откройте программу и авторизуйтесь.

Нажмите Install Engine в левом верхнем углу. Далее можно будет выбрать устанавливаемые компоненты, большая часть которых уже выбрана по умолчанию.

Starter Content – это ассеты (ресурсы), которые предоставляются бесплатно для ваших проектов. Это различные модели и материалы, которые можно использовать в готовых проектах или временно.

Templates and Feature Packs – это шаблоны, которые существуют в различных жанрах игр.

Engine Source – это режим, позволяющий изменять исходный код в движке, добавляя к нему все, что необходимо.

Создать игру можно под различные платформы – iOS, Android, HTML5, Linux, TVOS. В настройках выберите ту, для которой планируете делать игру.

После выбора всех необходимых настроек, нажмите Install и приступайте созданию первого проекта.

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

Для создания игры необходимо следовать следующим этапам:

— Планирование и прототипирование объекта.

— Продумывание архитектуры проекта и его отдельных компонентов.

— Интерфейс пользователя.

— Отладка и исправление ошибок.

— Работа с ассетами и графикой.

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

Для создания нового проекта необходимо нажать на одну из кнопок Launch и далее на вкладку New Project.

Далее нужно выбрать один из шаблонов, нажав на Blueprint. Для работы «с чистого листа» можно выбрать шаблон Blank.

Далее нужно выбрать дополнительные параметры.

Target Hardware. При выборе Mobile/Tablet (смартфон или планшет) некоторые эффекты постобработки будут отключены. Для сенсорного ввода можно будет использовать мышь. Выбирайте тут опцию Desktop/Console.

Graphical Target. При выборе шаблона Scalable 2D или 3D в постобработке отключатся некоторые эффекты. Далее выбираем Maximum Quality.

Starter Content. Если включить эту опцию, добавится базовый контент. Но для упрощения работы лучше выбрать опцию No Starter Content

Далее можно дать имя проекту. Имя проекта не обязательно является названием игры.

После всех манипуляций создайте проект, нажав на Create Project.

Интерфейс движка

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

1. В панели Content Browser отображены все файлы проекта. Используйте ее, если хотите создать папки и упорядочить файлы. С помощью фильтров и поисковой строки тут можно искать нужные файлы.

2. В панели Modes появляется возможность переключения между инструментами.

3. В панели World Outliner отображаются все объекты текущего уровня. Можно упорядочить список объектов по папкам, искать и фильтровать их по типам.

4. В панели Details можно увидеть свойства выбранного объекта. Она используется для измерения параметров объекта. Изменения коснутся не всех объектов, а только выбранного.

5. Панель Toolbar содержит различные функции, нам в основном понадобится Play.

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

Импорт ресурсов (ассетов)

Импортируйте файлы, чтобы мог их использовать. Для этого нажмите Import в разделе Content Browser. Найдите нужную вам папку и файл, откройте его при помощи нажатия на Open

Если дальше вы будете самостоятельно создавать материал, снимите флажок с Import Materials

Чтобы сохранить импортированный файл в проект, нужно нажать Save. Сохранять проект рекомендуется как можно чаще.

Добавление мешей на уровень.

Модели в Unreal Engine называют «меш» (meshes). Чтобы добавить его на уровень, нажмите на правую клавишу мыши и перетащите его из раздела Content Browser. Все объекты, которые вы добавляете, можно перемещать, масштабировать и поворачивать. Для этого даже есть горячие клавиши – W, R, E.

Материалы

Чтобы придать цвет и детали вашему мешу, нужно создать материал. Base Color придает цвет и текстуру модели. Metallic помогает сделать модель из определенного материала, от «тканевого» до металлического. Specular придает блеск неметаллическим поверхностям объектов. Roughness придает шероховатость объектам из таких материалов как камень или дерево.

Редактор материалов

Редактор состоит из нескольких разделов – панель Graph содержит все ноды (узлы). В панели Details можно увидеть свойства выбранного объекта. Панель Viewport содержит меш выбранного просмотра. А в панели Palette отображается список всех доступных нодов. 

Ноды – это объекты, которые используются для создания материала. Они обладают различными функциями. Например, они могут придавать текстуре различные цвета.

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

Blueprints

Blueprint – это «вещь», которая позволяет создавать свои поведения для физических и абстрактных объектов. При помощи Blueprints можно оживить объекты, заставить передвигаться автомобиль и т.д. Для этого не нужно писать код – достаточно создать ноды и соединить их. Но если вам нравится программировать, можно использовать C++. Записаться на обучающий курс c# для школьников можно на нашем сайте.

Подробнее узнать о движке Unreal Engine 4 и создать свою собственную игру можно на занятиях Polycent «Создание 3D игр UE4».


Примечание: Наш развивающий центр проводит курсы создания 3D игр на Unreal Engine 4. Это популярный движок для разработки игровых программ. Кроме этого, организуем занятия по ВР для детей. Познакомим школьников с технологиями VR/AR.

Создание игры на Unreal Engine 4 за 150 часов (видео + исходники) / Хабр

Приветствую, Хабр! Хотел бы познакомить вас с относительно небольшим проектом, который я сделал c нуля примерно за 150 часов (50 заходов ~3 часа каждый) на Unreal Engine 4. Проект я делал в прямом эфире только на стримах раз в неделю (в общей сложности ушел год), попутно отвечая на вопросы пользователей.

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

  • Планирование и прототипирование проекта
  • Продумывание и реализация архитектуры проекта и отдельных его компонентов
  • Реализация интерфейса пользователя
  • Отладка и исправление ошибок
  • Работа с ассетами и графикой

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

Если вам интересны подробности проекта, записи стримов, исходники и прочее, читайте далее.


Весь проект был реализован на визуальной системе программирования, под названием “Блупринты”. И конечно многие спецы могут назвать её ребяческой, разработать на ней можно спокойно даже относительно крупный проект. Более того, это можно сделать относительно быстро, как мы уже смогли доказать.

Сразу хочу ответить на вопрос: «Почему Блупринты, а не С++?«. Ну во первых, когда я начинал серию, плюсы я почти не знал. Хотя я и сейчас подобный сингл делал бы на БП. Во вторых, БП почти не уступают плюсам в нашем случае, но при этом дают ряд возможностей: Не позволяют наделать множество ошибок, возможных с плюсами, не приходится отвлекаться между БП и С++, понятнее новичкам. Да и они в нашем случае не намного медленнее, учитывая тот факт, что почти вся логика построена на событиях.

Мы так же успели немного поработать над графикой. К сожалению, ассеты делать времени у нас не было, поэтому мы часть оставили пустышками, часть сделали прямо в редакторе из примитивов, а некоторый контент позаимствовали из бесплатных демок Epic Games. Тем не менее, что-то успели сделать и сами, например систему дня и ночи, постобработку для воды и некоторые материалы объектов сцены.

В планы моих стримов так же стояли и проблемы, которые могут возникнуть при разработке. Их я специально решал в прямом эфире, дабы не только показать, с чем могут столкнуться юные разработчики, но и как отлаживать свой код, искать баги и писать свой код так, что бы все это дело можно было делать в два раза быстрее. Конечно опыта в программировании у меня не десятки лет, и это сказывалось на том, какие порой глупые ошибки я делал. Да и уверен, что многие разработчики могут оспорить множество моментов в процессе написания игры.

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

Список всего, что мы успели реализовать в нашей игре

Персонаж

  • Управление персонажем
  • Система жизненных показателей (Жизни, броня, стамина, голод, жажда)
  • Переключение вида (от первого лица и от третьего)
  • Моделька (сделали во Fuse, анимации взяли с Mixamo)
  • Настроенные анимации передвижения и использования оружия
  • Универсальное взаимодействие с предметами

Объектная система инвентаря

  • Компонент инвентаря (встраивай в любой объект, куда хочешь)
  • Клеточная система с поддержкой различного размера предметов
  • Размер инвентаря по клеткам на страницу и по весу.
  • Класс предметов, которые можно положить в инвентарь. Предметы хранятся в качестве объектов.
    • Вес, размер, информация, состояние предмета
    • Функционал для стака (когда в одной ячейке много одного предмета)
    • Возможность добавить логику использования предмета
    • Выбрасывание из инвентаря
  • Интерфейс для взаимодействия с инвентарем
  • Интерфейс для обмена между другим компонентом и своим.
  • Drag&Drop манипуляция объектами между инвентарями и внутри одного.
  • Контекстное менюу предметов
  • Подсказки при наведении на предметы в инвентаре и в мире.
  • Список генерируемых предметов при создании объекта с компонентом / начале игры.
  • Список начальных предметов при создании объекта с компонентом / начале игры.
  • Система торговли между другим инвентарем
    • Интерфейс торговли
    • Компонент менеджмента денег (необходим для работы торговли)

Система экипировки

  • Экипировка нескольких типов предметов: Шляпы, Топ, Брюки, Ботинки, Оружие
  • Скелетная синхронизация у Топа, брюк и ботинок. (Шляпы и оружие по сокетам)
  • Удобное окошко для экипировки с поддержкой Drag&Drop
  • Поддержка логики-модификаторов при одевании

Оружие

  • Дальнобойное оружие
    • Перезарядка
    • Использование предметов-патронов из инвентаря
    • Поддержка классов снарядов/пуль
    • Автоогонь/одиночный огонь
    • Отдача с разбросом (свой + от факторов, н.п. бег или приседание)
  • Холодное оружие (с несколькими видами проверок на урон на выбор)
  • Состояние оружия ухудшается при использовании

Система крафта

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

Агрессивные мобы

  • Мобы ближнего боя (если увидят, побегут и начнут бить)
  • Мобы смешанного типа (стреляют, но если достаточно близко, побегут что бы ударить)
  • Дальники оббегают препятствия, если не могут выстрелить.
  • Есть встроенный инвентарь для лута после убийства.
  • Зона спауна
  • Список классов
  • Шанс спауна

NPC

  • Городские NPC, патрулирующие свою зону спауна
  • Уникальные NPC
  • Базовый контроллер расписания для уникальных НПЦ
  • Реакция на урон (убегают или используют имеющееся оружие)
  • Встроенный инвентарь для лута после убийства.
  • Объектная диалоговая система
    • Дерево диалогов
    • Каждый ответ — объект
    • Для каждого ответа можно докинуть любую логику или условие доступности.
    • Интерфейс диалога
    • Несколько готовых классов ответа (запускает торговлю, забирает ресурсы, если есть, выходит из диалога)

Строительство

  • Класс конструкций, которые поддерживают размещение
  • Использование предметов-ресурсов из инвентаря при размещении.
  • Снаппинг на некоторых типах конструкций (н.п. Стены, фундамент, окна)
  • Менюшка с конструкциями
  • Подсвечивание конструкций, на которые хватает ресурсов

Дополнительно

  • Небольшая карта с городом, лесом, водоемами (можно плавать).
  • Система смены дня/ночи
  • Автомобили
    • Вид от первого или третьего. Общее с персом
    • Включение/выключение фар.
    • Встроенный компонент инвентаря (нужно взаимодействовать у багажника)
  • Кое как работающие лестницы вертикального типа.
  • Главное меню
  • Меню паузы
  • Меню с настройками графики


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

→ Записи всех 50-ти частей стримов

Содержание по частям

  1. Начинаем и планируем проект. Создаем управление и поведение персонажа.
  2. Начинаем делать систему инвентаря.
  3. Продолжаем делать базу системы инвентаря.
  4. Готовим базу для экипировки и вооружения.
  5. Работа над оружием и использовании патронов.
  6. Делаем автострельбу и прицеливание.
  7. Создаем базовую систему крафта.
  8. Бег, переработка предметов и их износ.
  9. Реализовываем перезарядку для оружия.
  10. Делаем оружие ближнего боя.
  11. Доделываем ближний бой и делаем лестницу по которой можно взбираться.
  12. Делаем интерактивные предметы: Дерево, камень, кусты.
  13. Делаем HUD и начинаем делать интерфейс для инвентаря.
  14. Продолжаем работать над интерфейсом инвентаря. Делаем генерацию ячеек с предметами.
  15. Продолжаем делать генерацию ячеек и поиск места для предмета. Добавляем страницы инвентаря.
  16. Делаем небольшое взаимодействие с предметами в инвентаре и окно подробной информации.
  17. Сделали Drag&Drop перетаскивание предметов по инвентарю и в другой инвентарь.
  18. В этой части речь идет о визуализации крафта.
  19. Создаем окно с выбором количества предметов из стака для переброса в другой инвентарь.
  20. Делаем поддержку разных рецептов крафта, а так же фиксим разные баги у инвентаря.
  21. Создаем систему смены дня и ночи, а так же делаем новую сцену для нашего проекта.
  22. Начинаем создавать AI для агрессивных ботов.
  23. Делаем атаку мобов, а так же реакцию на атаку. Плюс реализуем сбор лута с мертвых мобов.
  24. Делаем зону спауна для нпц. Так же добавляем генерацию случайных предметов в инвентаре.
  25. Обновляемся до 4.13, а так же делаем дальних агрессивных нпц.
  26. Добавляем разные элементы на HUD. Добавляем ручную перезарядку оружия.
  27. Доделываем поддержку скелетной одежды и шапок. Добавляем анимацию для оружия от первого лица.
  28. Делаем интерфейс для работы с нашей системой экипировки.
  29. Начинаем делать торговую систему и компонент менеджмента денег.
  30. Продолжаем делать торговлю, создавая и настраивая компонент торговли.
  31. Делаем отмену торговли, а так же настраиваем анимацию перезарядки.
  32. Создаем транспорт со своим инвентарем, фарами и переключением вида. Создаем фонарик.
  33. Создаем строительство (а точнее систему размещения объектов перед собой).
  34. Делаем интерфейс для строительства, делаем привязку для стен.
  35. Создаем ещё несколько видов конструкций: Палатка, кровать, стул, стол, лампа, дверь. сундук, костер.
  36. Добавляем крышу, окна. Доделываем выравнивание относительно других конструкций.
  37. Делаем небольшое поселение, а так же населяем его NPC, которые так же создаем в этом уроке.
  38. Начинаем делать систему диалогов для наших жителей.
  39. Настраиваем туман и постобработку. Импортируем модель зомби и настраиваем ему анимации.
  40. Доделываем систему диалогов.
  41. Делаем взаимодействие с предметами от третьего лица, а так же модификаторы для брони.
  42. Создаем главное меню, меню паузы и настройки графики. А так же собираем первую сборку игры.
  43. Реализуем расписание для уникальных жителей.А так же что бы городские NPC убегали от атаки.
  44. Добавляем контекстное меню в инвентарь, а так же фиксим некоторые баги нашего инвентаря.
  45. Добавляем отдачу, разброс, анимацию выстрела и возможность ударить для огнестрельного оружия.
  46. Доделаем агрессивных и городских NPC, фиксим разные баги, связанные с ними.
  47. Настраиваем анимации для главного персонажа. Добавляем различную одежду.
  48. Исправляем различные ошибки в нашей игре.
  49. Исправляем различные ошибки крафта, NPC и экипировки в нашей игре.
  50. Немного дорабатываем карту и собираем последний билд.


→ Исходники на Git (загрузка ZIP архивом не работает, архив почему-то поврежден.)

→ Исходники на ЯДиск(Лицензия та же, что и в исходниках)

→ Билд игры

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

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

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

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

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

  • Непрерывное перемещение игрока вперед
  • Создавать препятствия, которых игрок должен избегать
  • Рандомизируйте препятствия для создания вариаций
  • Создать кнопку перезапуска, которая отображается, когда игрок сталкивается с препятствием

В конце у вас будет такая игра:

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

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

Загрузите начальный проект и разархивируйте его. Перейдите в папку проекта и откройте InfiniteMatrix.upproject .

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

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

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

Перемещение игрока вперед

Перейдите к папке Blueprints и откройте BP_Player .

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

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

Затем убедитесь, что вы находитесь в графике событий, а затем найдите узел Event Tick . Создайте следующую настройку:

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

Примечание: Если вы не знакомы с независимостью частоты кадров, прочтите наше руководство по Blueprints. Мы покрываем это в Раздел Независимости частоты кадров .

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

Перемещение по одной оси

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

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

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

Убедитесь, что контакт Delta Location узла AddActorWorldOffset не имеет соединений. Щелкните правой кнопкой мыши штифт Delta Location и выберите Split Struct Pin .

Наконец, соедините все следующим образом:

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

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

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

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

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

Перейдите в Content Browser и убедитесь, что вы находитесь в папке Blueprints . Создайте новый класс Blueprint с Актером в качестве родительского класса. Назовите это BP_TunnelSpawner , а затем откройте его.

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

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

Они также появятся в качестве выходных контактов на Entry узле функции.

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

Переименуйте входной параметр в SpawnLocation и измените его тип на Вектор .

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

Чтобы установить место появления, щелкните правой кнопкой мыши булавку Преобразование создания и выберите Разделить структурную булавку . После этого свяжите узел Spawn Actor From Class с узлом Entry следующим образом:0005

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

Давайте проверим!

Тестирование генератора туннелей

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

На узле SpawnTunnel установите Spawn Location 9от 0028 до (2000, 0, 500) .

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

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

Затем перейдите в Content Browser. Щелкните левой кнопкой мыши и перетащите BP_TunnelSpawner в окно просмотра. Это добавит его экземпляр на уровень.

Если вы нажмете Играть , игра создаст туннель над игроком и вдали от него.

После завершения тестирования вернитесь к BP_TunnelSpawner . Сбросьте Spawn Location узла SpawnTunnel на (0, 0, 0) .

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

В следующем разделе вы настроите функциональность для BP_Tunnel .

Настройка схемы туннеля

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

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

Начнем с создания триггерной зоны.

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

Откройте BP_Tunnel и перейдите на панель «Компоненты». Добавьте компонент Box Collision и назовите его TriggerZone .

В данный момент область столкновения очень мала. Перейдите на панель сведений и найдите Раздел формы . Задайте для свойства Box Extent значение (32, 500, 500) .

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

Теперь пришло время создать точку появления

Создание точки появления

Чтобы определить местоположение точки появления, вы можете использовать 9Компонент 0027 Сцена . Эти компоненты идеально подходят для определения местоположений, потому что они содержат только Transform. Они также видны в окне просмотра, поэтому вы можете видеть, где находится ваша точка возрождения.

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

Сетка туннеля имеет длину 2500 единиц по оси X , так что это место, где должна быть точка присоединения. Перейдите на панель Details и установите Местоположение свойство (2500, 0, 0) .

Следующее, что нужно сделать, это создать функцию, которая порождает туннель в SpawnPoint .

Создание туннелей в точке появления

Щелкните Компиляция и затем переключитесь на BP_TunnelSpawner .

Следующий BP_Tunnel должен появиться в SpawnPoint самого дальнего туннеля . При этом туннель всегда будет продолжаться.

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

Открыть график для SpawnTunnel . Щелкните правой кнопкой мыши на выводе Возвращаемое значение узла Spawn Actor From Class . Выберите Повышение до переменной и переименуйте переменную в NewestTunnel .

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

Затем создайте новую функцию и назовите ее SpawnTunnelAtSpawnPoint . Создайте следующий граф:

Эта установка получит новейший туннель и расположение его компонента SpawnPoint . Затем в этом месте появится новый туннель.

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

Создание ссылки на генератор туннелей

Нажмите Компилировать , а затем закройте граф SpawnTunnelAtSpawnPoint . После этого переключитесь на BP_Tunnel .

Добавьте новую переменную и назовите ее TunnelSpawner . Установите для его Variable Type значение BP_TunnelSpawner\Object Reference .

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

Откройте граф для SpawnTunnel и добавьте указанные узлы:

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

Затем вы указываете BP_TunnelSpawner создавать следующий туннель, когда игрок входит в TriggerZone .

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

Щелкните Компиляция и затем переключитесь на BP_Tunnel .

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

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

Во-первых, вы должны проверить, является ли игроком Актер , перекрывающий TriggerZone .

Щелкните левой кнопкой мыши и перетащите Другой актер булавку. Отпустите , щелкните левой кнопкой мыши в пустой области и выберите в меню 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 9. 0028 узел

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

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

Spawning More Tunnels

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

Откройте BP_TunnelSpawner и создайте новую функцию с именем SpawnInitialTunnels .

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

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

В этом уроке вы создадите три туннеля. Чтобы выполнить три цикла, установите для параметра Last Index значение 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. Во время последующих циклов он создаст туннель на 9-й0027 SpawnPoint новейшего туннеля

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

Теперь при запуске игры появляются три туннеля.

Щелкните Скомпилируйте , вернитесь в главный редактор и нажмите Воспроизвести . Туннель стал намного длиннее!

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

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

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

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

Перейдите на панель Details и измените свойство Static Mesh на SM_Hole_01 .

Затем установите для свойства Location значение (2470, 0, 0) . Это поместит его в конец туннеля.

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

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

Это заставит WallMesh вращаться каждый кадр на указанную величину.

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

Давайте оживим его, добавив несколько вариантов стен.

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

Вместо создания нового чертежа для каждого варианта вы можете просто рандомизировать WallMesh .

Откройте BP_Tunnel и создайте новую функцию с именем RandomizeWall . После этого создайте следующий график:

Как следует из названия, Set Static Mesh 9Узел 0028 установит WallMesh на предоставленную сетку.

Чтобы составить список статических мешей, вы можете использовать узел Select .

Щелкните левой кнопкой мыши и перетащите булавку New Mesh . Отпустите , щелкните левой кнопкой мыши в пустой области, а затем добавьте узел Select .

Узел Select позволяет установить список опций. Вход Index определяет, какой вариант Select 9Выходы узла 0028.

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

Затем установите для каждой опции следующие значения:

  • Опция 0: SM_Hole_01
  • Вариант 1: SM_Hole_02
  • Вариант 2: SM_Hole_03
  • Вариант 3: SM_Hole_04

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

Рандомизация стены

Вы можете использовать узел Random Integer in Range для получения случайного числа. Этот узел вернет значение >= Min и <= Max .

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

Установите для параметра Max значение 3 . Это даст вам четыре возможных числа: 0, 1, 2 и 3.

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

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

Вот окончательный график:

Сводка:

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

Щелкните Компилировать , а затем закройте график RandomizeWall .

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

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

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

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

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

Обработка столкновений со стенами

Чтобы разрешить или запретить движение вперед, вы можете использовать логическую переменную . У них есть только два состояния: true и false .

Откройте BP_Player и затем создайте новую логическую переменную с именем IsDead .

Далее перейдите к узлу Event Tick и создайте Branch узел.

После этого получите ссылку на IsDead и подключите ее к выводу Condition узла Branch .

Соедините узел Event Tick с узлом Branch . После этого подключите контакт False узла Branch к узлу AddActorWorldOffset .

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

Далее, давайте установим переменную IsDead , когда игрок ударяется о стену.

Установка переменной IsDead

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

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

Во-первых, вам нужно проверить, является ли Актер , столкнувшийся с WallMesh , игроком.

Щелкните левой кнопкой мыши и перетащите Другой актер булавку. Отпустите , щелкните левой кнопкой мыши в пустой области и выберите в меню Cast to BP_Player .

Затем щелкните левой кнопкой мыши и перетащите вывод BP_Player узла Cast на узел BP_Player . Выпуск щелкните левой кнопкой мыши на пустом месте, а затем добавьте узел Set Is Dead .

Установите IsDead на true , щелкнув левой кнопкой мыши флажок .

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

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

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

Отображаемый виджет называется WBP_Restart . Вы можете найти его в папке UI . Вот как это выглядит:

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

Затем перейдите к графику событий и найдите Событие BeginPlay узел.

Добавьте узел Create Widget и установите для Class значение WBP_Restart .

После этого добавьте узел Set Restart Widget , а затем соедините все так:

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

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

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

Итог:

  1. Добавление в область просмотра покажет RestartWidget на экране
  2. Установить режим ввода только через пользовательский интерфейс ограничит взаимодействие игрока с пользовательским интерфейсом. Это сделано для того, чтобы игрок не мог двигаться, пока он мертв.
  3. Как следует из названия, Set Show Mouse Cursor просто отображает курсор мыши

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

Вызов функции отображения

Закройте график DisplayRestart и нажмите Compile .

Переключитесь на BP_Tunnel , а затем найдите узел On Component Hit (WallMesh) .

Добавьте узел DisplayRestart в конец цепочки узлов.

Нажмите Скомпилируйте и затем закройте BP_Tunnel . Вернитесь в главный редактор и нажмите Play . Если вы ударитесь о стену, появится кнопка перезапуска.

Последний шаг — перезапуск игры, когда игрок нажимает кнопку.

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

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

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

Начнем со сброса плеера.

Сброс плеера

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

Сводка:

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

Теперь давайте возродим туннели.

Возобновление туннелей

Щелкните Скомпилируйте и затем закройте BP_Player .

Откройте BP_TunnelSpawner и убедитесь, что вы находитесь в графе SpawnInitialTunnels .

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

Добавьте узел Последовательность после узла Запись . Подключите Затем 1 контакт к узлу ForLoop .

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

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

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

Наконец, подключите контакт Then 0 узла Sequence к узлу Get All Actors of Class . Это гарантирует, что туннели будут удалены до процесса нереста.

Вот окончательный график:

Последнее, что нужно сделать, это обработать нажатие кнопки.

Обработка нажатий кнопок

Щелкните Скомпилируйте и затем закройте BP_TunnelSpawner .

Перейдите в Content Browser и перейдите к UI папка. Дважды щелкните на WBP_Restart , чтобы открыть его.

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

Это создаст узел с именем On Clicked (RestartButton) . Этот узел запустится, когда игрок нажмет кнопку RestartButton .

Воссоздайте следующее:

Сводка:

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

Примечание: Вам может быть интересно, почему я использовал Получить всех актеров класса вместо ссылки на BP_TunnelSpawner . Основная причина в том, что BP_Tunnel не имеет отношения к WBP_Restart . Для такой простой игры проще использовать описанный выше метод, чем выяснять, где хранить ссылку.

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

Куда идти дальше?

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

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

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

Если вы хотите узнать, как сделать определенный тип игры, оставьте комментарий ниже!

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

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

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

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

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

  • Непрерывно перемещать игрока вперед
  • Создавать препятствия, которых игрок должен избегать
  • Рандомизируйте препятствия для создания вариаций
  • Создать кнопку перезапуска, которая отображается, когда игрок сталкивается с препятствием

В конце у вас будет такая игра:

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

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

Загрузите начальный проект и разархивируйте его. Перейдите в папку проекта и откройте InfiniteMatrix.upproject .

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

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

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

Перемещение игрока вперед

Перейдите к папке Blueprints и откройте BP_Player .

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

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

Затем убедитесь, что вы находитесь в графике событий, а затем найдите узел Event Tick . Создайте следующую настройку:

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

Примечание: Если вы не знакомы с независимостью частоты кадров, прочтите наше руководство по Blueprints. Мы покрываем это в Раздел Независимости частоты кадров .

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

Перемещение по одной оси

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

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

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

Убедитесь, что контакт Delta Location узла AddActorWorldOffset не имеет соединений. Щелкните правой кнопкой мыши штифт Delta Location и выберите Split Struct Pin .

Наконец, соедините все следующим образом:

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

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

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

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

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

Перейдите в Content Browser и убедитесь, что вы находитесь в папке Blueprints . Создайте новый класс Blueprint с Актером в качестве родительского класса. Назовите это BP_TunnelSpawner , а затем откройте его.

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

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

Они также появятся в качестве выходных контактов на Entry узле функции.

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

Переименуйте входной параметр в SpawnLocation и измените его тип на Вектор .

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

Чтобы установить место появления, щелкните правой кнопкой мыши булавку Преобразование создания и выберите Разделить структурную булавку . После этого свяжите узел Spawn Actor From Class с узлом Entry следующим образом:0005

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

Давайте проверим!

Тестирование генератора туннелей

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

На узле SpawnTunnel установите Spawn Location 9от 0028 до (2000, 0, 500) .

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

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

Затем перейдите в Content Browser. Щелкните левой кнопкой мыши и перетащите BP_TunnelSpawner в область просмотра. Это добавит его экземпляр на уровень.

Если вы нажмете Играть , игра создаст туннель над игроком и вдали от него.

После завершения тестирования вернитесь к BP_TunnelSpawner . Сбросьте Spawn Location узла SpawnTunnel на (0, 0, 0) .

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

В следующем разделе вы настроите функциональность для BP_Tunnel .

Настройка схемы туннеля

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

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

Начнем с создания триггерной зоны.

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

Откройте BP_Tunnel и перейдите на панель «Компоненты». Добавьте компонент Box Collision и назовите его TriggerZone .

В данный момент область столкновения очень мала. Перейдите на панель сведений и найдите Раздел формы . Задайте для свойства Box Extent значение (32, 500, 500) .

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

Теперь пришло время создать точку появления

Создание точки появления

Чтобы определить местоположение точки появления, вы можете использовать 9Компонент 0027 Сцена . Эти компоненты идеально подходят для определения местоположений, потому что они содержат только Transform. Они также видны в окне просмотра, поэтому вы можете видеть, где находится ваша точка возрождения.

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

Сетка туннеля имеет длину 2500 единиц по оси X , так что это место, где должна быть точка присоединения. Перейдите на панель Details и установите Местоположение свойство (2500, 0, 0) .

Следующее, что нужно сделать, это создать функцию, которая порождает туннель в SpawnPoint .

Создание туннелей в точке появления

Щелкните Компиляция и затем переключитесь на BP_TunnelSpawner .

Следующий BP_Tunnel должен появиться в SpawnPoint самого дальнего туннеля . При этом туннель всегда будет продолжаться.

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

Открыть график для SpawnTunnel . Щелкните правой кнопкой мыши на выводе Возвращаемое значение узла Spawn Actor From Class . Выберите Повышение до переменной и переименуйте переменную в NewestTunnel .

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

Затем создайте новую функцию и назовите ее SpawnTunnelAtSpawnPoint . Создайте следующий граф:

Эта установка получит новейший туннель и расположение его компонента SpawnPoint . Затем в этом месте появится новый туннель.

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

Создание ссылки на генератор туннелей

Нажмите Компилировать , а затем закройте граф SpawnTunnelAtSpawnPoint . После этого переключитесь на BP_Tunnel .

Добавьте новую переменную и назовите ее TunnelSpawner . Установите для его Variable Type значение BP_TunnelSpawner\Object Reference .

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

Откройте граф для SpawnTunnel и добавьте указанные узлы:

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

Затем вы указываете BP_TunnelSpawner создавать следующий туннель, когда игрок входит в TriggerZone .

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

Щелкните Компиляция и затем переключитесь на BP_Tunnel .

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

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

Во-первых, вы должны проверить, является ли игроком Актер , перекрывающий TriggerZone .

Щелкните левой кнопкой мыши и перетащите Другой актер булавку. Отпустите , щелкните левой кнопкой мыши в пустой области и выберите в меню 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 9. 0028 узел

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

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

Spawning More Tunnels

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

Откройте BP_TunnelSpawner и создайте новую функцию с именем SpawnInitialTunnels .

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

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

В этом уроке вы создадите три туннеля. Чтобы выполнить три цикла, установите для параметра Last Index значение 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. Во время последующих циклов он создаст туннель на 9-й0027 SpawnPoint новейшего туннеля

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

Теперь при запуске игры появляются три туннеля.

Щелкните Скомпилируйте , вернитесь в главный редактор и нажмите Воспроизвести . Туннель стал намного длиннее!

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

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

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

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

Перейдите на панель Details и измените свойство Static Mesh на SM_Hole_01 .

Затем установите для свойства Location значение (2470, 0, 0) . Это поместит его в конец туннеля.

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

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

Это заставит WallMesh вращаться каждый кадр на указанную величину.

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

Давайте оживим его, добавив несколько вариантов стен.

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

Вместо создания нового чертежа для каждого варианта вы можете просто рандомизировать WallMesh .

Откройте BP_Tunnel и создайте новую функцию с именем RandomizeWall . После этого создайте следующий график:

Как следует из названия, Set Static Mesh 9Узел 0028 установит WallMesh на предоставленную сетку.

Чтобы составить список статических мешей, вы можете использовать узел Select .

Щелкните левой кнопкой мыши и перетащите булавку New Mesh . Отпустите , щелкните левой кнопкой мыши в пустой области, а затем добавьте узел Select .

Узел Select позволяет установить список опций. Вход Index определяет, какой вариант Select 9Выходы узла 0028.

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

Затем установите для каждой опции следующие значения:

  • Опция 0: SM_Hole_01
  • Вариант 1: SM_Hole_02
  • Вариант 2: SM_Hole_03
  • Вариант 3: SM_Hole_04

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

Рандомизация стены

Вы можете использовать узел Random Integer in Range для получения случайного числа. Этот узел вернет значение >= Min и <= Max .

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

Установите для параметра Max значение 3 . Это даст вам четыре возможных числа: 0, 1, 2 и 3.

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

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

Вот окончательный график:

Сводка:

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

Щелкните Компилировать , а затем закройте график RandomizeWall .

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

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

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

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

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

Обработка столкновений со стенами

Чтобы разрешить или запретить движение вперед, вы можете использовать логическую переменную . У них есть только два состояния: true и false .

Откройте BP_Player и затем создайте новую логическую переменную с именем IsDead .

Далее перейдите к узлу Event Tick и создайте Branch узел.

После этого получите ссылку на IsDead и подключите ее к выводу Condition узла Branch .

Соедините узел Event Tick с узлом Branch . После этого подключите контакт False узла Branch к узлу AddActorWorldOffset .

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

Далее, давайте установим переменную IsDead , когда игрок ударяется о стену.

Установка переменной IsDead

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

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

Во-первых, вам нужно проверить, является ли Актер , столкнувшийся с WallMesh , игроком.

Щелкните левой кнопкой мыши и перетащите Другой актер булавку. Отпустите , щелкните левой кнопкой мыши в пустой области и выберите в меню Cast to BP_Player .

Затем щелкните левой кнопкой мыши и перетащите вывод BP_Player узла Cast на узел BP_Player . Выпуск щелкните левой кнопкой мыши на пустом месте, а затем добавьте узел Set Is Dead .

Установите IsDead на true , щелкнув левой кнопкой мыши флажок .

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

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

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

Отображаемый виджет называется WBP_Restart . Вы можете найти его в папке UI . Вот как это выглядит:

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

Затем перейдите к графику событий и найдите Событие BeginPlay узел.

Добавьте узел Create Widget и установите для Class значение WBP_Restart .

После этого добавьте узел Set Restart Widget , а затем соедините все так:

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

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

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

Итог:

  1. Добавление в область просмотра покажет RestartWidget на экране
  2. Установить режим ввода только через пользовательский интерфейс ограничит взаимодействие игрока с пользовательским интерфейсом. Это сделано для того, чтобы игрок не мог двигаться, пока он мертв.
  3. Как следует из названия, Set Show Mouse Cursor просто отображает курсор мыши

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

Вызов функции отображения

Закройте график DisplayRestart и нажмите Compile .

Переключитесь на BP_Tunnel , а затем найдите узел On Component Hit (WallMesh) .

Добавьте узел DisplayRestart в конец цепочки узлов.

Нажмите Скомпилируйте и затем закройте BP_Tunnel . Вернитесь в главный редактор и нажмите Play . Если вы ударитесь о стену, появится кнопка перезапуска.

Последний шаг — перезапуск игры, когда игрок нажимает кнопку.

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

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

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

Начнем со сброса плеера.

Сброс плеера

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

Сводка:

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

Теперь давайте возродим туннели.

Возобновление туннелей

Щелкните Скомпилируйте и затем закройте BP_Player .

Откройте BP_TunnelSpawner и убедитесь, что вы находитесь в графе SpawnInitialTunnels .

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

Добавьте узел Последовательность после узла Запись . Подключите Затем 1 контакт к узлу ForLoop .

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

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

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

Наконец, подключите контакт Then 0 узла Sequence к узлу Get All Actors of Class . Это гарантирует, что туннели будут удалены до процесса нереста.

Вот окончательный график:

Последнее, что нужно сделать, это обработать нажатие кнопки.

Обработка нажатий кнопок

Щелкните Скомпилируйте и затем закройте BP_TunnelSpawner .

Перейдите в Content Browser и перейдите к UI папка. Дважды щелкните на WBP_Restart , чтобы открыть его.

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

Это создаст узел с именем On Clicked (RestartButton) . Этот узел запустится, когда игрок нажмет кнопку RestartButton .

Воссоздайте следующее:

Сводка:

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

Примечание: Вам может быть интересно, почему я использовал Получить всех актеров класса вместо ссылки на BP_TunnelSpawner . Основная причина в том, что BP_Tunnel не имеет отношения к WBP_Restart . Для такой простой игры проще использовать описанный выше метод, чем выяснять, где хранить ссылку.

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

Куда идти дальше?

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

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