Назад в библиотеку

Первоисточник: https://www.ijraset.com/best-journal/3d-first-person-shooter-game-developed-using-unreal-engine

УДК 004.____

РАЗРАБОТКА 3D ШУТЕРА ОТ ПЕРВОГО ЛИЦА
С ИСПОЛЬЗОВАНИЕМ UNREAL ENGINE 5

Nihar Raut, Sanket Chopade, Tejas Nichat,
Himanshu Kuhad, Shreeniwas Bangade, Prof. Devchand Choudhari

Department of Computer Science and Engineering,
Government College of Engineering Chandrapur, Maharashtra, India
(пять первых авторов – студенты кафедры, Prof. Devchand Choudhari – ассистент-профессор)

Источник: International Journal for Research in Applied Science & Engineering Technology (IJRASET). – 2023. – Vol. 11, Issue V. – May 2023. – DOI: https://doi.org/10.22214/ijraset.2023.51039.

Аннотация

В данной работе рассматривается разработка 3D-шутера от первого лица с использованием Unreal Engine 5. Описаны основы разработки игр в Unreal Engine 5 и показано, как этот движок может быть использован для создания 3D-игры от первого лица. Поскольку Unreal Engine заметно изменился за последние годы, в статье также рассматриваются новые функции и методы, внедрённые в недавних версиях движка. Дополнительно обсуждаются трудности, с которыми столкнулись в процессе разработки игры, и способы их преодоления.:contentReference[oaicite:0]{index=0}

Введение

Индустрия видеоигр стремительно развивается: по оценкам, к 2022 году её мировой объём превысил 200 млрд долларов. В результате разработка игр стала всё более востребованным карьерным направлением, и многие начинающие разработчики стремятся создать собственные игры.

Одним из популярных жанров являются 3D-игры. Такие игры погружают игрока в виртуальный мир, позволяя исследовать окружение, взаимодействовать с объектами и персонажами, а также участвовать в сражениях. С выходом Unreal Engine 5 у разработчиков появилась мощная платформа для создания 3D-игр. Цель данной работы – дать всесторонний обзор процесса разработки 3D-шутера от первого лица на базе Unreal Engine 5.

В статье рассматриваются этапы разработки игры: стадия проектирования, реализация, тестирование и оптимизация. Подробно описаны инструменты и функции Unreal Engine 5, которые наиболее важны при создании 3D-шутера от первого лица.

По итогам прочтения статьи читатель получает целостное представление о процессе разработки 3D-игры от первого лица на Unreal Engine 5, а также понимание принципов проектирования, лежащих в основе успешных проектов данного типа. Эта информация может быть полезна начинающим разработчикам игр, студентам и специалистам индустрии видеоигр.

Дизайн

На стадии проектирования важно создать подробный план, определяющий концепцию игры, игровые механики и ключевые особенности. Чёткая проработка плана до начала полной разработки помогает избежать неясностей и упрощает процесс реализации. В числе шагов, связанных с созданием такого плана, – определение концепции игры, создание прототипа, проработка игрового мира, способностей игрока и вооружения, проектирование уровней, пользовательского интерфейса, а также тестирование и итерационное улучшение дизайна. Благодаря этому разработчики могут гарантировать, что итоговый продукт соответствует замыслу и обеспечивает увлекательный игровой опыт.

  1. Определить концепцию игры. На первом шаге формулируются концепция игры, сюжет, сеттинг и основные игровые механики.
  2. Создать прототип игры. После определения концепции создаётся прототип, демонстрирующий ключевые игровые механики. Это позволяет протестировать и уточнить геймплей до начала полного цикла разработки.
  3. Разработать игровой мир. Игровой мир – это пространство, в котором разворачивается действие игры. Сюда относятся проектирование окружения (ландшафты, здания и другие объекты), а также создание неперсонажей-игроков (NPC) и врагов.
  4. Определить способности игрока и оружие. Способности и вооружение – ключевые элементы шутера от первого лица. Необходимо спроектировать их так, чтобы они были интересными и сбалансированными, предоставляя игроку различные варианты взаимодействия с миром.
  5. Спроектировать уровни. Уровни – это отдельные этапы или части игры, которые проходит игрок. Их дизайн должен быть тщательно продуман, чтобы обеспечить сложный и в то же время вознаграждающий проход, с балансом исследования, боя и головоломок.
  6. Спроектировать пользовательский интерфейс (UI). Интерфейс – основной способ взаимодействия игрока с миром игры: меню, элементы HUD и другие визуальные подсказки. UI должен быть интуитивно понятным и простым в использовании, при этом предоставляя игроку необходимую информацию для принятия решений.
  7. Тестировать и улучшать дизайн. На протяжении всей стадии дизайна важно регулярно тестировать игру и собирать обратную связь от игроков. Эта информация используется для итерационной доработки дизайна и повышения качества игрового процесса.

На стадии проектирования нашей игры на Unreal Engine 5 было решено, что это будет динамичный шутер с простыми игровыми механиками, тремя типами оружия и одной картой. Мы выбрали формат открытого мира, чтобы игрок мог свободно перемещаться по локации, не будучи «привязанным» к квестам. Такой подход был обусловлен ограничениями по времени и ресурсам и позволил сохранить игру сравнительно простой. Сосредоточившись на одной карте и возможности свободного исследования, мы добились того, чтобы игра оставалась увлекательной, но при этом была реализуемой в заданные сроки. Кроме того, этот подход даёт игрокам чувство свободы и погружения в игровой мир.

Реализация

На стадии реализации разрабатываемый дизайн переводится в рабочие игровые ресурсы и код: создаётся базовый прототип игры, программируются механики, внедряется пользовательский интерфейс. Это критический этап, где игра «обретает форму» и начинает оживать. Здесь мы используем возможности Unreal Engine 5 для создания насыщенного и увлекательного геймплея, уделяя особое внимание оптимизации и производительности, чтобы обеспечить плавный и комфортный игровой процесс. Для удобства разработки весь процесс был разделён на отдельные модули, каждый из которых добавляет в игру новую составляющую.

A. Настройка проекта

Первый модуль реализации был посвящён настройке проекта. Сначала мы создали проект в Unreal Engine и выбрали шаблон «Third Person Game». Затем можно было добавить стартовый контент или отказаться от него, после чего Unreal Engine автоматически сгенерировал стартовую карту для начала разработки.

Следующим шагом стало создание blueprint-класса режима игры (Game Mode), определяющего правила и механику. Этот blueprint отвечает за начальное состояние игры, включая создание персонажей игрока и выполнение задач инициализации. Наличие отдельного режима игры позволяет легко модифицировать и улучшать геймплей без серьёзных изменений в коде.

После создания Game Mode мы реализовали базовый класс персонажа с компонентом Mesh – 3D-моделью объекта в игровом мире. Unreal Engine предоставляет инструменты для работы с мешами, включая импорт моделей из внешних редакторов, создание и редактирование внутри движка, а также применение материалов и текстур. Мы также реализовали систему камеры и систему перемещения, позволяющие игроку наблюдать за персонажем, следовать за ним и свободно перемещаться по миру. Эти системы образуют основу взаимодействия игрока с игрой и задают базис для дальнейшей разработки.

B. Анимация

Во втором модуле мы сосредоточились на анимации персонажа. Персонаж уже мог перемещаться, но отсутствие анимации делало его движение комичным. Цель модуля – реализовать анимации с помощью Animation Blueprint и машин состояний.

Анимация персонажей в Unreal Engine строится на Animation Blueprint, который определяет различные анимации и переходы между ними в зависимости от текущего состояния персонажа. Animation Blueprint содержит набор state machine, описывающих состояния: ожидание, ходьба, бег, прыжок и т.п. Каждое состояние содержит анимационные узлы, указывающие, какая анимация должна проигрываться.

Для создания анимаций можно использовать внешние инструменты, такие как Maya или Blender, и импортировать готовые анимационные последовательности в Unreal Engine, либо приобретать сторонние анимационные ассеты. После импорта анимации добавляются в соответствующие узлы state machine.

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

Используя Animation Blueprint и state machine, можно создавать сложные анимации с плавными переходами между разными состояниями. В нашем случае мы создали простую state machine для уже реализованной механики перемещения. Она получила название «Ground Locomotion» и включала четыре состояния: «idle» (ожидание), «run start» (начало бега), «run» (бег) и «run stop» (остановка бега); для каждого состояния была назначена соответствующая анимация.

C. Прицеливание и прицел (crosshair)

Третий модуль посвящён реализации механики прицеливания и отображения прицела. Прицеливание крайне важно в шутере, поскольку позволяет игроку точно стрелять по врагам. Для эффекта прицеливания мы используем изменение угла обзора камеры (FOV – Field of View), определяющего, какую часть окружения видит камера.

Когда игрок удерживает кнопку прицеливания, вызывается функция, которая постепенно уменьшает FOV с помощью интерполяции, создавая эффект приближения (zoom). Помимо этого, мы создаём на экране сам прицел – маленький графический элемент в центре экрана, показывающий направление оружия.

В Unreal Engine прицел реализуется через HUD-blueprint. Для этого создаётся класс HUD, в его Event Graph добавляется событие DrawHUD, внутри которого с помощью функций DrawLine или DrawTexture рисуется небольшое изображение прицела в центре экрана. Внешний вид прицела настраивается под эстетику игры. Затем HUD-blueprint назначается для уровня или персонажа через функцию SetHUD. Базовая реализация может дополнительно кастомизироваться в зависимости от требований игры.

D. Оружие

В модуле, посвящённом оружию, ставится задача реализовать базовый класс оружия, от которого будут наследоваться три типа: пистолет, автомат (assault rifle) и пистолет-пулемёт. Чтобы обеспечить возможность подбирать оружие с земли, создаётся класс «Item», от которого наследуются классы оружия и боеприпасов. В нём содержатся все необходимые переменные и компоненты, позволяющие дочерним классам взаимодействовать с игровым миром.

Для реализации простого оружия с мешем и эффектом вспышки из ствола (muzzle flash) на C++ создаётся новый класс, наследующийся от AActor. В этот класс добавляются компоненты Skeletal Mesh и Particle System. Skeletal Mesh представляет оружие в мире, а Particle System используется для визуализации вспышки при выстреле. В меш оружия добавляется сокет, из которого будет порождаться частица вспышки. В конструкторе класса задаются ресурсы для меша и системы частиц.

Далее в классе оружия реализуется функция Fire, которая порождает эффект вспышки у соответствующего сокета, выполняет трассировку (Line Trace) из ствола для обнаружения попаданий и создаёт эффект столкновения в точке попадания, если цель была обнаружена.

В классе персонажа создаётся сокет для крепления оружия к скелету. Затем создаётся экземпляр класса оружия и прикрепляется к этому сокету; при нажатии игроком кнопки выстрела вызывается функция Fire.

Кроме того, в этом модуле создаётся виджет подбора (pickup widget) – визуальный элемент, который появляется на экране, когда игрок подходит к предмету (оружие, патроны, аптечки). Для этого создаётся UI-widget blueprint, настраиваются свойства текста (шрифт, размер, цвет). В Event Graph добавляется пользовательское событие SetPickupText, внутри которого узлом SetText изменяется текст виджета.

В blueprint уровня или персонажа создаётся переменная типа «Widget Class», указывающая на созданный виджет. Когда игрок подходит к предмету, вызывается событие SetPickupText с нужной строкой; при выходе из области триггера – снова с пустой строкой, чтобы скрыть виджет. В завершение реализуются функции поднятия и броска предметов с земли, позволяющие игроку взаимодействовать с ними и использовать их.

E. Интерполяция предметов

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

В классе Item добавляется свойство UPROPERTY для Z-кривой и переменная с длительностью эффекта подбора. Создаётся функция Pickup, принимающая ссылку на персонажа-игрока.

Внутри функции Pickup отключаются коллизии и физическая симуляция предмета. Затем с помощью SetActorLocationAndRotation предмет поднимается вверх вдоль оси Z, используя Z-кривую для интерполяции. После завершения подъёма объект удерживается в течение заданного времени с помощью задержки или таймера.

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

F. Перезарядка

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

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

Параллельно реализуются анимации оружия, которые хранятся в Animation Montage – контейнере для нескольких анимаций, проигрываемых последовательно. Создаётся перечисление (enum) для отслеживания типа оружия, которым владеет персонаж, и на его основе выбираются нужные анимации.

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

G. Расширенная система движения

В любом шутере механика движения персонажа критически важна для общего впечатления от игры. Базовые механики могут работать приемлемо, однако дополнительные возможности движения делают управление более естественным и погружённым. Один из таких элементов – анимации разворота на месте (turn-in-place).

Механика turn-in-place позволяет игроку разворачивать персонажа, не изменяя его положения в пространстве. Это особенно полезно, когда нужно быстро отреагировать на появление врага или препятствия, не смещаясь с места. Реализовать такую механику можно разными способами; один из наиболее распространённых – использовать смешивание анимаций (animation blending).

При смешивании анимаций несколько анимаций проигрываются одновременно и плавно комбинируются. Для turn-in-place проигрывается анимация разворота, при этом позиция персонажа не меняется. Анимация запускается по определённой команде (нажатие кнопки, движение мыши и т.п.) и может повторяться в цикле, пока команда активна.

Другой подход – использование root motion, при котором движение персонажа полностью задаётся анимацией. В этом случае анимация разворота управляет корневой костью скелета, разворачивая персонажа на месте без фактического перемещения его координат. Этот метод даёт более точный контроль, но требует более сложной настройки анимации.

В нашем 3D-шутере на Unreal Engine мы используем комбинацию обоих подходов. Меш персонажа делится на две части – верхнюю и нижнюю, каждая из которых проигрывает свои анимации. Разделение происходит по корневой кости. Когда игрок поворачивает камеру за заданный порог (в нашем случае 90 градусов), на нижнюю часть тела проигрываются анимации разворота на месте, заставляя персонажа развернуться в направлении взгляда камеры.

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

H. Подбор боеприпасов

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

Для реализации патронов мы используем ранее созданный класс Item. Он уже содержит функциональность взаимодействия игрока с предметом, и наследование позволяет повторно использовать её. Однако логика подбора отличается от оружия: патроны поднимаются автоматически при простом пересечении триггерной области.

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

Подбор боеприпасов добавляет стратегический слой: игрок должен грамотно управлять запасом патронов, отслеживать размещённые по уровню аммуниционные объекты и своевременно пополнять боезапас. Использование существующего класса Item и простой сферы перекрытия делает реализацию эффективной и простой.

I. Контур и эффекты свечения

В шутере подбираемое оружие обычно разбросано по уровню, и игроку важно легко отличать такие объекты от окружения. Для этого используются эффекты контура (outline) и свечения (glow), которые позволяют сделать оружие визуально заметным.

Контурный эффект реализуется посредством Custom Depth. Custom Depth – это приём рендеринга в Unreal, позволяющий записывать глубину объекта в отдельный буфер. На основе этого буфера можно выделять объект и применять к нему постобработку (обводка, свечения и т.п.).

Например, в шутере Custom Depth позволяет подсветить важные объекты (оружие, врагов), задав им уникальное значение в stencil-буфере и применив к ним постобработку с обводкой или свечением. Это облегчает идентификацию важных объектов и улучшает визуальную читаемость сцены. Custom Depth может использоваться и для других целей: отсечения объектов (occlusion culling), эффектов глубины резкости, motion blur и т.д.

Для создания эффекта контура мы выполняем следующие шаги:

  1. Включить Custom Depth для объекта. В панели Details объекта в разделе Rendering включить параметр «Render Custom Depth».
  2. Создать материал постобработки. В Content Browser создать новый Material (например, PostProcessMaterial) и открыть его.
  3. Настроить материал. В Material Editor добавить узел Custom Depth и подключить его к Emissive, затем Emissive – к Material Output. Изменяя значение Emissive, можно управлять интенсивностью контура.
  4. Назначить материал на Post Process Volume. На уровень перетащить Post Process Volume и в его настройках в поле Blendables указать созданный PostProcessMaterial.
  5. Настроить значение Custom Depth Stencil. По умолчанию Custom Depth пишет в stencil-буфер значение 0. Для объектов, которые должны иметь контур, в разделе Rendering задать «Custom Depth Stencil Value» больше 0.
  6. Создать материал постобработки контура. В Content Browser создать новый Material и добавить в него узлы Scene Color, Custom Depth и PostProcessInput0. Вычесть Custom Depth из Scene Color, результат подать на PostProcessInput0 и затем подключить PostProcessInput0 к Material Output.
  7. Добавить ещё один Post Process Volume. На уровень перетащить Post Process Volume и в его настройках в Blendables указать новый материал контура.
  8. Настроить параметры контура. В материале постобработки можно изменять толщину, цвет и интенсивность обводки.

Дополнительно реализуется эффект Френеля. Эффект Френеля – оптическое явление, при котором отражённый свет становится более ярким под острым углом к поверхности, в результате чего края объекта кажутся более подсвеченными. В играх это часто используется для визуального выделения объектов.

Для реализации эффекта Френеля мы используем material functions и material instances, выполняя следующие шаги:

  1. Создать новый базовый материал.
  2. Создать scalar-параметр «Fresnel Power» (по умолчанию 5) – сила эффекта.
  3. Создать scalar-параметр «Fresnel Bias» (по умолчанию 0) – положение эффекта.
  4. Создать Material Function с именем «Fresnel».
  5. Внутри функции добавить узел Custom и подключить его к выходу.
  6. В Custom создать узел Lerp и подключить к выходу.
  7. Подключить Fresnel Bias к входу Alpha узла Lerp.
  8. Создать узел Fresnel и подключить к входу A узла Lerp.
  9. Создать узел Power, подключить к нему Fresnel, а параметр Fresnel Power – к входу Power.
  10. Создать Constant со значением 1 и подключить к входу B узла Lerp.
  11. Сохранить Material Function.
  12. В редакторе материалов создать экземпляр (Material Instance) от базового материала.
  13. В нём найти функцию «Fresnel», перетащить в граф и подключить выход к Emissive Color.
  14. Подобрать значения Fresnel Power и Fresnel Bias для нужного визуального эффекта.
  15. Назначить экземпляр материала объекту, для которого требуется эффект Френеля.

Последний эффект в этом модуле – эффект «прокрутки» текстуры, работающий вместе с контуром и Френелем, чтобы создать комплексный эффект свечения.

Для его реализации выполняются следующие шаги:

Меняя значение ScrollSpeed, можно управлять скоростью прокрутки текстуры и, соответственно, интенсивностью визуального эффекта.

Множественные типы оружия

Десятый модуль реализации посвящён созданию трёх разных типов оружия на основе базового класса: пистолет, автомат и пистолет-пулемёт. Они отличаются скорострельностью, уроном, звуком, анимациями перезарядки, ёмкостью магазина, параметрами вспышки ствола, значением custom depth stencil и признаком автоматического огня.

Для управления всеми этими свойствами и удобства изменений используются data table. Data table – это таблица (аналог электронной таблицы), в которой хранятся данные, например настройки игры, параметры уровней и характеристики персонажей.

В нашем случае создана таблица «Weapon Data Table», содержащая свойства каждого вида оружия. Каждая строка – это запись для конкретного оружия (например, штурмовая винтовка), а столбцы – отдельные характеристики (урон, скорострельность и т.п.). При смене оружия класс оружия считывает свойства соответствующей строки таблицы и обновляет свои параметры. Для этого используется переопределённая функция OnConstruction, вызываемая при каждом перемещении объекта в мире.

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

A. Звуки шагов

Шаги – важный аудиоэлемент: они дают игроку информацию о местоположении и движении других персонажей, усиливают реалистичность и могут использоваться как элемент геймдизайна. В этом модуле создаётся система шагов с использованием кастомного AnimNotify – FootstepNotify, реализующего пять типов шагов: по дереву, металлу, камню, воде и траве.

Последовательность действий:

  1. Создать enum EFootstepType в C++ со всеми типами поверхностей.
  2. Создать AnimNotify FootstepNotify в блюпринте персонажа для вызова звука шага.
  3. Добавить переменную FootstepType типа EFootstepType в FootstepNotify для выбора звука.
  4. Создать sound cue для каждого типа шага (используя готовые или собственные звуки).
  5. В FootstepNotify вызывать PlaySoundAtLocation с нужным звуковым cue в зависимости от FootstepType.
  6. Добавить FootstepNotify в нужные моменты временной шкалы анимации (раздел Notify).
  7. Создать функцию SetFootstepType в блюпринте персонажа для определения типа поверхности и установки FootstepType.
  8. Использовать трассировку от стопы персонажа к земле, чтобы определить тип поверхности и установить FootstepType.
  9. Протестировать систему, убедившись, что звуки воспроизводятся вовремя и соответствуют движению.
  10. Благодаря данной системе игрок получает важные аудио-подсказки, повышается реалистичность и глубина игрового опыта.

B. Враг

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

В класс врага добавляются свойства, такие как базовый урон и урон при попадании в голову, определяющие наносимый урон. Создаётся простой виджет для отображения здоровья врага и функция обработки смерти. Все анимации смерти собираются в death montage, а движения бега – в отдельный movement montage.

Реализуется HUD-элемент для отображения числовых значений попаданий (hit numbers), показывающих места попаданий пуль. Для этого создаётся интерфейс BulletHitInterface, реализуемый и классом врага, и классом персонажа. Интерфейс содержит функцию обработки попадания пули, которая позволяет отслеживать каждое попадание и корректно применять урон.

Итогом модуля становится полнофункциональный класс врага с набором свойств, анимаций и HUD-элементом для индикации урона, что делает игру более глубокой и увлекательной.

C. ИИ и деревья поведения

В этом модуле реализуются элементы ИИ с использованием инструментов Unreal Engine. Сначала создаётся ресурс Behavior Tree для описания поведения врагов: патрулирование, преследование и атака. Behavior Tree Editor предоставляет визуальный интерфейс для удобного создания и изменения логики ИИ.

В дереве поведения создаётся узел Patrol, представляющий патрулирование между двумя точками. Для этого добавляются два узла MoveTo, указывающих врагу двигаться к первой и второй точкам. Также создаётся Selector, который проверяет, находится ли игрок в зоне агро или в зоне атаки. В зависимости от этого выбор ветвится к узлу Chase или Wait.

Если игрок в зоне агро, срабатывает узел Chase, в котором враг преследует игрока с помощью MoveTo к его позиции. Когда враг достигает цели, Selector проверяет, находится ли игрок в зоне атаки, и при необходимости переходит к узлу Attack, где выполняется задача атаки. Это делает врага способным активно преследовать и атаковать игрока, повышая сложность.

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

D. Создание уровня

Создание карты в Unreal Engine включает набор задач: построение ландшафта, размещение статических мешей, создание материалов и настройку освещения сцены.

Вначале создаётся базовый ландшафт с помощью инструментов скульптинга. Затем добавляются слои ландшафта (трава, камни, песок), чтобы повысить детализацию и реализм.

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

Затем создаются материалы и текстуры для ландшафта и объектов. В редакторе материалов Unreal можно строить сложные шейдеры, комбинируя различные карты (diffuse, normal, specular и др.), чтобы добиться нужного визуального эффекта.

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

E. Тестирование

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

  1. Функциональное тестирование. Проверяются базовые функции игры: движение, бой, взаимодействие с объектами и персонажами. Ищутся ошибки и глюки, влияющие на функциональность.
  2. Тестирование производительности. Оценивается работа игры на разных конфигурациях оборудования и ОС: время загрузки, частота кадров и другие параметры производительности.
  3. Тестирование совместимости. Проверяется работа игры с различными видеокартами, процессорами, ОС и устройствами, чтобы убедиться, что игра корректно запускается на широком спектре платформ.
  4. Тестирование пользовательского опыта. Оценивается общий UX: интерфейс, управление, ощущения от игры. Выявляются способы улучшения удобства и вовлечённости.
  5. Регрессионное тестирование. Повторная проверка исправленных ранее ошибок для уверенности, что они не вернулись и что исправления не вызвали новых проблем.

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

F. Развёртывание

После успешного тестирования и устранения критических ошибок игра может быть развёрнута. Это включает упаковку проекта и распространение его среди игроков. Unreal Engine 5 предоставляет различные варианты развёртывания, включая публикацию в Epic Games Store и на других платформах распространения.

G. Возникшие трудности

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

Заключение

Unreal Engine 5 – мощный инструмент для разработки игр, позволяющий создавать высококачественные 3D-шутеры от первого лица. В статье рассмотрены основы разработки игр в UE5 и показано, как на его базе можно создать 3D-игру от первого лица. Подробно описаны этапы процесса – от проектирования до тестирования и развёртывания. Также обсуждены возникавшие в ходе разработки сложности и способы их решения.

В целом, создание 3D-шутера от первого лица с использованием Unreal Engine 5 – задача сложная, но благодарная: она даёт ценный опыт работы с современным движком, проектирования игровых систем и оптимизации производительности.

Литература

  1. Epic Games. (2021). Unreal Engine 5. URL: https://www.unrealengine.com/en-US/blog/a-first-look-at-unreal-engine-5
  2. Hill, A. (2019). Mastering Unreal Engine 4.x. Packt Publishing.
  3. Holcomb, J. (2018). The Ultimate Guide to 2D Mobile Game Development with Unity. Apress.
  4. Juul, J. (2005). Half-real: Video games between real rules and fictional worlds. MIT Press.
  5. Sutherland, I., & Wiberg, C. (2018). Game development with Unreal Engine 4: From beginner to professional. CRC Press.
  6. Unreal Engine. (2021). Unreal Engine Documentation. URL: https://docs.unrealengine.com/en-US/index.html
  7. Waltham, C., & Drysdale, T. (2017). Game programming using Qt 5 Beginner's Guide, Second Edition. Packt Publishing.