Outlast список игр на движке unreal engine
Outlast список игр на движке unreal engine
Outlast список игр на движке unreal engine
Outlast
What graphics engine uses this game? (It looks fantastic, by the way)
Wikipedia says UE3
It is Unreal Engine 3.
The only confirmed Unreal Engine 4 game this year is Knack on PS4.
It is Unreal Engine 3.
The only confirmed Unreal Engine 4 game this year is Knack on PS4.
It is Unreal Engine 3.
The only confirmed Unreal Engine 4 game this year is Knack on PS4.
Анонсирована дата релиза и опубликована демо-версия реалистичного ужастика Caffeine в стиле Outlast на движке Unreal Engine 4
Игра отличается своим реалистичным оформлением. В качестве движка для своего ужастика Дилан Браун (Dylan Brown) выбрал Unreal Engine 4, стараясь сделать свой проект максимально реалистичным. Дата релиза игры запланирована на октябрь 2015 года. Игра появится в трех эпизодах.
«Население Земли истощило запасы ценного ресурса кофеина. Поэтому крупные корпорации принялись строить огромные космические корабли, чтобы добывать ресурс в космосе и удовлетворить спрос на него на планете», — рассказал автор игры.
«Вы просыпаетесь на одном из этих кораблей в роли маленького ребенка. Здесь вам предстоит исследовать нелинейную структуру корабля, чтобы выяснить, что случилось с командой, и в каком состоянии находится корабль. В игре представлена простая механика исследования, незамысловатые загадки и атмосфера ужаса».
UE4 для Unity-разработчиков
Привет, Хабр! Меня зовут Александр, и сегодня мы сравним Unity и Unreal Engine 4.
Думаю, многие разработчики пробовали движок Unity и видели сделанные на нём игры, проекты, какие-то демки. Его главный конкурент — движок Unreal Engine. Он берёт своё начало в проектах компании Epic Games, таких как шутер Unreal Tournament. Давайте рассмотрим, как начать работу с движком Unreal после Unity и какие препятствия могут подстерегать нас на пути.
Бывает, что 3D-движки сравнивают весьма поверхностно, либо акцентируют внимание только на одной из фич, например, на графике. Мы же холиварить не будем и рассмотрим оба движка в качестве равноправных инструментов. Наша цель — сопоставить две технологии и помочь вам разобраться в движке Unreal Engine 4. Сравним базовые системы движков на конкретных примерах кода демо-проекта UShooter (Unreal + Unity Shooter), специально сделанного для этих целей. Проект использует версию Unity 5.5.0 и Unreal Engine 4.14.3.
Система компонентов (Unity)
Когда мы запускаем проект на Unreal, то видим, что персонаж в сцене — лишь один объект. В окне World Outliner нет привычных нодов модели (вложенных объектов, мешей), костей скелета и т. д. Это следствие различий систем компонентов Unity и Unreal.
В Unity сцена состоит из объектов типа Game Object. Это пустой универсальный объект, к которому добавляются компоненты, реализованные скриптами поведения (MonoBehaviour) и встроенными компонентами движка. Иногда их оставляют пустыми, в качестве объекта-маркера, на месте которого будет создан, например, игровой персонаж или эффект.
Система компонентов (UE4)
Персонажи и их Controller’ы
ACharacter создан на основе APawn и имеет расширенные механизмы перемещения, встроенный компонент скелетного меша, базовую логику перемещения персонажа и его представление для сетевой игры. Для оптимизации можно создать персонажа на основе APawn и реализовать только необходимый проекту функционал.
Описание игрового класса (Actor’а)
Теперь, немного узнав о компонентах Unreal, мы можем взглянуть на класс ракеты в Unreal-версии UShooter.
Функция OnImpact — аналог OnCollisionEnter в Unity. Но для работы с ней требуется подписаться на события компонента USphereComponent в конструкторе или даже во время игры. Это не работает автоматически, как в Unity, зато здесь есть возможность оптимизации. Если нам больше не нужно реагировать на столкновения, мы можем отписаться от события.
Блупринты (Blueprint)
Типичное действие после создания C++ класса в Unreal — создание на его основе Blueprint Class ’а. Это расширение объекта, которое нам предоставляет Unreal. Система Blueprint’ов в Unreal используется для визуального программирования. Мы можем создавать визуальные схемы, соединять события с какими-то реакциями на них. Через блупринты движок упрощает взаимодействие программистов и дизайнеров. Мы можем написать на С++ часть игровой логики и предоставить доступ к ней дизайнерам.
При этом Unreal позволяет отделить, если требуется, C++ исходники проекта от его бинарников и контента. Дизайнеры или аутсорсеры могут работать с собранными dll-библиотеками и никогда не узнают, что происходит внутри C++ части проекта. Это дополнительная степень свободы, предоставляемая движком.
Unreal хорош тем, что в нём практически всё связано с Blueprint’ами. Мы можем расширять ими С++ классы, создавать из них Blueprint-наследников и т. д. Эта система тесно связана со всеми компонентами движка, от его внутренней логики до визуальных компонентов, collision, анимации и т. д.
В Unity есть схожие системы визуального программирования, например Antares Universe. Они не входят в состав движка и созданы поверх него, поэтому в любой момент что-то может сломаться (например, при обновлении версии движка). Система визуального скриптования в Unity не предусмотрена. На мой взгляд, это серьёзный недостаток по сравнению с Unreal. Ведь благодаря таким системам даже далекие от программирования люди могут составить схему взаимодействия объектов или связать какую-то последовательность действий. К слову, в Unreal все шаблоны проектов имеют две версии: как на основе C++ кода, так и целиком на Blueprint’ах. Таким образом, создать простой проект без использования кода, целиком на блупринтах — вполне реально.
Демка шутера (UShooter)
В Unity мы пишем демку с нуля, а в Unreal опираемся на шаблоны. В шаблоне выберем управление и вид камеры, и Unreal сгенерирует проект с указанными настройками. Это хорошая основа, от которой вы можете отталкиваться для ускорения разработки и создания прототипа проекта.
Система ввода (Unity)
Система ввода (UE4)
Вызовом BindAxis(«MoveRight», this, &AUShooterCharacter::MoveRight) в Input Component мы привязываем нажатие кнопки MoveRight к вызову одноимённой функции движения. Не требуется каждый кадр заниматься опросом кнопки.
Также в Unreal не ограничено количество альтернативных кнопок. В Unity в Input Manager есть только основная кнопка и альтернативная. Чем больше устройств ввода в вашей игре, тем острее может быть эта проблема.
Работа с 3D-моделями
Система анимации (Unity)
У нас есть персонаж, мы знаем, как работать с вводом, теперь нужно проигрывать анимацию. В Unity для этого есть Animation Controller, в нём мы описываем определённые состояния персонажа. Например, бежать, прыгать или умереть. Каждому блоку соответствует свой анимационный клип, и мы настраиваем такой граф переходов:
Хотя эта схема называется Animation Controller, внутренней логики у неё нет. Это просто схема переключения анимации в зависимости от состояния. Чтобы она работала, мы заранее объявляем в этом контроллере названия переменных, соответствующих состоянию персонажа. Скрипт, управляющий анимацией, зачастую сам передаёт эти состояния контроллеру каждый кадр.
В переходах между состояниями (на схеме показаны стрелочками) мы настраиваем условия переходов. Можно настроить смешивание (crossfade) анимации, т. e. время, в течение которого одна анимация затухнет, а другая продолжится, для их плавного совмещения.
Система анимации (UE4)
Тут мы видим уже знакомые нам состояния Idle/Run, Jump, Dead. Но один узел совмещает в себе Idle и Run. Внутри него находится так называемый Blend Space 1D, он используется для плавного перехода анимации в зависимости от значения одной или нескольких переменных. С помощью Blend Space можно привязать скорость персонажа к переходу между анимацией Idle и Run. Кроме того, получится настроить несколько точек перехода. Например, от нуля до метра в секунду персонаж идёт медленно — это будет движение, интерполированное между анимацией Idle и Walk. А после некоторого порогового значения включается бег (Run). И всё это будет в одном узле Animation Blueprint’а, который обращается к Blend State.
Стрелочками показаны переходы между состояниями, но, в отличие от Unity, мы можем создать Blueprint, реализующий внутреннюю логику работы этих переходов. В Animation Blueprint есть доступ к персонажу, на котором он используется, поэтому Blueprint сам обращается к его параметрам (скорость движения и т. п.). Это можно рассматривать как дополнительную оптимизацию, так как позволяет не рассчитывать параметры, которые не используются для текущего состояния персонажа.
В Unreal существует множество инструментов для анимации. Montage представляет собой подсистему и редактор, который позволяет совмещать анимационные клипы и их фрагменты.
Тут представлено совмещение машины состояний движения с анимацией атаки, которую мы проигрываем через инструмент Montage.
Проблема вложенных Prefab’ов
Большая проблема в Unity — вложенные prefab’ы. На случай, если проблема вам не знакома, рассмотрим пример.
Предположим, объект «стол с ноутбуком» сохранили в prefab table1, а затем понадобился второй подобный объект, но уже с зелёным цветом экрана ноутбука. Создаём новый prefab — table2, перетаскиваем в него старый ноутбук, меняем цвет экрана на зелёный, сохраняем. В результате table2, второй prefab, становится совершенно новым объектом, у него нет никаких ссылок на оригинал. Если мы поменяем исходный префаб, это никак не отразится на втором префабе. Простейший случай, но даже он не поддерживается движком.
В Unreal, благодаря наследованию Blueprint’ов, такой проблемы нет: изменение исходного объекта отразится на всех дочерних объектах. Это пригодится не только для игровых объектов, персонажей, какой-то логики или даже статических объектов на сцене, но и для системы интерфейсов.
С другой стороны, можно попытаться победить эту проблему в Unity, используя ассеты в Asset Store. В Unity есть плагины, расширения движка, которые так и называются — Nested Prefabs. Существует несколько подобных систем, но они немного костыльные, сделаны поверх движка, поддержки нет. Они пытаются сохранить в себе внутреннее состояние объекта. Когда запускается игровая сцена, они пробуют восстановить внутренние структуры, их поля, свойства и т. д., удаляют устаревшие объекты в сцене и заменяют их экземплярами из префабов. В результате мы получаем не только удобство вложенных префабов, но и ненужные тормоза, лишнее копирование данных и создание объектов. А если что-то в движке поменяется, то эти системы могут и вовсе отвалиться по неизвестным причинам.
Системы UI
В Unity нельзя сохранить в prefab элементы окон или какие-то виджеты. Можем попытаться, но возникнет та же самая проблема префабов: движок забудет о старых объектах. Поэтому зачастую в Unity мы создаём элементы управления, добавляем скрипты и потом их копируем, не создавая prefab. Если приходится добавлять в такие «виджеты» что-то новое, требуемые изменения нужно повторять вручную.
В Unreal мы можем сохранить элементы интерфейса в виджеты (Widget Blueprint), быстро сделать на основе одних элементов управления новые. Cделали кнопку и надпись, пусть это будет наш status bar widget. На основе стандартных и новых виджетов получается быстро и удобно строить окна интерфейса. К слову, виджеты также расширяются за счет Blueprint’ов, можно описать логику их работы на визуальных схемах.
В Unreal система редактирования интерфейсов и всех виджетов открывается в отдельной вкладке редактора. В Unity интерфейс редактируется через специальный объект Canvas, расположенный прямо в 3D-сцене и зачастую даже мешающий её редактировать.
Преимущества и недостатки
Для новичка значительно проще движок Unity, у него устоявшееся сообщество, множество готовых решений. Можно расширять редактор скриптами, добавлять новые меню, расширять инспектор свойств и т. п.
В Unreal тоже можно написать для редактора свои окна и инструменты, однако это чуть сложнее, так как надо делать плагин, и это тема для отдельной статьи. Это посложнее, чем в Unity, здесь нельзя написать маленький скрипт, чтобы появилась полезная кнопка, расширяющая функционал редактора.
Из плюсов Unreal стоит отметить визуальное программирование, наследование blueprint’ов, виджеты UI, систему анимации с множеством возможностей и многое другое. Кроме того, в Unreal Engine 4 существует целый набор классов и компонентов, рассчитанных на создание игр: Gameplay Framework. Gameplay Framework является частью движка, на нём созданы все шаблоны проектов. Классы Gameplay Framework открывают множество возможностей — от описания игровых режимов (Game Mode) и состояния игрока (Player State) до сохранения игры (Save Game) и управления персонажами (Player Controller). Особенная фича движка — продвинутая сетевая подсистема, выделенный (dedicated) сервер и возможность запуска сетевой игры в редакторе.
Заключение
Мы сравнили движки Unity 5 и Unreal Engine 4 на конкретных примерах и проблемах, с которыми вы можете столкнуться, начав работу с движком Unreal. Часть сложностей, присущих Unity, решена в Unreal Engine 4. Конечно, невозможно в одном докладе сделать всесторонний обзор этих технологий в полной мере. Однако мы надеемся, что данный материал поможет вам в изучении движка.
Unreal Portal: разработчик потратил год, перенося Portal на Unreal Engine, вот что вышло
Ассеты не копировали, а создавались по мотивам игры Valve.
Реддитор DeDelner показал собственную версию Portal, сделанную на Unreal Engine 5. Проект под названием Unreal Portal создавался около года, ассетов из игры Valve здесь нет: модели и текстуры создавались по мотивам, а не копировались.
Больше всего времени, рассказывает DeDelner, ушло на саму систему бесшовных порталов. Она целиком реализована на Blueprint, отловить все проблемы с камерой и некорректными пересечениями объектов было не так-то просто.
Чтобы сделать все правильно, потребовалось довольно много времени. Пришлось учитывать массу моментов: к примеру, когда игрок на самом деле должен телепортироваться к другому порталу. Спойлер: не сразу.
Примечательно, что в демке DeDelner объекты и в самом деле плавно проходят через портал, а не телепортируются в другую часть локации при соприкосновении с порталом. Освещение тоже умеет работать с порталами.
Демка оказалась не очень ресурсоемкой. В разрешении 1440p она нормально работает на GeForce GTX 1060, дополнительной оптимизацией реддитор не занимался.
В комментариях к проекту DeDelner о похожих разработках рассказали еще несколько участников сабреддита UnrealEngine. Правда, признают коллеги, Unreal Portal выглядит гораздо качественнее их работ.
О будущем своего проекта реддитор не рассказывает. Во всяком случае, DeDelner не планирует просто продавать свои наработки.
Unreal против Unity: на чем лучше разрабатывать мобильные игры?
Здравствуйте, уважаемые читатели!
У нас переведена и готовится к выходу книга Джона Хокинга о программировании в Unity, о которой мы уже писали.
А не так давно нам попалась на глаза интересная статья о разработке мобильных игр с применением Unity (от 12 августа 2015 года); правда, ключевое достоинство статьи заключается в том, что в ней этот инструмент сравнивается с основным конкурентом: Unreal Engine.
Именно с этим замечательным исследованием мы предлагаем вам познакомиться в пятничный вечер. В комментариях будем рады увидеть рекомендации по изданию книг о UE, а также надеемся на плодотворную дискуссию.
Статья переведена с небольшими сокращениями
Мы (компания OnlineFussballManager GmbH) в настоящее время приступаем к разработке нового проекта для мобильных устройств. Мы собираемся создать захватывающую и уникальную комбинацию пошаговой стратегии и игры типа «футбольный менеджер».
Игроки смогут планировать и создавать собственные клубные площадки и спортивные комплексы, тренировать команду и работать над ее тактикой. Игроки команды будут не просто юнитами в пронумерованных футболках, а реалистичными личностями со своими чертами и даже выражением лица. Все будет происходить в изометрическом представлении различных помещений и площадок клуба, где анимированные здания будут располагаться в специально определенной сетке.
Итак, момент истины настал, когда мы взялись за разработку визуального представления.
Учитывая поставленные перед нами требования и тот факт, что мы должны разработать эту игру и для iOS, и для Android — как реализовать этот проект технически?
Один из первых вопросов, который предстояло решить — создавать ли собственный движок или воспользоваться уже имеющимся. Разумеется, первый вариант оптимален, если вы желаете полностью контролировать все, что происходит в вашем исходном коде, тулчейне, а также вполне представлять, каковы будут ваши доходы от этой игры. Недостаток такого подхода заключается в том, что подобная разработка потребует немалых усилий — из-за чего сроки всего проекта увеличатся, и он существенно подорожает. От этой идеи мы быстро отказались, поскольку хотели удержать стоимость и сроки проекта в рамках разумного.
Далее предстояло определиться, какой движок будем использовать. Вариантов было множество: от Stencyl, GameMaker до Cocos2d и Marmalade и, наконец, Unreal и Unity.
Конечно, можно привести массу доводов о том, какой движок лучше и для каких целей. Сколько людей — столько мнений. Должны признаться, на какой-то момент и мы ощутили такой субъективизм. Команда активно поддержала Unreal Engine. Однако, сколько мы ни присматривались к UE, никто не мог охарактеризовать его объективно, без апелляции к личному мнению.
Итак, мы решили не отвлекаться от фактов и принялись исследовать другие, более известные инструменты.
GameMaker вскоре был отвергнут, поскольку он более ориентирован на новичков, только приступающих к разработке игр. Таким образом, изучить его довольно легко, но возможности GameMaker явно не дотягивали до того, что мы хотели сделать.
Далее пришел черед Cocos2D, который на первый взгляд казался многообещающим. Как понятно из названия, Cocos2D оптимизирован под разработку двухмерных игр. Поэтому возникал вопрос: хотим ли мы создать нашу изометрическую сетку зданий в истинном 2D или в фактическом 3D с фиксированной точкой обзора. После некоторых дополнительных исследований мы выбрали реализацию в 3D. В таком случае Cocos2D нас, очевидно, не устраивал.
Мы обратились к Marmalade. Ведь при помощи Marmalade были созданы такие известные игры как »Plants vs. Zombies« и »Godus«. Но, хотя мы и нашли у этого движка немало достоинств, оставались проблемы, вынудившие нас обратиться к другим вариантам. Один из наиболее существенных недостатков заключался в том, что сообщество специалистов по Marmalade довольно невелико.
Итак, из крупных альтернатив остались только Unreal и Unity. Но даже к этому моменту мы не могли уверенно выбрать один из двух без посторонней помощи.
К счастью, приближалась игровая конференция GDC в Сан-Франциско, поэтому мы воспользовались шансом слетать туда и посоветоваться с коллегами.
Встретились там с ребятами из Epic, вплотную познакомились с Unreal Engine, попробовали Paper 2D, их инструмент для просмотра превью мобильных приложений и спросили, чем бы нам воспользоваться: их движком или Unity?
Ребята нам удружили, сказав примерно следующее: «Unreal классный, но и Unity неплох. Попробуйте и то, и другое».
Тогда мы отправились к разработчикам Unity и присмотрелись к Unity 5 — как он повышает производительность в iOS. В конце концов, задали им такой же вопрос и получили аналогичный ответ.
На данном этапе мы решились на основательное техническое исследование. Спроектировали прототип, в достаточной степени напоминающий наш проект, чтобы проверить на разных мобильных устройствах, как пойдет процесс сборки и какова будет производительность. При этом мы также хотели выяснить, какие подводные камни и проблемы могут нас подстерегать при разработке на первом и на втором движке.
Поскольку все наши программисты были заняты на текущих проектах, мы поручили работу над прототипом специалистам из компании Bit Baron.
Исследование движков, выполненное в компании Bit Baron
Компания »Online Fußball Manager« (OFM) планировала создать мобильную игру. Нас попросили о помощи, чтобы увереннее определиться, какой движок лучше всего подходит для их проекта. До тех пор мы занимались исключительно разработкой браузерных игр, но решили, что справимся с задачей. Было предложено сравнить два варианта: Unity и Unreal. В настоящее время это два «локомотива» в мире программирования игр. Существует немало отчетов, подробно иллюстрирующих мельчайшие различия между ними. Но особенность нашей работы заключалась в том, что мы написали для сравнения два практически идентичных тестовых приложения и охарактеризовали их показатели в соответствии с системой контрольных точек (эталонное тестирование).
Написав два аналогичных приложения, мы смогли протестировать оба на ровном игровом поле, сообщить OFM, какая версия работает лучше и подчеркнуть дополнительные проблемы.
Мы хотели создать такой эталонный тест, который бы предоставил OFM информацию, непосредственно связанную с типом создаваемой ими игры. Заказчики указали, что в прототипе должно быть несколько анимированных зданий и деревьев. Поэтому мы создали 3D-сцену, где пользователю предлагалось самостоятельно расставлять эти объекты на карте. Размеры сетки составляли 11×16, она вмещала до 176 зданий. Каждый квадрат сетки поддерживал до 6 деревьев, таким образом, в сцене могло быть свыше 1000 деревьев. Мы добавили простой пользовательский интерфейс, где можно было добавить в сцену указанное количество деревьев и зданий. Также добавили функцию добавления зданий в конкретных местах — для этого нужно было щелкнуть по карте в желаемой точке. Что касается организации программы, мы построили сетку на плоскости, а просмотр сцены сделали через камеру, расположенную «над головой» пользователя. Мы также добавили специальный функционал камеры, чтобы пользователь мог масштабировать и панорамировать сцену. Поскольку этот прототип создавался, чтобы определиться с движком для разработки, мы сделали все возможное, чтобы в обоих вариантах сцена выглядела почти одинаково. В противном случае было бы невозможно сравнить визуальное качество первого и второго варианта. Для этого пришлось повозиться, поскольку некоторые вещи обрабатываются в Unreal и в Unity по-разному. В итоге у нас получились две очень похожие сцены.
Чтобы унифицировать тестирование производительности, мы хотели применить в обеих системах идентичные модели деревьев и зданий. Для деревьев использовалась мобильная модель SpeedTree, включавшая как раз около 1000 многоугольников и позволяла хорошо оценить, насколько мелкие инкременты в отображаемых треугольниках сказываются на кадровой частоте. Что касается анимированных зданий, нам не удалось найти для них такую модель, которая работала бы с обоими движками, поэтому мы применили две разные модели. Обе были рассчитаны чуть более чем на 16 000 многоугольников каждая, у них были практически идентичные настройки материалов. Мы полностью отключили уровни детализации (LOD), чтобы в обоих вариантах на любом расстоянии от камеры отображалось одинаковое количество треугольников. Тест проектировался не только с целью отразить различия производительности между двумя движками, но и чтобы показать разницу в качестве рендеринга. Кроме того, приходилось внимательно следить за стандартными шейдерами Unreal Engine. Заметив, что Unreal выглядит явственно лучше, мы обнаружили, что в камере действует ряд шейдеров, затратных с точки зрения производительности. После их отключения сцена визуально почти не изменилась. Освещение представляло совсем другую проблему, поэтому нам понадобилось некоторое время, чтобы довести его до ума.
Заказчики интересовались не только тестами рендеринга, но и тем, каковы будут впечатления от разработки на первом и втором движке. В конце концов, что толку от производительности, если вы не успеваете написать игру в установленные сроки. Чтобы очертить эти впечатления, мы сравнили и такие факторы, как длительность сборки, имеющуюся документацию, сложность развертывания в мобильной среде, а также сложность итераций кода. Мы полагали, что именно по этим показателям Unity будет сильнее (как флагман в области разработки мобильных игр).
Прототип в Unity. На карте нанесено 200 деревьев
Это картинка из редактора Unity. Нам очень повезло, что мы смогли дополнить его нашими собственными сценариями
Значения кадровой частоты 37 против 32. В статистической панели Unity видим оценочные данные для автономного приложения, которые не совпадают с реальными
Вот как проект выглядит в редакторе Unreal. Здесь есть много специализированных вложенных редакторов, некоторые из которых сравнимы по функционалу с целыми программами
В UE сделан такой же экранный снимок, кк и в Unity (см. выше), причем мобильные настройки оставлены по умолчанию, без освещения деревьев
Когда настройки были откорректированы, деревья получились лучше, но все равно не так хорошо, как в Unity
Чертежи превосходны при решении простых задач, их интеграция с C++ просто фантастическая. Но если задействуется более сложная логика, то они быстро приходят в беспорядок, и разобраться с ними становится непросто.
Результаты эталонного тестирования. Кадровая частота
Удивительно, но при тестировании кадровой частоты (FPS) на разных устройствах мы получили очень несхожие результаты. На некоторых устройствах Unity выигрывал при любой конфигурации. В других случаях Unreal обставлял Unity в тех тестах, где было много зданий. В принципе, Unreal выиграл, но дорогой ценой. Качество изображения и согласованность в Unity были существенно лучше. Текстуры Unreal на некоторых устройствах выглядели расплывчато, деревья получались значительно хуже. Разница в качестве была отчасти обусловлена тем, что отображается с одной стороны в редакторе Unreal и мобильном превью, а с другой – на реальном мобильном телефоне. Эта проблема была особенно очевидна, если говорить об освещении сцены. Было очень сложно подобрать настройки так, чтобы правильно настроить свет, весь сеттинг на мобильных устройствах зачастую выглядел затемненно. В этом отношении Unity оказался гораздо последовательнее, изображение на любых смартфонах было таким же, как и при предварительном просмотре в редакторе.
Результаты для обоих движков оказались гораздо лучше, чем мы рассчитывали (как вы помните, в наших тестовых моделях было примерно в 10 раз больше треугольников, чем в обычных мобильных играх).
В iOS оба движка примерно с одинаковым успехом отображали анимированные модели. Однако тесты с деревьями на этом устройстве оказались безрезультатными, поскольку Unreal не отобразил никаких текстур на моделях деревьев. Мы попытались найти причину этой модели, но не смогли ее разрешить. Кроме того, должны отметить, что при развертывании с применением этих движков у вас под рукой должен быть компьютер Apple. Это очень неудобно, но виновата в такой ситуации сама компания Apple. Заказчики также просили нас выполнить эталонное тестирование на Windows Phone. К сожалению, Unreal пока не поддерживает развертывания на Windows phone, поэтому здесь Unity победил по определению. Поскольку пока Windows Phone занимает очень небольшую долю рынка, развитие Unreal в этом направлении не считается приоритетной задачей.
В конечном итоге, эталонное тестирование лишь показало, что два движка почти равны по силе. Поэтому особенно важно обращать внимание на конкретные достоинства и недостатки каждого из них. В конце концов, если производительность настолько близка, то на первый план выходит удобство и скорость разработки для каждого из этих движков.
Другие контрольные параметры
Вот еще некоторые интересные результаты, которые удалось выяснить в ходе наших тестов:
По результатам исследования нам многое понравилось в обоих движках. Кроме того, мы обнаружили много областей, где эти инструменты можно улучшить, чтобы программисту было удобнее работать. Ни один из движков не имел существенного перевеса над другим, учитывая, как быстро изменяются их возможности и поддержка. Тестирование рендеринга показало, что оба продукта выжимают из устройства максимум и, в принципе, вполне сопоставимы. Опять же, в этой ситуации на первый план выходит удобство использования и интуитивная понятность разработки. Учитывая все, что мы узнали об этих движках, и с какими проблемами столкнулись при разработке, мы оказались перед непростым выбором, но в итоге отдали предпочтение Unity.
Несмотря на то, что изначально мы ставили на победу Unreal Engine, в настоящее время Unity все-таки более выигрышный вариант, как минимум, если говорить о разработке мобильных игр.
Вот основные доводы в пользу нашего решения:
Мы хотели бы подчеркнуть, что наши результаты следует расценивать в контексте сделанного прототипа. То, что подходит для одной компании, не подходит для другой. Кроме того, существует еще множество игровых движков, некоторые из которых могут лучше соответствовать вашей конкретной задаче. В некоторых компаниях, обладающих достаточным временем и ресурсами, будет целесообразнее даже написать собственный движок. В разработке игр универсального решения не существует. Окажите себе услугу и поэкспериментируйте как следует. Тем более, что многие из них удешевляются или вообще становятся условно бесплатными как Unreal. Мы не удивимся, если Unity также последует примеру Unreal и либерализует ценовую модель.
Интересно отметить, что и ребята из Bit Barons до создания прототипа советовали нам взять Unreal Engine для нашего проекта. Учитывая, что и мы в OFM изначально отдавали предпочтение Unreal Engine, возможно, итоговое решение оказалось неоптимальным.
Конечно, нелегко спроектировать, написать и протестировать прототип, особенно если требуется просто определиться с движком для проекта. Но вопрос такого выбора критически важен.
Наконец, мы учли еще некоторые факторы, которые могли бы изменить наше мнение. А именно: насколько легко найти опытных специалистов по каждому движку в настоящее время, и каковы имеющиеся в распоряжении бизнес-модели?
По кадровому вопросу мы посоветовались с опытными рекрутерами, чтобы узнать более-менее реальные цифры. В данный момент на каждого специалиста по Unreal приходится примерно четыре профессионала по Unity. Что касается бизнес-модели, Unreal не предусматривает первичного фиксированного взноса, а требует лицензионных отчислений. В Unity все ровным счетом наоборот. Оба упомянутых фактора были для нас важны, и в результате мы все-таки остановились на Unity.
Джентльменский набор программиста UE4, ч. 3
Данный вопросник является дополнением и логическим завершением темы «джентльменского набора», поднятой ранее. Разработка игр — весьма комплексная индустрия, с очень широкими набором технологий и подходов, при этом базис у всех этих вещей на самом деле общий. Этот список создан в первую очередь для тех, кто хочет быть программистом Unreal Engine, а также позволяет оценить свой уровень тем, кто уже считает себя продвинутым программером под анрил.
В своей статье я стараюсь затрагивать такие проявления используемой технологии, изучение или исследование которых дает не просто инструкцию «делай так», а формирует рациональные подходы к разработке.
В прошлых сериях
4ертовы хипстеры. Никакой пользы от них
Дисклеймер
Данный список вопросов ни в коем случае не тест и не экзамен! Все перечисленные в цитатах термины — это целый комплекс навыков, принципов и технологий. Некоторые вопросы попросту не предполагают единственно верного ответа, но очерчивают поле для дискуссии и поиска всех граней.
Основы архитектуры движка
Как узнать потребление памяти на момент Х и структуру (содержимое) этой памяти? Каким образом можно проверить целостность памяти и найти утечки? Как работает Garbage Collector и какие у него боттлнеки?
Каким образом можно загрузить что-либо (текстуру, блюпринт, эктор, карту) асинхронно, и какие ограничения на этот процесс есть у движка? К чему приведет вызов функции синхронной загрузки ассета или его части в общем процессе асинхронной загрузки?
Многопоточный ли анриал? Как устроен основной цикл кадра/обновления мира? Какие способы проводить асинхронные вычисления есть на движке, и какие у них особенности?
Blueprints
Как устроены латентные функции?
(Advanced) Как можно реализовать wildcard in/out параметры и как работают CustomThunk функции?
Как выбрать — писать ИИ на BT, или просто запрограммировать логику в блюпринтах или в коде? Либо предпочесть другие (какие?) варианты?
Каким образом реализуются независимые ветки логики ИИ на BT? (Пример: танк едет и наводится/стреляет одновременно) А если их три или четыре?
Какие еще модели построения искусственного интеллекта часто используются в геймдеве, в чем их плюсы и минусы?
Какие алгоритмы pathfinding ‘а и навигации используются на движке? Каким образом происходит ведение персонажа по маршруту?
Rendering
Означенная глубина погружения не предполагает, что вы — рендер-программист. Скорее это взгляд со стороны техарта и «интересующегося» программиста на одни из самых высокоуровневых вопросов.
Что такое draw call? Какие есть способы батчинга? Инстансинг vs батчинг?
В чем разница между Forward и Deferred рендерингом? (Advanced) А сколько вообще основных архитектур на текущий момент? Чем принципиально отличается рендеринг на мобилках/консолях от десктопного?
Какие типы шейдеров существуют и в чем назначение каждого? Как это используется в движке и отражено в материалах?
Animation
Какие методы наследования и композиции в Animation Blueprint возможны для использования? Плюсы и минусы каждого из них?
Какие способы анимации вообще могут быть? Какая информация и каким образом хранится в каждом случае?
Прочее
Пара дополнительных полезных вопросов вне категорий.
Что влияет на размер финального билда? Каким образом можно исследовать этот вопрос?
Кода (3)
Эта статья завершает мини-цикл такого формата — подготовка материала для публикации в виде самостоятельной статьи занимает слишком много времени, многие вещи из которых устаревают либо изменяются по мере написания. Формат следующих публикаций будет переработан и систематизирован несколько иначе.
При этом конечно же два опросника не покрывают все области знания о движке целиком, однако я постарался коснуться тех вещей которые считаю основными.
Как и всегда, призываю к активному обсуждению, комментариям и критике! =)
Простой шутер от третьего лица на Unreal Engine. Часть 2
Дисклеймер
До прочтения этой статьи рекомендую прочитать первую часть.
План на сегодня
Сегодня мы создадим простеньких противников, который будут ходить туда-сюда. Научимся наносить им урон.
Создаем противника
Жмем ПКМ по блупринту нашего персонажа и выбираем вот этот вариант.
После этого нужно дать блупринту название. Я назвал его BP_HabrTPSBot.
Жмем ПКМ по пустому месту. И нажимаем BlueprintClass.
В списке ищем AIController и нажимаем Select.
Я дам ему название BP_HabrTPSBot_AI.
После этого нам необходимо открыть блупринт персонажа. И открыть вкладку Class Defaults.
В панели Details ищем переменную AIControllerClass. Устанавливаем туда наш новый контроллер, который мы создали в предыдущем пункте.
После этого просто DragNDrop перносим персонаж нашего бота в мир.
Учим бот ходить по случайным точкам
Для этого заходим в AIController. Заходим в EventGraph.
Нам нужен именно BeginPlay. Напомню, это ивент, который вызывается в тот момент, когда игра стартует (или когда персонаж появляется в мире).
Кликаем ПКМ и ищем вот такую ноду.
В нее нам нужно указать следующие вещи. Кого мы хотим отправить на точку, точку на которую мы хотим отправить его, остальные поля оставим пока без внимания.
В качестве того, кого мы будем отправлять на точку мы выберем Pawn (персонажа), которым управляет AIController. Мы можем его легко получить вот такой нодой.
Далее нам необходимо указать куда мы двигаемся.
Для того, чтобы выстроить навигацию, основанную на алгоритмах поиска кратчайших путей в Unreal Engine есть такая сущность, как NavMesh. Его необходимо добавить на карту, чтобы движок запек навигационную карту. Это нам небходимо, чтобы бот научился ходить к определенным точкам, которые находятся на этом самом NavMesh.
Открываем менюшку PlaceActors и ищем там NavMeshBoundsVolume. Перетаскиваем его на нашу карту. Теперь если мы нажмем латинскую кнопку P на клавиатуре, то мы увидим нам NavMesh.
Нам необходимо заскейлить NavMesh на размеры всей карты, чтобы персонаж понимал как ходить по всей карте, а не только по ее маленькому кусочку. Для этого просто меняем масштаб, как мы это уже умеем делать. По итогу мы должны увидеть нечто вот такое.
Возвращаемся к блупринту AIController. С помощью вот такой ноды найдем рандомную точку определенном радиусе от персонажа.
Остается всего-ничего. Зациклить хождение по точкам, а также добавить логику задержки на этих точках. Для этого на OnSuccess вешаем Delay (ноду, которая ждем определенное количество времени, а после этого продолжает вызовы всего, что на нее подвязано).
После чего нам необходимо прокинуть исполнение с ноды Delay но входного исполнительного пина ноды AIMoveTo. Также это необходимо сделать с пином OnFail, чтобы в случае ошибки бот нашел новую точку и начал движение к ней. В блупринтах нельзя втыкать выходящие пины с ноды в входящий пин этой же ноды, поэтому я воспользуюсь небольшой хитростью и сделаю это через еще одну ноду Sequence (она последовательно выполняет команды, которые на нее подвязаны, поэтому она не принесет никах дополнительных вызовов).
Теперь просто необходимо подключить это к ивенту BeginPlay и оно заработает.
Наносим урон
В UnrealEngine уже есть встроенная система урона, поэтому все будет достаточно просто.
Заходим внутрь нашего игрового персонажа и там, где мы делали LineTraceByChannel находим OutHit пин. Нажимаем по нему ПКМ и нажимаем SplitStructPin. Результат должен получиться следующим.
Далее необходимо найти ноду ApplyDamage и в качестве Actor, которому мы наносим Damage указать того Actor, в которого мы попали. В поле BaseDamage вписываем количество урона, которое мы хотим нанести.
Также нам необходимо включить канал Visibility у капсулы персонажа, по которой мы будем попадать. Для этого выделаем капсулу и в Details ставим следующие настройки.
Теперь нужно создать жизни. Для этого кликаем + в разделе Variables.
Новую переменную называем Health и делаем ее типа Float. Компилируем Blueprint и выставляем значение по умолчанию 100.0
Теперь нам нужно подвязать логику, которая будет отнимать у текущего запаса жизней урон и проверять умел ли наш персонаж после получения урона.
Для этого наводим на раздел Functions. Появляется выпадашка Override и там выбираем AnyDamage.
У нас появился ивент, который вызывается всякий раз, когда наш персонаж получает урон. Теперь нам необходимо отнять от текущего здоровья урон.
Если сделать DragNDrop переменной на EventGraph, то нам предложат 2 типа действий с переменной. Прочитать значение (get) и записать значение (set).
Нам нужно будет использовать оба. Делаем вычитание следующим образом.
Однако эта реализация не идеальна, потому что наше здоровье может уйти в отрицательное значение. Чтобы это предотвратить, добавим следующую конструкцию.
Таким образом значение Health никогда не будет уходить в отрицательные значения.
В случае смерти мы будем просто уничтожать Actor.
Проверка функционала
Что дальше
Мы сделали самую базовую реализацию урона. Ее можно совершенствовать еще много как. Добавлять отображения попаданий, добавлять различные модификаторы урона. Более подробно мы рассматриваем это на курсе Технический Game Designer Unreal Engine, на котором я преподаю в Otus.
Unreal Engine 5 задает новую планку игровой реалистичности
Компания Epic Games впервые продемонстрировала возможности игрового движка Unreal Engine 5. Одной из главных целей его создания было достижение исключительной фотореалистичности, сравнимой только с AAA-блокбастерами и самой жизнью.
Unreal Engine 5 поддерживает ПК, Mac, консоли текущего и нового поколения, iOS и Android. Полноценный релиз движка ожидается в следующем году.
В новом движке выделяются две ключевые области:
Многое из того, что вы видите, было построено при помощи ассетов Quixel Megascan. Но вместо игровых версий здесь использованы кинематографические, которые обычно встречаются только в блокбастерах. В одном кадре представлено порядка миллиарда треугольников исходной геометрии. И благодаря технологии «virtual texturing» они все используют текстуры качества 8K.
Как все эти треугольники выглядят на самом деле?
Нет, это не шум: это те самые треугольники, каждый своего цвета, многие из них настолько малы, что все вместе создают картинку шума. Nanite достигает детализации вплоть до одного пикселя. Это означает, что треугольники обычно и есть размером с пиксель. Такое количество геометрических деталей требует, чтобы тени отрисовывались так же попиксельно. Это тоже Nanite под силу.
Все освещение в представленном демо полностью динамическое ― и это благодаря Lumen, реализующей также глобальное освещение множественным отражением. Никаких световых карт, никакого запекания.
Кроме того, была солидно переработана аудиосистема. Convolution Reverb позволяет измерять характеристики эха реальных пространств и воспроизводить их в виртуальной реальности. Рендеринг звукового поля позволяет записывать и воспроизводить пространственные аудио ― все для более глубокого погружения.
Эта стая летучих мышей была создана при помощи системы спецэффектов Niagara. Частицы в Niagara теперь могут взаимодействовать друг с другом и понимать окружающую среду как никогда раньше.
В демо задействована система игровой физики и разрушений Chaos. Здесь она использована, например, для точного моделирования падающих камней и ткани шарфа героини.
В движке также появилась масса новых функций для моделирования жидкостей.
Теперь, когда окружение стало настолько сложным, возникла необходимость серьезно улучшить и систему анимации. В UE5 было реализовано прогнозирование положения стопы и деформирование движения, которое динамически изменяет инверсную кинематику и положение тела для того, чтобы они выглядели более естественно.
Чтобы персонаж более реалистично взаимодействовал с окружением, появилась возможность запускать бесшовную контекстную анимацию ― такую, как, например, рука героини на поверхности дверного проема.
Динамическая GI в новом движке потрясающая, но не только из-за ускорения итераций, но также благодаря своему воздействию на геймплей. Любой источник света может перемещаться, создавая при этом прекрасное освещение. Динамическое освещение подразумевает в том числе и зеркальный блеск, который можно увидеть на всех металлических поверхностях. В сцене можно заметить даже воспроизведенных при помощи Niagara жуков, убегающих от падающих световых лучей. Lumen реагирует не только на движущиеся источники света, но и на изменения геометрии.
Помните, мы упоминали высокополигональные ассеты?
Эта статуя была импортирована прямиком из ZBrush, и в ней более 33 миллионов треугольников. Никакого запекания карт нормалей, никаких уровней детализации. Таких статуй можно сделать больше, чем одну: в этой комнате их около пятисот ― в сумме более 16 миллиардов треугольников от одних только статуй! Во всем же демо треугольников несколько сотен миллиардов.
С Nanite в вашем распоряжении бесконечная геометрия, а Lumen ― полностью динамическое глобальное освещение. И эти возможности не ограничиваются одной небольшой комнатой ― их можно применить ко всему пространству вплоть до горизонта.
Туториал по Unreal Engine. Часть 1: знакомство с движком
Unreal Engine 4 — это набор инструментов для разработки игр, имеющий широкие возможности: от создания двухмерных игр на мобильные до AAA-проектов для консолей. Этот движок использовался при разработке таких игр, как ARK: Survival Evolved, Tekken 7 и Kingdom Hearts III.
Разработка в Unreal Engine 4 очень проста для начинающих. С помощью системы визуального создания скриптов Blueprints Visual Scripting можно создавать готовые игры, не написав ни строчки кода! В сочетании с удобным интерфейсом это позволяет быстро изготавливать рабочие прототипы.
В этой части туториала по Unreal Engine 4 мы ознакомимся с основными возможностями программы. Вот основные темы, которые будут в нём рассмотрены:
Примечание: туториал будет состоять из восьми частей:
Установка Unreal Engine 4
Для установки Unreal Engine 4 используется Epic Games Launcher. Перейдите на сайт Unreal Engine и нажмите на кнопку Get Unreal в правом верхнем углу.
Перед загрузкой программы запуска необходимо будет создать учётную запись. После её создания скачайте программу запуска, соответствующую вашей операционной системе.
После скачивания и установки программы запуска откройте её. Появится следующее окно:
Введите адрес электронной почты и пароль, использованный для скачивания программы загрузки и нажмите на Sign In. После выполнения входа откроется такое окно:
Нажмите на Install Engine в левом верхнем углу. Программа запуска перейдёт к экрану, на котором можно будет выбрать устанавливаемые компоненты.
Примечание: Epic Games постоянно обновляет Unreal Engine, поэтому ваша версия движка может слегка отличаться от представленной на скриншотах. Например, после написания первого черновика этого туториала версия уже обновилась до 4.14.3! Туториал подойдёт вам, если у вас есть версия не ниже 4.14.
По умолчанию выбраны Starter Content, Templates and Feature Packs и Engine Source. Лучше так всё и оставить. Они будут полезны по следующим причинам:
Выбрав нужные компоненты, нажмите на Install. После завершения установки движок появится в библиотеке. Теперь настало время создать проект.
Создание проекта
Нажмите на одну из кнопок Launch, чтобы открыть браузер проектов (Project Browser). После его открытия нажмите на вкладку New Project.
Нажмите на вкладку Blueprint. Здесь можно выбрать один из шаблонов. Однако, поскольку мы начинаем с нуля, то выберем шаблон Blank.
Ниже будут перечисленные дополнительные параметры.
Вот, за что отвечает каждая опция:
Сменить папку хранения проекта можно, нажав на многоточие в конце поля Folder.
Имя проекта не является названием игры, так что не волнуйтесь, если хотите название позже. Выберите текст в поле Name и введите BananaTurntable.
И наконец нажмите на Create Project.
Навигация по интерфейсу
После создания проекта откроется редактор. Он разделён на несколько панелей:
Импорт ассетов
Какой смысл в поворотном столе, если на нём нечего показывать? Скачайте эту модель банана. Внутри находятся два файла: Banana_Model.fbx и Banana_Texture.jpg. Можете также использовать собственную модель, но зачем, если есть такой потрясающий банан?
Чтобы Unreal мог использовать файлы, их нужно импортировать. Перейдите в Content Browser и нажмите на Import.
С помощью диспетчера файлов найдите папку, в которой находятся Banana_Model.fbx и Banana_Texture.jpg are. Выделите оба файла и нажмите Open.
Нажмите на Import. Два файла появятся в Content Browser.
При импорте файла на самом деле он не сохраняется в проект, если не указать этого явным образом. Сохранять файлы можно, нажав на файл правой клавишей мыши и выбрав Save. Также можно сохранить все файлы за раз, выбрав File\Save All. Старайтесь сохраняться почаще!
Учтите, что в Unreal модели называются «мешами» (meshes). Теперь у нас есть меш банана, настало время добавить его на уровень.
Добавление мешей на уровень
Пока уровень выглядит довольно пустым, давайте сделаем его интереснее.
Чтобы добавить на уровень меш, нажмите правой клавишу мыши и перетащите Banana_Model из Content Browser во Viewport. Отпустите левую клавишу мыши и меш добавится на уровень.
Объекты на уровне можно перемещать, поворачивать и масштабировать. Горячие клавиши для этих действий — W, E и R. После нажатия на них можно использовать манипулятор:
О материалах
Если внимательно посмотреть на банан, то можно увидеть, что он не жёлтый! На самом деле. он выглядит почти полностью серым.
Чтобы придать банану цвет и детали, необходимо создать материал.
Что такое «материал»?
Материал задаёт внешний вид поверхности. На базовом уровне материал определяет четыре аспекта:
Создание материала
Для создания материала нужно перейти в Content Browser и нажать на зелёную кнопку Add New. Появится меню со списком ассетов, которые можно создать. Выберите Material.
Назовите материал Banana_Material, а затем дважды нажмите левой клавишей мыши на файле, чтобы открыть его в редакторе материалов.
Редактор материалов (Material Editor)
Редактор материалов состоит из пяти основных панелей:
Что такое нод (узел)?
Прежде чем приступать к созданию своего материала, нужно узнать про объекты, которые используются для его создания: ноды.
Ноды составляют бОльшую часть материала. Существует множество типов нодов, имеющих различные функции.
У нодов есть входы и выходы, представленные кругом со стрелкой. Входы расположены слева, а выходы — справа.
Вот пример с использованием нодов Multiply и Constant3Vector, добавляющих текстуре жёлтого цвета:
У материалов есть особый нод, называемый нодом Result, который в нашем случае уже создан как Banana_Material. Здесь заканчиваются со временем все ноды. То, что подключено к этому ноду, определяет внешний вид конечного материала.
Добавление текстур
Для добавления модели цвета и деталей нам необходима текстура. Текстура — это просто двухмерное изображение. Обычно они проецируются на трёхмерные модели, придавая им цвет и детали.
Для текстурирования банана мы используем Banana_Texture.jpg. Применить в материале текстуру позволяет нод TextureSample.
Перейдите к панели Palette и найдите TextureSample. Добавьте нод, удерживая левую клавишу мыши и перетащив его на схему.
Для выбора текстуры необходимо сначала выделить нод TextureSample. Перейдите в панель Details и нажмите на раскрывающийся список, расположенный справа от Texture.
Откроется меню, в котором перечислены все текстуры проекта. Выберите Banana_Texture.
Чтобы увидеть текстуру на меше предварительного просмотра, нужно подключить её к ноду Result. Удерживайте левую клавишу мыши на белом контакте выхода нода TextureSample. Перетащите его на входной контакт Base Color нода Result.
Вернитесь во Viewport, чтобы увидеть текстуру на меше предварительного просмотра. Можно поворачивать его (удерживая левую клавишу мыши и перемещая мышь), чтобы рассмотреть другие детали.
Нажмите на Apply в Toolbar, чтобы обновить материал, и закройте редактор материалов после завершения.
Использование материалов
Чтобы применить материал на банан, нужно его назначить. Вернитесь к Content Browser и дважды нажмите на Banana_Model, чтобы открыть его. Появится следующее окно редактора:
Перейдите в панель Details и найдите раздел Materials. Нажмите на раскрывающееся меню, расположенное справа от Element 0, и выберите Banana_Material.
Закройте редактор мешей, вернитесь к основному редактору и посмотрите на Viewport. Вы увидите, что теперь на банане есть текстура. Поздравляю, вы теперь знаете всё необходимео, чтобы стать дизайнером уровней!
Примечание: если освещение слишком тёмное, можно изменить его, зайдя в World Outliner и нажав на Light Source. В панели Details найдите параметр Intensity и увеличьте его значение.
Про Blueprints
Даже несмотря на то, что банан выглядит отлично, будет ещё лучше, если он начнёт вращаться на поворотном столе. Проще всего создать его с помощью «чертежей» Blueprints.
В простейшем случае Blueprint представляет собой «вещь». Blueprints позволяют создавать свои поведения для объектов. Объект может быть чем-то физическим (типа поворотного стола) или чем-то абстрактным, например, системой здоровья.
Хотите создать движущийся автомобиль? Используйте Blueprint. А как насчёт летающей свинки? Используйте Blueprints. А если нужен взрывающийся при касании котик? Blueprints.
Как и в материалах, в Blueprints используется система на основе нодов. Это значит, что достаточно создать ноды и соединить их — никакого кода не требуется!
Примечание: если вы предпочитаете писать код, то используйте вместо этого C++.
Blueprints просты в использовании, однако не так быстры, как код на C++. То есть если вам нужно создать что-то «тяжёлое» с точки зрения вычислений, например, сложный алгоритм, то лучше воспользоваться C++.
Но даже если вы предпочитаете C++, то бывают случаи, когда оптимальнее использовать Blueprints. Вот некоторые из преимуществ Blueprints:
Создание Blueprint
Перейдите в Content Browser и нажмите на Add New. Выберите в списке Blueprint Class.
Откроется окно с запросом выбора родительского класса. Ваш Blueprint будет наследовать все переменные, функции и компоненты из выбранного родительского класса. Уделите время на изучение возможностей каждого класса.
Примечание: поскольку мы можем расположить классы Pawn и Character, они также являются акторами (Actors).
Поворотный стол будет находиться на месте, поэтому самым подходящим будет класс Actor. Выберите Actor и назовите новый файл Banana_Blueprint.
Дважды нажмите на Banana_Blueprint, чтобы открыть его. Нажмите на Open Full Blueprint Editor, если появится подобное окно:
Blueprint Editor
Во-первых, выберите в редакторе Blueprint editor вкладку Event Graph.
Blueprint editor состоит из четырёх основных панелей:
Создание поворотного стола
Для создания стола нам нужно две вещи — основание и подставка. Их можно создать с помощью компонентов.
Что такое «компоненты»?
Если Blueprint — это автомобиль, то компоненты — это строительные элементы, из которых он состоит. Примерами компонентов могут быть двери, колёса и двигатель.
Однако компоненты могут быть не только физическими объектами.
Например, чтобы автомобиль мог двигаться, можно добавить компонент движения. Можно даже заставить машину летать, если добавить компонент полёта.
Добавление компонентов
Чтобы увидеть компоненты, необходимо переключиться в режим Viewport. Нажмите на вкладку Viewport, чтобы переключиться на неё. Вот как это выглядит:
Примечание: компонент DefaultSceneRoot при запуске приложения не отображается, он виден только в редакторе.
Поворотный стол будет использовать два компонента:
Неплохо было бы сделать основание чуть короче. Активируйте манипулятор масштаба, нажав R, а затем уменьшите масштаб (точный размер неважен, можно будет изменить его позже).
Теперь пора добавить меш. Вернитесь в панель компонентов Components и нажмите левой клавишей на пустой области, чтобы снять выделение с компонента Cylinder. Благодаря этому следующий добавляемый компонент не будет прикреплён к компонентуCylinder.
Примечание: если этого не сделать, то следующий компонент будет прикреплён к компоненту Cylinder. Это значит, что он также унаследует масштаб компонента Cylinder. Поскольку мы уменьшили масштаб цилиндра, следующий компонент тоже будет уменьшен.
Затем нажмите на Add Component и выберите из списка Static Mesh.
Для отображения банана выберите компонент Static Mesh, а затем нажмите на вкладку Details. Нажмите на раскрывающий списков в правой части Static Mesh и выберите Banana_Model.
Переместите банан, если он находится в неправильном положении. Для этого активируйте манипулятор перемещения, нажав W, а затем переместите его вверх.
Про ноды Blueprint
Теперь нужно сделать так, чтобы поворотный стол вращался. И здесь нам потребуются ноды Blueprint.
В отличие от своих близких родственников — нодов материалов — ноды Blueprint имеют особые контакты, называемые контактами Execution. Контакт слева — это вход, контакт справа — выход. У всех нодов есть хотя бы по одному входу и выходу.
Если нод имеет контакт входа, то его нужно подключить, чтобы он заработал. Если нод не поключен, все последующие ноды не будут выполняться.
Node A и Node B будут выполняться, потому что у их входных контактов есть подключение. Node C и Node D никогда не выполняются, потому что входной контакт Node C не имеет подключения.
Вращение поворотного стола
Прежде чем начать, давайте посмотрим на панель Components. Можно заметить, что у Cylinder и Static Mesh есть отступ, а у DefaultSceneRoot — нет, потому что они подключены к DefaultSceneRoot.
Если переместить, повернуть или отмасштабировать корневой компонент, то тоже самое произойдёт и с прикреплёнными к нему компонентами. Благодаря этому поведению можно поворачивать Cylinder и Static Mesh одновременно, а не по отдельности.
Создание нода
Чтобы приступить к созданию скриптов, переключитесь назад на вкладку Event Graph.
Реализация вращения объекта настолько проста, что требует всего одного нода. Нажмите правой клавишей на пустое пространство в графе, чтобы открыть меню доступных нодов. Найдите AddLocalRotation. Нам нужно поворачивать основание и банан, поэтому мы просто будем вращать корневой компонент. Выберите AddLocalRotation (DefaultSceneRoot).
Примечание: если нода нет в списке, снимите флажок Context Sensitive в правом верхней части меню.
В вашем графе теперь появится новый нод AddLocalRotation. Вход Target автоматически подключится к выбранному компоненту.
Чтобы задать значение вращения, перейдите к входу Delta Rotation и измените значение Z на 1.0. Благодаря этому Blueprint сможет выполнять вращение относительно оси Z. Чем выше значения, тем быстрее будет вращаться стол.
Чтобы поворотный стол вращался постоянно, нужно вызывать AddLocalRotation в каждом кадре. Для выполнения нода в каждом кадре воспользуемся нодом Event Tick. Он уже находится в графе. Если его нет, то создайте его тем же способом, что и ранее.
Перетащите выходной контакт нода Event Tick ко входному контакту нода AddLocalRotation.
Примечание: в этой реализации скорость вращения зависит от частоты кадров. Это значит, что поворотный стол на медленных компьютерах будет вращаться с меньшей скоростью, и наоборот. Для туториала это нас вполне устраивает, потому что я не хочу ничего усложнять, но в будущем я покажу, как это исправить.
Наконец, перейдите в Toolbar и нажмите на Compile, чтобы обновить Blueprint, а затем закройте Blueprint editor.
Добавление Blueprints на уровень
Прежде чем добавлять Blueprint, вернитесь ко Viewport в основном редакторе и удалите модель банана. Для этого выберите модель, а затем выберите Edit\Delete или нажмите клавишу Delete.
Добавление Blueprint — это тот же процесс, что и добавление меша. Удерживайте левую клавишу мыши на файле и перетащите его во Viewport.
Перейдите к Toolbar и нажмите Play, чтобы увидеть результаты своих трудов!
Примечание: если вы не удалите исходную модель банана, то можете получить предупреждение о необходимости перестройки освещения. Если удалить модель, то ошибка больше не будет проявляться.
Что делать дальше?
Готовый проект можно скачать отсюда.
В этой части туториала вы многое узнали, но это только небольшая часть Unreal. Если вы хотите продолжить изучение, то ждите следующей части туториала, в которой мы подробнее рассмотрим Blueprints.
🎮 Как с помощью Unreal Insights оптимизировать игру на Unreal Engine
wcobalt
Что ещё за Unreal Insights
Unreal Insights – это инструмент позволяющий разработчикам исследовать производительность их UE-приложений с точки зрения времени выполнения, времени загрузки ассетов, потребления памяти, сетевой производительности, производительности анимации и UI.
Как собрать и запустить Unreal Insights
При установке Unreal Engine через лаунчер Epic Games, уже собранный исполняемый файл Unreal Insights будет находиться по адресу /Engine/Binaries/Win64/UnrealInsights.exe
В случае если вы компилируете движок из исходников, то собрать Unreal Insights можно через соответствующий проект в solution:
Проект Unreal Insights в общем solution движка
Общие сведения о работе с Unreal Insights
Для того чтобы указать какие из каналов ваша игра будет посылать Unreal Insights и по какому IP-адресу запущен профайлер, необходимо запускать игру с дополнительными параметрами:
Параметры для включения профилирования
-trace – указывает список каналов данных, с которых необходимо снимать.
-llm – необходимо для канала memory.
-counterstrace – для счетчиков.
-tracehost – указывает IP-адрес машины, где запущен Unreal Insights.
Данные параметры включают профилирование по всем основным каналам и указывают игре, что Unreal Insights запущен на локальной машине. Доступно и удаленное профилирование.
Для того чтобы запустить проект с дополнительными параметрами перейдите в Editor Preferences и задайте необходимые параметры в Additional Launch Parameters. Убедитесь, что Unreal Insights уже запущен и после этого просто запустите проект в Standalone-режиме.
Установка дополнительных параметров запуска
Когда проект будет запущен, в Unreal Insights появится строка с Live-сессией:
Live-сессия в Unreal Insights
Также откроется новое окно, где и будут представлены результаты профилирования:
Результаты профилирования. Обратите внимание, что для Live-сессии данные будут обновляться в реальном времени
Профилирование времени выполнения с Unreal Insights
Откройте вкладку Timing Insights. Она состоит из нескольких панелей:
Главная фича вкладки Timing Insights – это возможность выбрать отдельный кадр в панели кадров (например, подозрительно долгий кадр) и получить детальную информацию о том, что и как долго происходило на протяжении этого кадра. Для этого необходимо кликнуть на нужном кадре и Unreal Insights сам выделит нужную часть в панели таймингов:
Агрегация данных профилирования по промежутку времени
Также вы можете получить агрегированные данные по любому промежутку времени, просто зажав ЛКМ на начальном моменте на линейке времени и отпустив на конечном.
Наведя на любое из событий, вы можете получить информацию об инклюзивном и эксклюзивном времени выполнения, процентном соотношении между временем выполнения этого события и события вызывающего и еще несколько более продвинутых свойств события:
Информация о timing-событии
Панель таймингов отображает данные по нескольким потокам (трекам) сразу. Чтобы включить или отключить отдельные треки, перейдите в меню Tracks в левой верхней части панели таймингов:
Выбор треков для отображения
В панели таймеров будут отображены все события, произошедшие в выделенном промежутке времени, сгруппированные и отсортированные в соответствии с выбранными в этой же панели настройками:
Панель таймеров
Панель счетчиков отображает данные по другому типу метрик, связанному не со временем выполнения, а с количеством вызовов, которые называются, как несложно догадаться, – счетчиками.
Программист может создавать свои счетчики, равно как и свои тайминг-события, чтобы отслеживать значения каких-либо свойств игры в течение времени. Например, так можно отслеживать количество врагов на уровне или любое другое важное для производительности значение.
Важная функция доступная в Timing Insights – это фокусировка панели таймингов на моменте, когда в лог было выведено определённое сообщение. Для этого всего лишь надо кликнуть на нужное сообщение в панели лога и курсор панели таймингов сам установится на необходимом моменте:
Панель логов – способ позиционировать курсор панели таймингов на моменте, когда в лог было выведено какое-либо сообщение
Чтобы добавить свое тайминг событие, используйте макрос TRACE_CPUPROFILER_EVENT_SCOPE в необходимой области видимости, например, в начале функции:
Макрос для включения профилирования отдельного фрагмента функции
В примере ниже был создан кастомный счетчик, который попеременно увеличивается и уменьшается на 5 единиц каждые 500 миллисекунд.
Демонстрация попеременного увеличения и уменьшения счетчика
Профилирование памяти с Unreal Insights
Откройте меню и поставьте галочку на Memory Insights. Откроется соответствующая вкладка:
Результаты профилирования памяти
Работа с данными профилирования памяти гораздо проще, чем с таймингами. На основной панели находятся графики потребления памяти различными частями игры/движка, например, Audio, Textures или Meshes с названиями, говорящими сами за себя. В верхней части находится трек Main Memory Graph, где отображается всё то же самое, но для эргономичности наложенное друг на друга.
В правой части вкладки в панели LLM Tags двойным кликом можно включить или отключить треки, которые будут отображаться в основной панели.
Вывод
Unreal Insights – отличный инструмент для разработчика на Unreal Engine, который может дать несколько действительно ценных советов о том, что и где в вашей игре нуждается в оптимизации.
Тело на свободе, разум под контролем: детали хоррора The Outlast Trials Статьи редакции
И пара его скриншотов.
О деталях геймплея и разработки кооперативного хоррора The Outlast Trials рассказал Филипп Морин, один из основателей студии Red Barrels, до этого выпустившей Outlast и Outlast 2.
Новый Кирпичный Завод на подходе:)
Не забуду 2013тый))
Единственный раз когда испугался был подвал, где идешь себе, никого не трогаешь, и тут этот огромный чёрт перед тобой оказывается.
гайдзины не умеют в хоррор
Я переиграл в миллиард хорроров и могу сказать, что дарквуд самый крутой с точки зрения угнетения. Это поляки
Чел. Можно твои примеры хорошего хоррора тогда?
виабушники не умеют в набросы
Как будто из песни какой-нибудь группы Алиса строчка)
И вот тут я был знатно шокирован. Я всегда думал, что Outlast — одна из первых игр с демонстрацией возможностей UE4, настолько она мне на тот момент казалась фотореалистичной. Но если в отношении первой части третью версию движка ещё можно принять (гугл выдаёт 3.5), то от использования её во второй я охренел.
согласен, сам бы не поверил что это был UE3
Может ошибка в статье? Относительно второй части
Чет вторая часть вообще не запомнилась, уж слишком сильно она отошла от своего изначального стиля. Надеюсь эта часть будет похожа на первую с её длс.
мне намного больше 2 зашла. Более интересные погони, А уровни в школе мне показались жуткими тогда очень.
Да вторая часть слабая была, разве что эпизоды в школе были хороши. Так что к 3 теперь с недоверием отношусь, буду ждать новых новостей и трейлеров.
Вообще не понимаю такого хайпа с этим Аутластом.
Первый я примерно до середины-начала конца играл ещё нормально, потом уже просто приелось, до финала через силу дошёл, удалил и забыл.
Первый Layers of Fear, при отсутствии монстрятни, просто супер-топ. Психологические хорроры в десятки, сотни, тысячи раз пизже, нежели вылезающая перед тобой в определённые моменты морда. Жаль, что второй стал говном.
The Elder Scrolls V: Skyrim и Oblivion показали на движке Unreal Engine 5
Оригинальная TES 5: Skyrim вышла довольно давно и получила множество переизданий. Энтузиаст решил представить, как бы выглядела игра на современном движке Unreal Engine 5
Движок Unreal Engine предоставляет массу возможностей. Так художник по окружению Кристиан Гомм (Christian Gomm) собрал на UE5 деревню Ривервуд (Riverwood) из The Elder Scrolls V.
В описании к проекту он отмечает, что большую часть окружения удалось сделать за несколько дней. Однако, затем в течение длительного периода добавлял разнообразные детали. Сосны создавались при помощи Speed Tree, а Ели были взяты из готовых ассетов с UE Marketplace. Почти все объекты в сцене сделаны с использованием технологии Nanite. Количество треугольников в подобных объектах: от 100 тысяч до 15 миллионов.
Также Кристиан представил Врата Обливиона:
\u0410\u0430\u0430\u0430\u0430, \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043b, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0443\u0448\u0451\u043b \u043d\u0430 \u043d\u043e\u0432\u043e\u0433\u043e\u0434\u043d\u0438\u0435 \u043f\u0440\u0430\u0437\u0434\u043d\u0438\u043a\u0438.. «>,»type»:»html»>],»commenter_type»:»common_user»,»commenter_id»:506165,»commenter_name»:»Milanche037″,»avatar_html»:»
\u042d\u0445 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0431\u044b \u0442\u0430\u043a\u0438\u0435 \u0440\u0438\u043c\u044d\u0439\u043a\u0438. \u0410 \u0442\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u043a\u0443\u0441\u043e\u0447\u043a\u0438. «>,»type»:»html»>],»commenter_type»:»common_user»,»commenter_id»:2001317,»commenter_name»:»Dmitriy Mackarov»,»avatar_html»:»
\u041a\u0440\u0430\u0441\u0438\u0432\u044b\u0439 \u043c\u0438\u0440. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u0435\u0433\u043e \u0437\u0430\u0441\u0435\u043b\u0438\u0442\u044c \u0444\u0438\u0440\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0431\u0443\u0440\u0430\u0442\u0438\u043d\u0430\u043c\u0438 \u0438 \u043d\u0430\u043f\u0438\u0447\u043a\u0430\u0442\u044c \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c\u0438 \u043e\u0434\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u043e\u0434\u0437\u0435\u043c\u0435\u043b\u044c\u044f\u043c\u0438 «>,»type»:»html»>],»commenter_type»:»common_user»,»commenter_id»:1186262,»commenter_name»:»Kubik»,»avatar_html»:» «,»profile_link»:»\/profile\/ZR1e9bV73vN9PMxD.html»,»rating»:»0″,»level»:0,»status»:»VISIBLE»,»created_at»:»2021-12-28 16:46:21″,»updated_at»:null,»replyLink»:null,»replyName»:null,»parent_id»:null,»publish»:true,»imgUrl»:null,»links»:null,»has_children»:false,»isEditing»:false,»publicable_id»:null,»publicable_type»:null>,»1552656″:<"id":1552656,"blocks":[<"data":<"id":"61cb19ba99ab8","html":"">,»type»:»html»>,<"data":<"id":"61cb19d129c4c","text":"\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u0435\u0433\u043e \u0437\u0430\u0441\u0435\u043b\u0438\u0442\u044c ","commenter_id":"1186262","commenter_name":"Kubik","quoted_comment_id":"1552654">,»type»:»quote»>,<"data":<"id":"61cb19d129c4f","html":"
\u0441\u043b\u0430\u0434\u043a\u0438\u0439 \u0440\u0443\u043b\u0435\u0442 \u0441\u0430\u043c \u0441\u0435\u0431\u044f \u043d\u0435 \u0443\u043a\u0440\u0430\u0434\u0451\u0442
«>,»type»:»html»>],»commenter_type»:»common_user»,»commenter_id»:1327096,»commenter_name»:»Arcon_Warl»,»avatar_html»:»
Epic Games выпустила Unreal Engine 5
В рамках мероприятия State of Unreal компания Epic Games представила для загрузки игровой движок Unreal Engine 5. Его анонс состоялся весной 2020 года в виде демонстрации возможностей для еще не вышедшей Sony PlayStation 5.
Компании-партнеры Unreal Engine 5
UE5 включает улучшения для разработчиков игр, включая увеличенную производительность и обновленный пользовательский интерфейс. Однако особый интерес представляют технологии, которые обеспечивают более фотореалистичные визуальные эффекты.
Lumen — полностью динамическое решение для более реалистичного глобального освещения. Nanite позволяет создавать проекты с большим количеством геометрических деталей. Инструменты UE5 упрощают разработку частей открытого мира в играх благодаря возможности работать над их областями по отдельности независимо друг от друга. Польская студия-разработчик CD Projekt RED подтвердила, что применяет данное решение для создания следующей серии тайтла Witcher (Ведьмак).
Движок имеет новые и улучшенные инструменты для создания моделей, анимации и звука, которые не требуют помощи сторонних редакторов.
С декабря прошлого года UE5 используется в онлайн-игре Fortnite. В тот же месяц вышел проект Matrix Awakens, который демонстрирует возможности игрового движка в условиях открытого мира.
Epic Games выпустит проект многопользовательского шутера Lyra Starter Game, созданного на UE5. Игра похожа на Unreal Tournament, она позволит разработчикам обучаться работе с движком. Lyra использует модульную архитектуру, проект адаптирован для ПК, консолей и мобильных устройств.
Также компания показала неигровой проект The City Sample, который представляет из себя городскую сцену из Matrix Awakens. В нем представлены строения, техника, население виртуального города, демонстрирующие активности открытого мира.
В настоящее время анонсировано не так много игр для UE5. Один из первых представленных проектов Black Myth: Wukong выйдет не ранее 2023 года, а новая часть Witcher пока вовсе не имеет даты выхода. Однако релиз движка создает условия для появления новых игр и спецэффектов для видео.
Технический директор Epic Games Ким Либрери говорит, что благодаря инструментам UE5 и современному игровому оборудованию появится больше пересечений между средами. Предыдущие версии Unreal Engine применялись в кино- и телепроектах, например, в сериале «Мандалорец».
В конце мероприятия студия Crystal Dynamics сообщила, что начинает работу над новой игрой серии Tomb Raider на UE5.
Вчера Epic Games анонсировала мобильное приложение RealityScaner, способное сканировать объекты, преобразовывая их в 3D-модели, которые можно помещать в Unreal Engine и другие площадки.
Туториал по Unreal Engine: C++
Blueprints — очень популярный способ создания геймплея в Unreal Engine 4. Однако если вы уже давно программируете и предпочитаете код, то вам идеально подойдёт C++. С помощью C++ можно даже вносить изменения в движок и создавать собственные плагины.
В этом туториале вы научитесь следующему:
Примечание: в этом туториале подразумевается, что вы уже знакомы с основами Unreal Engine. Если вы новичок в Unreal Engine, то сначала изучите состоящий из десяти частей туториал по Unreal Engine для начинающих.
Приступаем к работе
Если вы ещё этого не сделали, то вам понадобится установить Visual Studio. Выполните инструкции из официального руководства Epic по настройке Visual Studio для Unreal Engine 4. (Вы можете использовать альтернативные IDE, но в этом туториале применяется Visual Studio, потому что Unreal рассчитан на работу с ним.)
Затем скачайте заготовку проекта и распакуйте её. Перейдите в папку проекта и откройте CoinCollector.uproject. Если приложение попросить пересобрать модули, то нажмите Yes.
Закончив с этим, вы увидите следующую сцену:
В этом туториале мы создадим шар, который будет перемещать игрок, чтобы собрать монеты. В предыдущих туториалах мы использовали управляемых игроком персонажей с помощью Blueprints. В этом туториале мы создадим его с помощью C++.
Создание класса C++
Для создания класса C++ перейдите в Content Browser и выберите Add New\New C++ Class.
После этого откроется C++ Class Wizard. Во-первых, нужно будет выбрать, от какого класса мы будем наследовать. Поскольку класс должен быть управляемым игроком, нам понадобится Pawn. Выберите Pawn и нажмите Next.
При этом будут созданы файлы и скомпилирован проект. После компиляции Unreal откроет Visual Studio. Если BasePlayer.cpp и BasePlayer.h не будут открыты, то перейдите в Solution Explorer и откройте их. Они находятся в папке Games\CoinCollector\Source\CoinCollector.
Прежде чем двигаться дальше, вам нужно узнать о системе рефлексии Unreal. Эта система управляет различными частями движка, такими как панель Details и сборка мусора. При создании класса с помощью C++ Class Wizard движок Unreal добавляет в заголовок три строки:
Примечание: префиксы не отображаются в редакторе. Например, если вам нужно создать переменную типа ABasePlayer, то нужно искать BasePlayer.
Это всё, что вам пока нужно знать о системе рефлексии. Теперь нам нужно добавить модель игрока и камеру. Для этого нужно использовать компоненты.
Добавление компонентов
Для Pawn игрока нам нужно добавить три компонента:
Примечание: Важно добавлять файл .generated.h последним. В нашем случае директивы include должны выглядеть следующим образом:
Если он будет не последним include, то при компиляции мы получим ошибку.
Теперь нам нужно объявить переменные для каждого компонента. Добавьте после SetupPlayerInputComponent() следующие строки:
Использованное здесь имя будет именем компонента в редакторе. В нашем случае компоненты будут отображаться как Mesh, SpringArm и Camera.
Также можно добавить к UPROPERTY() описатели (specifiers). Они будут управлять поведением переменной в различных аспектах движка.
VisibleAnywhere позволит каждому компоненту быть видимым в редакторе (в том числе и в Blueprints).
BlueprintReadOnly позволит получать ссылку на компонент с помощью нодов Blueprint. Однако он не позволит нам задавать компонент. Для компонентов важно быть read-only, потому что их переменные являются указателями. Мы не хотим, чтобы пользователи задавали их, иначе они могут указать на случайное место в памяти. Стоит заметить, что BlueprintReadOnly всё-таки позволяет задавать переменные внутри компонента, и именно к такому поведению мы стремимся.
Теперь, когда у нас есть переменные для каждого компонента, нам нужно их инициализировать. Для этого необходимо создать их внутри конструктора.
Инициализация компонентов
Это создаст компонент каждого типа, а затем назначит их адрес в памяти переданной переменной. Аргумент-строка будет внутренним именем компонента, используемым движком (а не отображаемым именем, несмотря на то, что в нашем случае они одинаковы).
Затем нам нужно настроить иерархию (выбрать корневой компонент и так далее). Добавьте после предыдущего кода следующее:
После завершения кода компонентов нам нужно выполнить компиляцию. Выберите один из следующих способов компиляции:
Однако в Blueprints достаточно будет просто выбрать меш из раскрывающегося списка.
Если вы переместите ресурс в другую папку, в Blueprints ничего не испортится. Однако в C++ придётся менять каждую ссылку на этот ресурс.
Чтобы задать поворот меша и пружинного рычага в Blueprints, нужно будет создать Blueprint на основании BasePlayer.
Примечание: Обычно практикуется создание базовых классов в C++ с последующим созданием подкласса Blueprint. Это упрощает изменение классов для художников и дизайнеров.
Выделение подклассов классов C++
В Unreal Engine перейдите в папку Blueprints и создайте Blueprint Class. Разверните раздел All Classes и найдите BasePlayer. Выберите BasePlayer, а затем нажмите на Select.
Переименуйте его в BP_Player, а затем откройте.
Сначала мы зададим меш. Выберите компонент Mesh и задайте для его Static Mesh значение SM_Sphere.
Затем нам нужно задать поворот и длину пружинного рычага. Наша игра будет с видом сверху, поэтому камера должна быть над игроком.
Поскольку пружинный рычаг является дочерним элементом меша, он начинает вращаться, когда начинает вращаться шар.
Чтобы исправить это, нам нужно сделать так, чтобы поворот рычага был абсолютным. Нажмите на стрелку рядом с Rotation и выберите World.
Затем задайте для Target Arm Length значение 1000. Так мы отдалим камеру на 1000 единиц от меша.
Затем нужно задать Default Pawn Class, чтобы использовать наш Pawn. Нажмите на Compile и вернитесь в редактор. Откройте World Settings и задайте для Default Pawn значение BP_Player.
Нажмите на Play, чтобы увидеть Pawn в игре.
Следующим шагом будет добавление функций игроку, чтобы он мог перемещаться.
Реализация движения
Вместо того, чтобы добавлять для движения смещение, мы будем двигаться с помощью физики! Сначала нам нужна переменная, указывающая величину прикладываемой к шару силы.
Вернитесь в Visual Studio и откройте BasePlayer.h. Добавьте после переменных компонентов следующее:
EditAnywhere позволяет изменять MovementForce в панели Details. BlueprintReadWrite позволит задавать и считывать MovementForce с помощью нодов Blueprint.
Далее нам нужно создать две функции. Одну для движения вверх-вниз, другую — для движения влево-вправо.
Создание функций движения
Добавьте под MovementForce следующие объявления функций:
Позже мы свяжем с этими функциями привязки осей. Благодаря этому привязки осей смогут передавать свой scale (поэтому функциям нужен параметр float Value ).
Примечание: Если вы незнакомы с привязками осей и scale, изучите туториал про Blueprints.
Теперь нам нужно создать реализацию для каждой функции. Откройте BasePlayer.cpp добавьте в конец файла следующее:
Закончив создание функций движения, мы должны связать с ними привязки осей.
Связывание привязок осей с функциями
Ради упрощения я уже заранее создал привязки осей. Они находятся в Project Settings, в разделе Input.
Примечание: Привязки осей не обязаны иметь то же название, что и функции, с которыми мы их связываем.
Добавьте внутрь SetupPlayerInputComponent() следующий код:
На этом мы закончили с функциями движения. Теперь нам нужно включить физику для компонента Mesh.
Включение физики
Добавьте внутрь ABasePlayer() следующие строки:
Первая строка позволит воздействовать на Mesh физическим силам. Вторая строка присваивает MovementForce значение 100000. Это значит, что при движении шару будет прибавлено 100 000 силы. По умолчанию физические объекты весят примерно 110 килограмм, так что для их перемещения потребуется много силы!
Если мы создали подкласс, некоторые свойства не изменятся, даже если мы изменим их в базовом классе. В нашем случае у BP_Player не будет включено Simulate Physics. Однако теперь во всех создаваемых подклассах оно будет включено по умолчанию.
Выполните компиляцию и вернитесь в Unreal Engine. Откройте BP_Player и выберите компонент Mesh. Затем включите Simulate Physics.
Нажмите Compile, а затем на Play. Нажимайте W, A, S и D, чтобы передвигать шар.
Далее мы объявим функцию C++, которую можно реализовать с помощью Blueprints. Это позволит дизайнерам создавать функционал без использования C++. Чтобы научиться этому, мы создадим функцию прыжка.
Создание функции прыжка
Сначала нам нужно связать привязку прыжка к функции. В этом туториале мы назначим прыжок на клавишу пробела.
Вернитесь в Visual Studio и откройте BasePlayer.h. Добавьте под MoveRight() следующие строки:
Так как Jump — это привязка действия, способ связывания немного отличается. Закройте BasePlayer.h и откройте BasePlayer.cpp. Добавьте внутрь SetupPlayerInputComponent() следующее:
Дальше мы переопределим Jump() в Blueprints.
Переопределение функций в Blueprints
Выполните компиляцию и закройте BasePlayer.cpp. Затем вернитесь к Unreal Engine и откройте BP_Player. Перейдите в панель My Blueprints и наведите мышь на Functions, чтобы появился раскрывающийся список Override. Нажмите на него и выберите Jump. Так мы создадим Event Jump.
Примечание: Переопределение будет событием, если отсутствует возвращаемый тип. Если возвращаемый тип существует, то это будет функция.
Далее мы создадим следующую схему:
Так мы добавим Mesh импульс (JumpImpulse) по оси Z. Учтите, что в этой реализации игрок может прыгать бесконечно.
Далее нам нужно задать значение JumpImpulse. Нажмите на Class Defaults в Toolbar, а затем перейдите к панели Details. Задайте JumpImpulse значение 100000.
Нажмите на Compile, а затем закройте BP_Player. Нажмите на Play и попробуйте попрыгать с помощью клавиши пробела.
В следующем разделе мы заставим монеты исчезать при контакте с игроком.
Собирание монет
Вернитесь в Visual Studio и откройте BaseCoin.h. Добавьте под PlayCustomDeath() следующие строки:
После связывания OnOverlap() будет исполнятся при наложении монеты и другого актора. OverlappedActor будет монетой, а OtherActor — другой актор.
Реализация наложений
Откройте BaseCoin.cpp и добавьте в конец файла следующее:
Теперь нам нужно выполнить приведение. В Unreal Engine приведение можно выполнить так:
Добавьте внутрь OnOverlap() следующее:
Связывание функции наложения
Так мы свяжем OnOverlap() с событием OnActorBeginOverlap. Это событие происходит всегда, когда актор накладывается на другого актора.
Выполните компиляцию и вернитесь в Unreal Engine. Нажмите Play и начните собирать монеты. При контакте с монетой она будет уничтожаться, что приводит к её исчезновению.
Примечание: Если монеты не исчезают, попробуйте перезапустить редактор, чтобы выполнить полную рекомпиляцию. Для работы некоторых изменений требуется перезапуск.
Создание реализации функции по умолчанию
Следующим этапом будет реализация OnOverlap() в BP_Coin.
Создание реализации в Blueprint
Выполните компиляцию и закройте Visual Studio. Вернитесь к Unreal Engine и откройте BP_Coin. Переопределите On Overlap и создайте следующую схему:
Теперь при наложении игрока на монету будет выполняться Play Custom Death.
Нажмите на Compile и закройте BP_Coin. Нажмите Play и соберите несколько монет, чтобы протестировать новую реализацию.
Куда двигаться дальше?
Вы можете скачать готовый проект отсюда.
Как вы видите, работать с C++ в Unreal Engine довольно просто. Хотя мы уже добились кое-чего в C++, вам ещё нужно многому научиться! Я рекомендую изучить серию туториалов Epic по созданию с помощью C++ шутера с видом сверху.
Если вы новичок в Unreal Engine, то изучите нашу серию туториалов для начинающих из десяти частей. В этой серии вы познакомитесь с различными системами, такими как Blueprints, материалы и системы частиц.
Орёл или решка: сравнение Unity и Unreal Engine
Извечное противостояние — повод для обсуждения.
Портал 80.lv опубликовал краткое сравнение самых популярных современных игровых движков — Unity 3d и Unreal Engine 4. Его подготовил инди-разработчик и видеоблогер Jayanam.
DTF публикует перевод статьи.
Первая область сравнения — UI-редакторы для создания уровней, которые, по мнению автора, очень похожи. В них есть браузеры контента для ассетов, скриптов и других файлов проекта. Игровые объекты можно перетаскивать в область сцены и таким образом добавлять в её иерархию.
Объекты в редакторе сцены изменяются с помощью инструментов перемещения, поворота и масштабирования — они похожи в обоих движках. Свойства Unity-объектов отображаются в Inspector, а UE4 — в части Details. Jayanam также сравнивает возможности Unity Prefabs c Blueprints.
В обоих движках есть статические меши (static meshes) — их можно двигать, поворачивать, и масштабировать — и скелетные меши (skeletal meshes) — геометрические объекты, привязанные к костям скелета и используемые для анимирования персонажей. Их можно создавать в программах вроде Blender или Maya.
Анимации, включённые для скелетных мешей, также можно импортировать. В Unity они прикрепляются к импортированному объекту, как клипы анимации (animation clips), а в UE4 называются последовательностями анимации (animation sequences). В первом движения управляются с помощью контроллеров анимации (animation controllers), а во втором по тому же принципу действуют анимационные Blueprints.
В обоих движках есть стейт-машины, определяющие переходы из одного состояния ассета в другое. В UE4 система называется Persona, а в Unity — Mecanim. Также возможно применение скелетных мешей одного скелета к другим, но в Unity это в основном используется для анимирования гуманоидов.
В UE4 анимации можно редактировать, в Unity — практически нет, особенно плохо дело обстоит с движениями гуманоидов. По мнению автора, движки не подходят для профессионального анимирования персонажей — лучше использовать программы вроде Blender или Maya, а результат импортировать в виде FBX-файлов. Прикреплённый к объектам материал добавляется в проект, но его свойства вроде шейдера или текстур придётся применять вручную.
Для этого в Unity нужно задать материалу шейдер и добавить в его слоты текстуры — карты шероховатостей, нормалей или диффузии. Собственные шейдеры придётся писать самостоятельно или с помощью сторонних инструментов вроде Shader Forge или ASE. А в UE4 встроен очень мощный редактор материалов, основанный, как и система Blueprints, на нодах.
Для программирования в UE4 используется язык C++, который не все любят из-за сложности и продолжительности компилирования. Однако Jayanam считает, что у движка понятный API и приемлемый период компиляции. В UE4 очень мощная и проработанная система визуального скриптования — Blueprints, с помощью которой можно достичь практически тех же результатов, что и c C++.
Unity 5 поддерживает языки C# и UnityScript. API и его концепт очень похож на аналог из UE4. При использовании управляемого языка вроде C#, программист не обязан использовать указатели (pointers), компилирование происходит быстро. В Unity нет системы визуального скриптования, и чтобы использовать что-то подобное, разработчик вынужден покупать сторонние дополнения вроде Playmaker.
Для 2D-разработки в Unity есть великолепные инструменты — sprite creator, sprite editor и sprite packer. UE4 также поддерживает спрайты в Paper 2d, но решения из Unity мощнее, кроме того, в последнем есть отдельный физический движок для 2d-объектов.
В UE4 встроен постпроцессинг. К сцене можно применять bloom-эффект, тонирование и антиалиасинг как глобально, так и к отдельным её частям (при помощи компонента PostProcessVolume).
В Unity есть стек постпроцессинга, который можно скачать из магазина ассетов движка. Система менее гибкая, чем в UE4 — эффекты применяются только стеком или скриптами к камере.
Sequencer в UE4 можно использовать для создания синематиков. Это мощный инструмент, работающий по принципу добавления объектов на временную шкалу. К настоящему моменту в Unity 5.6 нет системы для синематиков, но timeline-редактор добавят в Unity 2017.
В заключении автор подчёркивает, что оба движка — мощные, но UE4 более гибок. В то же время, для создания 2D-игры он бы выбрал Unity 5, а вот дорогой 3D-проект с открытым миром делал бы на UE4.
Израильская компания AppReal-VR, занимающаяся решениями для виртуальной реальности, также сравнивала движки, но применительно к мобильной и VR-разработке.
У каждого из движков есть свои сильные стороны для разных задач. Unity подойдёт новичкам и любителям, в то время как Unreal — строго для профессиональных разработчиков.
Набор функций Unreal Engine лучше подходит для трёхмерных проектов, в то время как у Unity огромный послужной список на мобильных устройствах. Если вы собираетесь делать мобильную игру, или у вас VR-проект с небольшим бюджетом — выбирайте Unity. Если же вы делаете дорогую игру для консолей с опытной командой разработчиков — используйте Unreal Engine 4.
А каким был ваш опыт работы с Unity 3D и Unreal Engine 4? Поделитесь в комментариях.
Для VR у Unity более качественный антиалиасинг. В UE4 forward renderer, необходимый для MSAA, поддерживает не все фичи. Для 2D тоже Unity подходит лучше. В остальном у UE4 абсолютный приоритет. Что тут обсуждать, это AAA-движок с большой историей. Многое из того, что он может из коробки, Uniiy просто не поддерживает. Получить качественные шейдеры в нем в разы проще, чем в Unity.
Пытался начинать с юнити. И, честно говоря, мало что понял. При работе с ue4 достаточно быстро разобрался. Но, к сожалению, в решении всех задач приходится ковыряться в иностранных источниках. По юнити материалов гораздо больше.
Короче говоря, два года назад я бы рекомендовал всем юнити, но сейчас рекомендую ue4.
Я начинал делать игру в Unity3d. Купил необходимые ассеты для удобной работы, но в итоге, так и забросил. Для работы в юнити, нужно знать программирование (js, а лучше c#) на хорошем уровне. Другое дело UE4. Блупринты спасут любого, а что то серьёзное можно взять фрилансера.
Фраза «Для работы в юнити, нужно знать программирование» говорит совсем не в пользу UE.
Да, у автора была неточная формулировка, но думаю, это простительно, раз уж «many in the Unity development community (and even in the Unity corporation) refer to UnityScript and JavaScript as if they were equivalent or interchangeable».
Поправили и добавили ссылку, спасибо!
Часто говорят, что там дескать JS, да. Но мне как джаваскриптизеру с десятилетним стажем проще было писать на C#, чем на этом якобы JS. И вот почему:
* Никаких встроенных в JS объектов, функций и API там нет. У массивов, строк и объектов другие свойства и методы. Прокидываются вещи из рантайма юнити, надо искать, что и где.
* Некоторые, казалось бы, очень простые и очевидные, синтаксические конструкции тупо не работают.
* Классы не похожи ни на ES6, ни на TypeScript, ни на CoffeeScript
* Явное указание типов вроде не обязательно, но иногда компилятор в самый неожиданный момент не может вывести тип автоматически и надо идти и прописывать. Опять так декларация типов не совсем такая, как в TypeScript или ActionScript, а как описать сложные типы не всегда очевидно.
* Нет нормального редактора (MonoDevelop таким не является), который бы поддерживал этот синтаксис, подсвечивал ошибки, давал навигацию и так далее (я уж молчу про linting и рефакторинг).
В общем, нельзя просто взять и начать писать на UnityScript. Может быть, если JS (или ActionScript) у вас первый и единственный язык, это проще, чем, скажем, учить C# с нуля, но и то не факт, ибо по шарпу дофигалиард учебных материалов.
Простите за лонгрид и технические подробности, накипело:)
Да и я бы не советовал UnityScript там использовать. Юнитишники сами жалеют, что когда-то его ввели. И каждый раз проскакивают мысли о том, что они хотят выпилить его совсем. Так что, предполагаю, что в ближайшую пару лет они его совсем выпилят и оставят только C#.
Как начать делать игру в UE4
Всем доброго дня!
Вот уже несколько месяцев пытаюсь разобраться с Unreal Engine и хочу поделиться теми «хаками», которые я обнаружил и, возможно, кто-то подскажет ещё более эффективные, но не очень заметные новичкам.
Как бы я не был далёк на текущий момент от создания «игры мечты», но я уже в тысячу раз ближе, чем когда просто сидел, «хотел» и ничего не делал. То, как я продвигаюсь по этому пути, безусловно, определяются некими «начальными условиями», а именно: я технарь-интроверт, не готов заниматься поиском\созданием команды, без художественных навыков (не xD-художник, не моделлер, не писатель, не музыкант и т.п.), занимаюсь UE4 как хобби, в свободное от работы и всего-другого время. Воспринимаю английскую речь и готов потратить немного денег на хобби, приносящее удовольствие.
Смотря на инди игры в Steam и других ресурсах, я для себя решил, что «страшненькие» игры — это не вариант. Да, безусловно, в игре важен геймплей\идея\«месседж», но я просто не готов даже начинать играть во что-то, что неаккуратно выглядит. По этому за основу был взят готовый движок с маркетплейсом (об этом чуть позже). Наверное, правильнее было бы начинать с Unity, но как слушатель подкаста «Как делают игры» на протяжении уже нескольких лет не мог пройти мимо Unreal Engine 4 от Epic Games. (По этой же причине мысли писать свой движок были задавлены в зародыше)
UE4 — это огромный «станок», с тысячами функций, «кнопок» и ньюансов (багов, костылей и т.п.), с помощью которого можно сделать почти что угодно. Это всё притягивает профессионалов, но в тоже время отпугивает новичков. Постараюсь рассказать, с какой стороны подходить к UE4 проще всего.
В первую очередь стоит заметить, что старых-добрых книжек про UE4 не так и много, особенно на русском языке. На Озоне она всего одна по сравнению с 10+ про Unity. Но книжки, в целом, не очень и нужны, т.к. есть много других способов узнать как что делается на UE4, правда они все (почти) на английском языке.
Материалы от Epic Games
YouTube
Youtube (возможно, и Twitch). Как это ни странно, но на Youtube оказалось огромное количество уроков по UE4. Поставил на второе место потому, что бесплатно. Просто вбиваете в поиск Unrel Engine + «что угодно» и вот у вас уже есть чем заняться на ближайшие несколько недель. Лично для меня UE4 начался вот с этого видео.
Udemy
Udemy. После открытия для себя видело уроков на Youtube, я пошёл искать где это поставлено профессионально и на поток, нашёл Udemy. Поставил на третье место потому, что платно. Про это «платно» стоит сказать отдельно. «Официальная» цена курсов 15-20к рублей. Такой она бывает, примерно, 5ть дней в году. Всё остальное время действуют разные «только сегодня» скидки: дней 300 в году курсы стоят около 1500р,
40 дней — 1000р и
20 дней (новый год, 1е сентября) — 800р. К этому ещё добавляется приложения для Андройд (про iOS не знаю), где цена почти всегда на 50р отличается от цены на сайте (иногда дороже, иногда дешевле). Качество курсов разное, почти все курсы содержат ссылки на исходный код и ассеты, но некоторые курсы предлагают всё найти самим, будьте внимательны. Курсы, что я проходил, записаны максимум в 720р, что не очень для просмотра кода и мелкого текста в менюшках UE4. В целом впечатление от Udemy крайне положительное, даже когда «по работе» понадобился D3.js, я просто прошёл соответствующий курс за пару дней и это для меня было проще, чем самостоятельно копаться в примерах и документации. И это всё по крайне адекватной цене (360 дней в году).
Разное
Разное. Кроме курсов\видеоуроков с Youtube\Udemy, существует возможность пройти настоящее(ну почти) online обучение. Яндекс мне постоянно показывает рекламу Skillbox, где меня UE4 научат за 76к рублей и даже трудоустроят на ЗП 90к (из рекламы, не проверял лично). При подготовке этого текста вбил просто в поиск «школа unreal engine» и гугл выдал более десятка вариантов обучения на русском языке за разный ценник. Почему-то с образованием на английском языке не очень, на Coursera куча курсов по поиску «Unity» и они же по «Unreal Engine». В рамках прохождения уроков по UE4 понадобилось воспользоваться SpeedTree. На текущий момент это самые большие траты для меня (20$ за месяц), т.к. никаких бесплатных версий для личного использования там нет. У этих ребят тоже есть маркетплейс с готовыми ассетами (деревьями\кустарниками и прочим), центы там «не локализованные», но тоже существует бесплатный ежемесячный набор для подписчиков. Если подписываться раз в 2 месяца, чтобы с середины месяца, и успевать собирать все бесплатные наборы — соотношение результат\цена будет уже приятней. И последний встреченный мной ресурс — 80 LEVEL. К сожалению, не успел до конца в нём разобраться, вроде бы и много бесплатных статей-уроков, но куда ни ткни — перебрасывает на CGMA, где предлагают много разных online курсов, в том числе по UE4 (примерно за 1k$).
Маркетплейсы
Маркетплейсы (или как делать красивую игру без художественного образования). Чтобы визуальный ряд игры не носил гордого названия «сделан профессиональными программистами», надо учиться рисовать самому, либо искать знакомых художников, либо потратить немного денег на незнакомых. Сразу стоит поставить себе напоминалку на каждый первый вторник месяца, вечер по МСК, сходить в Unreal Engine Marketplace (UEM) и скачать себе свежую подборку «Featured free Marketplace content». В Магазине и так достаточно много бесплатного контента (ассеты Epic от игр Парагон и Infinity Blade, текстуры Quixel Megascans, и ещё много разного), но ежемесячная подборка меняется, если вы её успели «купить» за бесплатно — она останется у вас, но вот через месяц снова станет платной для неуспевших. Таким образом за год\два можно накопить огромное количество готовых «художественных» кусочков «про запас». В целом, количество и цены (про качество не знаю, почти не пользовался) разных готовых ассетов в UEM позволяет собрать как минимум играбельное демо практически любой игры. Хотя, возвращаясь к вопросу цены, глядя на цены на ассеты в UEM и на игры в Steam, вариант «идти работать» на создание ассетов для разных Маркетплейсов может быть не менее выгодно, чем создавать игры (но менее интересно, безусловно). Как и в любом магазине, тут бывают скидки, так что стоит поставить заинтересовавшие позиции под наблюдение (самостоятельно, функционал UEM далёк от стандартного для online-магазина). У SpeedTree есть свой store (деревья и растительность), как я уже упоминал. Текстуры Quixel Megascans были платными (и остаются доя не-UE4 использования). Уверен, что маркетплейсы ассетов есть (или скоро появятся) у всех специализированных ресурсов или приложений. С таким способом добывания «красоты» я пока вижу только одну проблему — каждый из них создаётся в своей стилистике, а на игру их понадобится несколько. Если не обыграть это игровой механикой, то придётся связываться с автором «доминирующего» ассета и просить его что-то добавить\доработать. Но это уже сказ про фриланс и заказ работ на стороне.
Подборка красивых игр на Unreal Engine 4 для iOS и Android
Вы наверняка знаете, что если в трейлере или описании игры написано «Unreal Engine 4», то разработчики мягко намекают на хорошую картинку. Но куда интереснее то, что такое примечание чаще всего оставляют те, кому, кроме картинки, удивлять-то особо и нечем.
Unreal Engine — это действительно хорошая графика. Но хорошая графика не подразумевает фотореализм. Иногда визуальный стиль куда важнее. И сегодняшний список призван это доказать. Если же вы забрели исключительно в поисках чего-то яркого и зрелищного, то тут все просто: вводите в любимой поисковой системе «корейская или китайская action RPG», и вуаля. Даже обзоры смотреть не нужно — они особо между собой не отличаются.
Fortnite
Было бы странно рассказывать об играх на Unreal Engine, и не упомянуть проект разработчиков этого движка. Да, да, именно Epic Games ответственны за эту платформу для создания игр, а пример Fortnite показывает, почему Unreal Engine не всегда подразумевает фотореалистичную картинку.
Нужно ли описывать Fortnite? Если это ваше первое в жизни видео об играх, то есть вероятность, что вы о ней не знаете, в противном случае — такое маловероятно.
Это одна из самых лучших королевских битв сегодня и одна из самых популярных игр в истории. К ней можно относиться по-разному, но не признавать степень ее значимости не получится.
К слову, мультяшная графика — одна из главных претензий так называемых серьезных игроков к Fortnite. Якобы такая картинка не дает проникнуться атмосферой. Но почему вас это должно волновать?
Кстати, PUBG Mobile тоже на Unreal Engine 4 бегает, но зачем нам две королевские битвы в видео?
Life is Strange
Еще одна игра, вокруг которой крутиться масса стереотипов. И самое главное, что стереотипы мешают исключительно тем, кто в них верит, не давая возможности прикоснуться к одной из лучших видеоигровых историей этого десятилетия.
В оригинале игра работала на Unreal Engine 3.5, но специально для мобильных разработчики выпустили ее на новом движке. На внешний вид это не сильно повлияло, но позволило запускать проект на большем количестве устройств.
Life is Strange — это эпизодическое приключение, созданное в стиле игр Telltale Games. Сюжет крутится вокруг девушки по имени Макс Колфилд, которая внезапно обнаруживает в себе способность возвращать время вспять. В геймплее экшена не ждите — это все-таки игра об истории, но порой даже попытка выбрать правильный вариант ответа заставляет попотеть.
И предвосхищая комментарии, стоит сказать: «Нет, это не игра про лесбиянок», «Нет, сюжет здесь не только для девочек», «Нет, она точно не скучная».
А для тех, кому понравится, на мобильных и приквел доступен под названием Life is Strange: Before the Storm. Он другой, но если вы фанат, то должно понравиться.
Overhit
Чтобы облегчить вам поиск тех самых корейских action RPG, где «картинка, картинка и больше ничего», стоит все-таки вспомнить пару таких игр. Одна из них — пошаговая RPG Overhit от издателя Nexon.
Не буду лукавить, Overhit действительно выглядит красиво. Качественные трехмерные модели персонажей, детализированные декорации, освещение, куча эффектов — на ПК и консолях все это давно уже смотрится пошловато, а для мобильных — в самый раз.
Проблемы начинают вылезать в тот момент, когда вы собираетесь в это играть. Или смотреть, если точнее. Даже если отключить автобой, то весь игровой процесс построен на тапах по разным способностям персонажей.
Скачать Overhit, чтобы показать друзьям, на что способен ваш смартфон, конечно, можно, но играть в это. хотя, тут такой возможности не предусмотрено, поэтому за геймплеем лучше к другим играм в этом видео обратитесь.
Mortal Kombat
Кто не знает Mortal Kombat? Самый брутальный, самый кровавый, самый веселый (хотя с этим можно поспорить) файтинг в истории видеоигр. Естественно, он не мог не появиться и на мобильных. А только в этом году для него вышло крупное обновление, которое перевело проект на новый движок Unreal Engine 4.
На самом деле, в этом году вышла одна игра, и между ней с Mortal Kombat запросто можно провести параллели. Это Call of Duty: Mobile. Такое же вдохновение оригиналом, те же знакомые персонажи, тот же free-to-play, то же наследие жанров. Хотя последний пункт и довольно спорный.
Технически Mortal Kombat — это файтинг. По факту же это всего лишь кликер. Забудьте о заучивании комбинаций, забудьте о горящих геймпадах и всем тем, что вы привыкли видеть во взрослых Mortal Kombat.
Мобильная версия — это не замена компьютерной. Это больше похоже на мерч — просто подарок для фанатов, который честно пытается развлекать, но его разработчикам это и не нужно.
EQQO — игра, которая точно заслуживает большего внимания, чем она получила. Это оригинальное приключение про незрячего мальчика с интересным способом управления, которая есть в обычной версии и в издании для виртуальной реальности.
Интересно то, что вы не прямо управляете главным гереом, а как бы подталкиваете, помогая прокладывать путь. Для управления используется не только экран, но и гироскоп, поэтому играть в EQQO в трясущемся вагоне метро — не лучшая идея. Лучше все-таки наслаждаться ею в спокойной обстановке, а если есть возможность — использовать хорошие наушники, потому что саундтрек был записан Пражским филармоническим оркестром.
EQQO — это пример игры, которые принято называть бриллиантами в пыли. О ней мало кто знает, но если вам повезло, а вы еще и любите такие приключение — не вздумайте пропустить.
eFootball PES 2020
Нет смысла спорить о том, какой футбол лучше: FIFA или PES. Достаточно знать, что последняя работает на Unreal Engine 4, что идеально вписывается в тему сегодняшней подборки.
Были времена, когда серия PES страдала из-за отсутствия лицензий, и в разные части играли только из-за значительно отличающегося от FIFA игрового процесса, но сегодня у Konami масса договоренностей с разными лигами, что удовлетворяет в том числе и фанатов футбола.
А что с геймплеем? Ведь именно он часто становится камнем преткновения в мобильных проектах. По сути, eFootball PES — это симулятор футбола в миниатюре. Тут проще движок, проще анимации, проще графика и, разумеется, проще геймплей. Но что самое важное — это не Call of Duty, и не Mortal Kombat. Вы не сможете научиться хорошо играть в PES за пару матчей, и это сближает ее со взрослыми футбольными симуляторами, а не с другими мобильными играми.
AxE: Alliance vs Empire
И еще одна игра для тех, кому лень искать корейские action RPG, но кому позарез нужна именно красивая картинка. На самом деле, AxE — это типичная мобильная MMORPG с открытым, но пустым миром, мощным спецэффектами и, конечно же, автобоем. Последний, к слову, отключается, поэтому ругать игру из-за него не стоит.
В AxE по сюжету вечно враждуют две фракции, у каждой из которых есть свои уникальные классы. В самой игре есть разные подземелья, арены, ежедневные события и вот это вот все.
Честно говоря, рассказывать об этой игре так же скучно, как и играть в нее. С другой стороны, Unreal Engine есть? Есть! Зачет, поехали дальше.
Bright Memory
А напоследок не совсем игра, а скорее технодемка, о которой в последнее время тоже много говорили. Вообще Bright Memory — это корейский шутер для ПК, созданием которого занимается один человек. И у этого человека внезапно закончились деньги на разработку.
Этот умелец, вместо того чтобы бросать свое детище или идти на Kickstarter, отправился в рай для людей, которые хотят получать деньги фактически ни за что. Ведь кто, как не игроки на мобильных, готовы отдавать тысячи долларов за лутбоксы в надежде выбить крутого персонажа или купить себе пропуск в игру.
А здесь всего лишь автор продает игру, в которой контента минут на 40 за 299 рублей. В эпоху сессионных развлечений, создатели которых рассчитывают, что вы проведете в их играх сотни часов, это очень смелый поступок. Который еще и, судя по всему, оправдывает себя.
Можете воспринимать Birght Memory как ранний доступ. Покупая игру, вы покупаете шанс когда-нибудь получить полноценный довольно красивый шутер для мобильных. Обещать никто ничего не будет, но если вы склонны верить людям, то лучше уж поддержать соло-разработчика, чем бездушные корпорации.
Внутри там, конечно, чистая Корея, зато красиво.
Все игры красивые, все игры разнообразные, но не забывайте, что Unreal Engine 4 — это не единственный движок, с которым вы получаете крутую картинку. Та же Black Desert Mobile, которая уже вышла в режиме пробного запуска, а 12 декабря станет доступна во всем мире, создана на собственном движке разработчика, и претендует на звание одной из самых красивых мобильных MMORPG. И кто знает, что нас ждет в скором будущем?
Переход на UNIGINE с Unreal Engine 4: гайд для программистов
Написание игровой логики, триггеры, ввод, рейкастинг и другое.
Специально для тех, кто ищет альтернативу Unreal Engine или Unity, мы продолжаем цикл статей про безболезненный переход на UNIGINE с зарубежных движков. В третьем выпуске рассмотрим миграцию с Unreal Engine 4 с точки зрения программиста.
Общая информация
Игровая логика в проекте на Unreal Engine 4 реализуется с помощью классов C++ или Blueprint Visual Scripting — встроенной системы визуального нодового программирования. Редактор Unreal Engine 4 позволяет создавать классы при помощи встроенного мастера классов (Class Wizard), выбрав нужный базовый тип.
В UNIGINE вы можете создавать проекты, используя C++ и C# API. При создании проекта просто выберите желаемое API и систему сборки:
В данной статье в основном затронем программирование на C++, т.к. полноценное программирование в Unreal Engine 4 возможно именно на этом языке.
Для C++ на выбор представлены готовые шаблоны проектов для следующих систем сборки:
Visual Studio 2015+;
Qt-based: Qt Creator, QMake или CMake (доступно для Engineering и Sim редакций SDK);
Далее просто выберите Open Code IDE, чтобы перейти к разработке логики в выбранной IDE для C++ проектов:
В Unreal Engine 4 достаточно унаследовать класс от базовых типов Game Framework, таких как AActor, APawn, ACharacter и т.п., чтобы переопределить их поведение в стандартных методах BeginPlay(), Tick() и EndPlay() и получить пользовательский actor.
Компонентный подход подразумевает, что логика реализуется в пользовательских компонентах, назначаемых на actor’ы — классах, унаследованных от UActorComponent и других компонентов, расширяющих стандартное поведение, определенное в методах InitializeComponent() и TickComponent().
В UNIGINE стандартный подход подразумевает, что логика приложения состоит из трех основных компонентов с разным циклом жизни:
Системная логика (исходный файл AppSystemLogic.cpp) существует в течение жизненного цикла приложения.
Логика мира (исходный файл AppWorldLogic.cpp) выполняется только когда мир загружен.
Логика редактора (исходный файл AppEditorLogic.cpp) выполняется только во время работы пользовательского редактора.
У каждой логики есть стандартные методы, вызываемые в основном цикле движка. К примеру, можно использовать следующие методы логики мира:
Следует учитывать, что логика мира не привязана к конкретному миру и будет вызвана для любого загруженного мира. Однако вы можете разделить специфичный для мира код между отдельными классами, унаследованными от WorldLogic.
Компонентный подход также доступен в UNIGINE при помощи встроенной компонентной системы. Логика компонента определяется в классе, производном от ComponentBase, на основе которого движок сгенерирует набор параметров компонента — Property, которые можно назначить любой ноде в редакторе. Каждый компонент также имеет набор методов, которые вызываются соответствующими функциями основного цикла движка.
Для примера создания простой игры с использованием компонентной системы, обратитесь к серии статей «Краткое руководство по программированию».
Сравним, как создаются простые компоненты в обоих движках. Заголовочный файл компонента в Unreal Engine 4 будет выглядеть примерно так:
И в UNIGINE. Компонентную систему сперва необходимо инициализировать в системной логике (AppSystemLogic.cpp):
И тогда можно написать новый компонент:
MyComponent.h:
MyComponent.cpp:
Теперь необходимо сгенерировать property для нашего компонента. Для этого:
Соберите приложение с помощью IDE.
Запустите приложение один раз, чтобы получить property компонента, сгенерированное движком.
Перейдите в редактор и назначьте сгенерированное property ноде.
Наконец, работу логики компонента можно проверить, запустив приложение.
Чтобы узнать больше о последовательности выполнения и о том, как создавать компоненты, перейдите по ссылкам ниже:
Немного про API
Все объекты в Unreal Engine 4 наследуются от UObject, доступ к ним возможен при помощи стандартных C++ указателей или умных указателей Unreal Smart Pointer Library.
В UNIGINE API есть система умных указателей, управляющих существованием нод и других объектов в памяти:
К примеру, вот как выглядит создание меша из ассета, редактирование, присвоение новой ноде типа ObjectMeshStatic и удаление:
Экземпляры пользовательских компонентов, как и любых других классов, хранятся при помощи стандартных указателей:
Типы данных
Тип данных
Unreal Engine 4
UNIGINE
Числовые типы
Стандартные типы C++:
signed и unsigned char, short, int, long, long long, float, double
Строки
FString MyStr = TEXT(«Hello, Unreal 4!»).
String str(«Hello, UNIGINE 2!»);
Контейнеры
TArray, TMap, TSet
for(NodePtr n : nodes)
Векторы и матрицы
UNIGINE поддерживает как одинарную точность (Float), так и двойную точность координат (Double), доступную в зависимости от редакции SDK. Почитайте про использование универсальных типов данных, подходящих под любой проект.
Основные примеры кода
Вывод в консоль
Unreal Engine 4
UNIGINE
UE_LOG(LogTemp, Warning, TEXT(«Your message»));
Log::message(«Debug info: %s\n», text);
Log::message(«Debug info: %d\n», number);
См. также:
Дополнительные типы сообщений в API класса Log.
Загрузка сцены
Unreal Engine 4
UNIGINE
Доступ к Actor / Node из компонента
Unreal Engine 4
UNIGINE
N odePtr owning_node = node;
См. также:
Видеоруководство, демонстрирующее, как получить доступ к нодам из компонентов с помощью C++ Component System.
Доступ к компоненту из Actor / Node
Unreal Engine 4:
Работа с направлениями
В Unreal Engine 4 компонент USceneComponent (или производный) отвечает за действия с трансформацией actor’а. Чтобы получить вектор направления по одной из осей с учетом ориентации в мировых координатах, можно использовать соответствующие методы USceneComponent (GetForwardVector()) или AActor (GetActorForwardVector()).
В UNIGINE трансформация ноды в пространстве представлена ее матрицей трансформации (mat4), а все основные операции с трансформацией или иерархией нод доступны при помощи методов класса Node. Такой же вектор направления в UNIGINE получается с помощью метода Node::getWorldDirection():
Unreal Engine 4
UNIGINE
FVector forward = MyActor->GetActorForwardVector();
FVector up = MyActor->GetActorUpVector();
FVector right = MyActor->GetActorRightVector();
FVector CurrentLocation = MyActor->GetActorLocation();
CurrentLocation += forward * speed * DeltaTime;
mat4 t_local = node->getTransform();
mat4 t_world = node->getWorldTransform();
vec3 pos_world = node->getWorldPosition();
vec3 forward = node->getWorldDirection(Math::AXIS_Y);
vec3 right = node->getWorldDirection(Math::AXIS_X);
vec3 up = node->getWorldDirection(Math::AXIS_Z);
node->translate(forward * speed * Game::getIFps());
См. также:
Более плавный игровой процесс с DeltaTime / IFps
В Unreal Engine 4, чтобы гарантировать, что определенные действия выполняются за одно и то же время независимо от частоты кадров (например, изменение положения один раз в секунду и т. д.), используется множитель deltaTime (время в секундах, которое потребовалось для завершения последнего кадра), передаваемый методу Tick(float deltaTime). То же самое в UNIGINE называется Game::getIFps():
Unreal Engine 4
UNIGINE
void AMyActor::Tick(float deltaTime)
node->rotate(0, 0, speed * Game::getIFps());
Рисование отладочных данных
Unreal Engine 4:
В UNIGINE за вспомогательную отрисовку отвечает синглтон Visualizer:
Примечание. Visualizer также можно включить с помощью консольной команды show_visualizer 1.
См. также:
Все типы визуализаций в API класса Visualizer.
Поиск Actor / Node
Unreal Engine 4:
Приведение от типа к типу
Классы всех типов нод являются производными от Node в UNIGINE, поэтому чтобы получить доступ к функциональности ноды определенного типа (например, ObjectMeshStatic), необходимо провести понижающее приведение типа — Downcasting (приведение от базового типа к производному), которое выполняется с использованием специальных конструкций. Чтобы выполнить Upcasting (приведение от производного типа к базовому), можно как обычно просто использовать сам экземпляр:
Unreal Engine 4
UNIGINE
UPrimitiveComponent* Primitive = MyActor->GetComponentByClass(UPrimitiveComponent::StaticClass());
USphereComponent* SphereCollider = Cast (Primitive);
// поиск ноды в мире по имени
NodePtr baseptr = World::getNodeByName(«my_meshdynamic»);
// приведение к производному типу с автоматической проверкой типа
ObjectMeshDynamicPtr derivedptr = checked_ptr_cast (baseptr);
ObjectMeshDynamicPtr derivedptr = static_ptr_cast (World::getNodeByName(«my_meshdynamic»));
// приведение к Object — базовому типу для ObjectMeshDynamic
ObjectPtr object = derivedptr;
// приведение к Node — базовому типу для всех объектов мира
NodePtr node = derivedptr;
Уничтожение Actor / Node
Unreal Engine 4
UNIGINE
// уничтожение actor’а с 1-секундной задержкой
node.deleteLater(); // рекомендуемый способ уничтожить ноду
//вызов будет произведен между кадрами
node.deleteForce(); // форсированное удаление, может быть небезопасным
Для выполнения отложенного удаления ноды в UNIGINE можно создать компонент, который будет отвечать за таймер и удаление.
Создание экземпляра Actor / Node Reference
За создание нового экземпляра actor (Spawning) отвечает метод UWorld::SpawnActor():
В Unreal Engine 4 клонировать существующий actor можно следующим образом:
В UNIGINE используйте Node::clone() для клонирования ноды, существующей в мире, и World::loadNode для загрузки иерархии нод из ассета .node. В этом случае на сцену будет добавлена вся иерархия нод, которая была сохранена как Node Reference. Вы можете обратиться к ассету либо через параметр компонента, либо вручную, указав виртуальный путь к нему:
Для параметра компонента также необходимо указать ассет .node в редакторе:
Еще один способ загрузить содержимое ассета *.node — создать NodeReference и работать с иерархией нод как с одним объектом. Тип Node Reference имеет ряд внутренних оптимизаций и тонких моментов (кэширование нод, распаковка иерархии и т.д.), поэтому важно учитывать специфику работы с этими объектами.
Запуск скриптов в редакторе
Unreal Engine 4 позволяет расширять функциональность редактора с помощью Blueprint/Python скриптов.
UNIGINE не поддерживает выполнение логики приложения на C++ внутри редактора. Основной способ расширить функциональность редактора — плагины, написанные на C++.
Для быстрого тестирования или автоматизации разработки можно написать логику на UnigineScript. UnigineScript API обладает только базовой функциональностью и ограниченной сферой применения, но доступен для любого проекта на UNIGINE, включая проекты на C++.
Создав скрипт мира:
Создайте ассет скрипта .usc.
Определите в нем логику. При необходимости добавьте проверку, загружен ли редактор:
Выделите текущий мир и укажите для него сценарий мира. Нажмите Apply и перезагрузите мир.
Проверьте окно консоли на наличие ошибок.
После этого логика скрипта будет выполняться как в редакторе, так и в приложении.
Используя WorldExpression. С той же целью можно использовать ноду WorldExpression, выполняющую логику при добавлении в мир:
Напишите логику на UnigineScript в поле Source:
Проверьте окно Console на наличие ошибок.
Логика будет выполнена немедленно.
Триггеры
Unreal Engine 4:
В UNIGINE Trigger — это специальный тип нод, вызывающих события в определенных ситуациях:
WorldTrigger вызывает коллбэк, когда какая-либо нода (независимо от типа) попадает внутрь или за его пределы.
PhysicalTrigger вызывает коллбэк, когда физические объекты попадают внутрь или за его пределы.
Важно! PhysicalTrigger не обрабатывает события столкновения, для этого тела и сочленения предоставляют свои собственные события.
WorldTriger — наиболее распространенный тип триггера, который можно использовать в игровой логике:
Обработка ввода
Unreal Engine 4:
Также можно использовать синглтон ControlsApp для обработки привязок элементов управления к набору предустановленных состояний ввода. Чтобы настроить привязки, откройте настройки Controls в редакторе:
Проверка пересечения луча с геометрией (Raycast)
Unreal Engine 4:
В UNIGINE то же самое достигается с помощью Intersections:
Напоминаем, что получить доступ к бесплатной версии UNIGINE 2 Community можно, заполнив форму на нашем сайте.
Все комплектации UNIGINE:
Community — базовая версия для любителей и независимых разработчиков. Достаточна для разработки видеоигр большинства популярных жанров (включая VR).
Engineering — расширенная, специализированная версия. Включает множество заготовок для инженерных задач.
Sim — максимальная версия платформы под масштабные проекты (размеров планеты и даже больше) с готовыми механизмами симуляции.
Мультиплеер в Unreal Engine: Игровой процесс
В данной статье я хочу разобрать мультиплеер в Unreal Engine в контексте игрового процесса.
Опираться я буду на всеобщеизвестный unreal network compendium, приправленный моим собственным опытом.
Основная часть
Репликация
Во первых: Сервер может выступать как dedicated, т.е удаленный частный сервер, собранный их исходников. На нем отсутствует какая либо визуальная часть, вроде VFX эффектов, виджетов, ALocalPlayer и т.д.
А так же сервером может выступать и клиент, тот же игрок, к которому подключились другие игроки (будь то локальная или глобальная сеть). У него, как вы понимаете, присутствует все то, то есть и у других игроков, за одним исключением.
Во вторых: Данные нужно синхронизировать меж несколькими клиентами, чтобы создавалась иллюзия, что они играют друг с другом (впал в депрессию после осознания). Центром для синхронизации выступает как раз таки сервер. Он производит все необходимые просчеты для их дальнешей репликации клиентам. Кроме того, выполнение важной игровой логики на сервере предотврощает читерство, т.е подмену каких либо переменных (здоровье, урон и пр.), хотя, во всяком случае, эти выводы следуют друг из друга. Но какие данные можно синхронизировать, а какие нет?
В Network Compendium есть великолепное изображение сей логики:
Рис. 1. Схема репликации классов.
Как я уже высказался: AGameMode присутсвует сугубо на сервере. В нем лежат «правила игры».
И у сервера, и у клиентов есть:
На самом деле, все, что вы хотели бы показать другим игрокам. Самый банальный пример: Таблица счета из шутеров. Там отображаются убийства, ассисты, смерти. (отсылка на горячё любимый battlefield 2042). Тогда почему бы не хранить все счетчики убийств, очки и пр. в APlayerState и не отображать их у каждого подключенного клиента?
P.S Вы не контролируете павна напрямую. Вы лишь отправляете на сервер запрос с тем, чтобы ваш павн совершил какое либо действие.
Далее, мы медленно приближаемся к другому важному моменту:
У всех AActor’ов есть свой «владелец». На рисунке представлено, что APlayerController есть на сервере и у клиента, который этим контроллером владеет. (Это как раз таки отсылает нас к нужде контролировать павна лишь с помощью вызовов на сервер) Попытка получить
Теперь про контроль: все Actor’ы имеют свою роль, в зависимости от того, на какой машине они находятся. На машине сервера (Authority),для каждого actor’а будет верно следующее равенство:
Для клиента же, попытка вызвать эту же функцию у реплицированного с сервера actor’а даст следующий результат:
И наконец: для всех pawn’ов, которых контролирует клиент, т.е для которых он вызывал APlayerController::Possess(Pawn); на клиенте будет верно следующее:
Если с первым и вторым все очевидно, то с третьим выходит так, что игрок во время владения юнитом посылает бесконечный инпут со своего контроллера, который так же необходимо передавать на сервер, и тут может быть большое кол-во потерь пакетов, тормозов и пр. По этой причине, на юнитах с такой ролью используется экстраполяция положения в пространстве с учетом его ускорения для этого юнита. Это очень сильно сопряжено с понятием RPC вызовов, о которых ниже.
И последнее: виджеты.
Ни серверу, ни другим клиентам не интересны ваши виджеты, как они выглядят и что они отображают. Их интересуют лишь сухие данные, которые эти виджеты представляют. Из этих соображений бессмысленно пытаться передать указатель на виджет серверу, т.к у него этого виджета нет.
Дополнение:
Рис 2. Схема репликации из Network Compendium.
RPC функции и репликация
Для синхронизации сервера и клиента у UE есть следующие инструменты:
Рассмотрим на примерах:
Рис. 3 Примеры RPC функций.
Необходимо указывать один из них.
Client
Server
Multicast
P.S Реализация RPC функции должна быть помечена в конце _Implementation.
Кроме того, есть еще один модификатор : WithValidation.
Прежде чем вызывать необходимую функцию, сначала будет выполнена проверка, заключенная в функции, которая была помечена как _Validate.
В Network Compendium если отличная репрезентация того, как работают RPC вызовы с разных машин:
Рис. 4. Вызов RPC функций с сервера.
Рис. 5. Вызов RPC функций с клиента ч. 1.
Рис. 6. Вызов RPC функций с клиента ч. 2.
Как уже было сказано ранее, репликация подразумевает, что какой либо параметр (переменная) будет полностью копировать состояние той же переменной на сервере.
Для того чтобы включить это репликацию, добавим следующие модификаторы:
ReplicatedUsing может быть использован, например, в случае, если переменная HealthPoints изменилась, то на клиентах мы бы заспавнили виджет, оповещающий об этом событии.
Иначе говоря, функция, привязанная модификатором ReplicatedUsing, обязана оповещать клиентов об изменении переменной, и как-то на это реагировать.
Теперь, собственно, одна из причин, почему только поля AActor’ов могут быть реплицированы:
У каждого AActor’а есть виртуальная функция:
Которая отвечает за Репликацию непосредственно.
Последний шаг для включения репликации переменной:
Кроме того, у репликации есть условия. Репликация с DOREPLIFETIME выполняется без каких либо условий.
Кроме SkipOwner есть следующие условия:
Заключение
Вот пожалуй и все. Есть еще несколько вещей, которые можно было бы рассказать про игровой процесс, однако статья получилась и так весьма громоздкой, посему, если вы пожелаете, напишу продолжение.
Спасибо что читали!
Внизу я оставлю немного источников, помимо тех, что обозначил в статье, дабы вы могли получше разобраться с механизмом работы мультиплеера.
UE4 для Unity разработчиков: создание 2D-игр
Продолжая сравнение топовых 3D-движков — Unreal Engine 4 и Unity, на этот раз мы рассмотрим их достоинства и недостатки при разработке 2D-проектов. Мы выясним, чем хорош Unreal для 2D, как организована работа с основными элементами двухмерной игры и какими средствами можно реализовать 2D-персонажей со скелетной анимацией.
Мы уже сравнивали Unity 5 и UE4 применительно к 3D-играм. Если кратко, мы пришли к выводу, что Unreal крут и его вполне можно использовать для разработки качественных трёхмерных игр. Но какая ситуация складывается в мире 2D-игр? Сравним Unity 5 и Unreal Engine 4.16.
Unreal Engine 4 vs Hollow Knight (Unity)
Если популярность Unreal для 3D не вызывает сомнений, то, например, коммерческих 2D-проектов, сделанных на нём, практически нет. Поэтому возникает вопрос: стоит ли вообще использовать Unreal для 2D и не слишком ли он избыточен для подобных проектов?
Рассмотрим этот вопрос на примере игры Hollow Knight (на заднем плане скриншота). Она сделана на движке Unity, PC-версия занимает 8,5 Гб, весьма мощный проект. Если делать подобную игру на Unreal, runtime-библиотеки займут в сборке проекта около 100—200 Мб. Для масштабных проектов это не так страшно, ведь даже мобильные игры порой весят пару гигабайт.
Чем же нам может помочь Unreal при создании 2D-игры?
Преимущество Unreal’а в том, что он позволяет сделать игру на Blueprint’ах. Блупринт — это система средств визуального программирования, с которой вы можете создать игру целиком на визуальных схемах — без глубоких знаний какого-либо языка программирования.
Часто не только программисты, но и дизайнеры уровней, аниматоры, геймдизайнеры используют блупринты. Они встроены во все подсистемы движка, и их можно расширять C++ кодом.
Реализация управления игровым объектом через блупринт
Как вариант, если вы только начинаете создавать игры, попробуйте сделать первую игру именно в 2D, потому что она по определению проще 3D-игры. Для 2D потребуется меньше компонентов, сама игровая механика «плоская». Конечно, в таком проекте вы всё равно можете использовать 3D-модели в качестве фона, если понадобится. Начинающему разработчику проще разобраться в системе блупринтов, чем изучать язык C# для Unity или С++ для UE4.
Если вы уже пробовали Unreal, возможно, вам знакома система Unreal Gameplay Framework — это целый набор сущностей движка, от средств управления персонажем (player controller) до HUD’а, игрового интерфейса и анимации. Несмотря на то что набор 2D-компонентов немного отличается от тех, что используется для 3D, общие принципы работы в них несомненно присутствуют.
Также в Unreal есть прекрасный мультиплеер. Это встроенная в движок реализация высокоуровневого клиент-серверного взаимодействия, с помощью которой вы пишете сразу и клиентский код, и серверный. К слову, эта задача также решается средствами блупринтов. При этом вы можете собрать на движке выделенный сервер (dedicated server). В движке Unity подобной возможности нет. Кроме того, в редакторе удобно тестировать многопользовательские игры, запуская нужное количество экземпляров игры. Такой режим запуска не сильно отличается от обычного и не требует дополнительных затрат времени.
2D в Unity
Что нам даёт Unity для 2D-игр? Для начала — компонент Sprite Renderer, на котором основана игровая 2D-графика. Мы можем переносить спрайты из папки контента в сцену в редакторе, строить на основе них элементы уровня и игровые объекты. Сразу отметим, что в Unreal схожая механика редактирования сцен. Мы можем перетаскивать компонент спрайта в сцену, обычный drag-and-drop. Для реализации спрайтовой (покадровой) анимации Unity предлагает два способа:
Примечательная особенность Unity — возможность включить автоматическую упаковку используемых спрайтов в атласы. На этапе создания игры вы можете не переживать, что у вас много спрайтов, что надо их как-то компоновать для оптимизации. Правда, эта возможность по умолчанию отключена, скорее всего, для ускорения сборки проекта при разработке.
2D в Unreal
В Unreal Engine 4 создание проекта или прототипа часто начинается с выбора шаблона, поэтому рассмотрим этот шаг. Чтобы разработчикам было с чего начать, существует шаблон проекта 2D Side Scroller. Это аналог 3D шаблона Side Scroller, но графика в нём основана на стандартном плагине Paper2D. Он даёт нам поддержку 2D-спрайтов, т. е. тех самых основных графических элементов, из которых собирается игра.
Кроме спрайтов, есть анимационные клипы, они называются flipbook. Похоже на блокнот, когда мы рисуем по одному кадру на каждой странице, а потом быстро перелистываем, чтобы получилась движущаяся картинка. Флипбуки — средство простейшей двухмерной анимации. Их, как и спрайты, можно импортировать из программы Texture Packer, она позволяет настроить параметры компоновки текстурного атласа. Загрузив атлас в Unreal, мы получим каждый спрайт в виде отдельного ассета (Asset), который потом просто перетаскивается на сцену.
Здесь мы видим скриншот редактора с проектом 2D Side Scroller. В нем реализовано управление персонажем, взаимодействие персонажа с миром (физика) и переключение анимации. Несмотря на 2D графику, физика в проекте трёхмерная. Это связано с тем, что экспериментальная 2D-физика, реализованная на Box2D, есть только на платформе Windows. Из-за этого 2D-спрайты крепятся к трёхмерному физическому представлению. Подход немного странный, поэтому для персонажа PaperCharacter существует специальный флаг, который ограничивает его перемещение в заданной плоскости.
В движке Unity, в отличие от Unreal, элементы для 2D-физики полностью поддерживаются: есть коллайдеры, Rigid Body (твёрдые тела) и другие компоненты.
Создание 2D-уровней в Unreal
Обычно создание уровней реализуется переносом спрайтов на игровую сцену в редакторе. Но кроме этого, в Unreal есть интересный инструмент для редактирования уровней путём создания тайлов (Tile) и тайловых карт (TileMap).
Перед началом создания уровня мы заранее создаём набор элементов фиксированного размера (тайлов) и потом строим из них уровень, причём Unreal даёт нам необходимые средства редактирования тайлов и карт. Тайлы сочетают в себе как графическую часть, так и коллайдеры. Получившийся тайловый уровень автоматически оптимизирован в плане и физического представления, и рендеринга (оптимизация drawcall’ов).
Также Unreal позволяет связывать элементы уровня блупринтами. Можно безо всяких специальных инструментов реализовывать такие скрипты, как «При открытии этой двери появляется монстр» или «Если бочка взорвётся, то произойдёт какое-то событие».
Фрагмент «блупринта уровня» в UE4 с реализацией реакции на вхождение игрока в зону триггера
В Unity для реализации подобных связей нам пришлось бы создавать скрипт для каждой игровой механики взаимодействия либо скрипт управления для конкретного уровня. Для большого проекта пришлось бы строить систему кат-сцен или событий.
2D-персонажи в Unreal
Плагин Paper2D в Unreal предоставляет нам компонент PaperCharacter. Это персонаж, основанный на Flipbook, т. е. на системе спрайтовой покадровой анимации. У нас будет сам персонаж и его физическая модель в виде 3D-капсулы.
Для реализации олдскульного перемещения есть специальный флажок плоского основания капсулы. Он позволяет, можно сказать, вернуться в прошлое и сделать так, чтобы персонаж, стоя на самой границе ступеньки, не падал вниз. Этот момент может быть ключевым для некоторых игровых механик или особенностей уровня.
Old-school physics enabled!
А что насчёт персонажей со скелетом? Как в Unreal, так и в Unity 5 нет встроенного компонента для двумерной скелетной анимации, но мы этот вопрос рассмотрим дальше.
Spine для двухмерной скелетной анимации
Программа Spine — это комплексный пакет и SDK для создания двумерных персонажей. С помощью неё создаётся скелет персонажа, к нему крепятся спрайты, причем они необязательно прямоугольные: можно придать им нужную форму. Анимация получается скелетной, полностью аналогичной той, что используется для 3D-персонажей. В отличие от спрайтовой, она будет плавной за счёт того, что между ключевыми кадрами анимации выполняется интерполяция движения костей. Файлы анимации при этом весят меньше, плюс Spine позволяет привязывать к персонажам объекты.
Главное окно программы Spine с отображением костей персонажа
Таким образом, в Spine можно целиком создать персонажа, включая все его анимации и настройки привязки объектов. Кроме самой анимации, Spine даёт возможность крепить к любому моменту анимации события, например звуки шагов. Можно прямо в редакторе настроить их, посмотреть, как персонаж и его события сочетаются с анимацией, и экспортировать в подходящий для движка формат. При экспорте из программы мы получаем файл атласа с картинками — частями персонажа и JSON с анимацией и дополнительными настройками. У персонажа может быть несколько скинов, при этом скин может иметь дополнительные спрайты, привязанные к костям.
Также заявлено, что Spine поддерживает деформацию мешей. При перемещении костей спрайты могут тянуться костями. Это есть не во всех подобных пакетах, но возможность примечательная, так как может быть полезна для создания определённых персонажей. Также эта система позволяет блендить (смешивать) анимации между собой и управлять ими программно. Иными словами, создав одну анимацию бега, например, мы можем плавно перейти в анимацию ходьбы, и наоборот.
Из-за такого специфичного набора возможностей и многообразия поддерживаемых платформ сама система Spine часто идёт в отрыве от основной системы анимации в движке. Если в Unity, например, можно создать иерархию костей, которая изначально была в персонаже (это одной кнопкой делается), то в плагине для Unreal такого пока нет. Там можно создать специальные компоненты для привязки экторов к костям. Мы задаём, например, название кости, и объект к ней привязывается.
Spine для Unreal Engine 4
В последних версиях Unreal была исправлена ошибка, которая мешала собираться плагину Spine’а, и сейчас его можно использовать. Все примеры работы со Spine реализованы на блупринтах, а доступ к API есть как из кода, так и из блупринтов. Например, есть примеры с движениями персонажа, блендингом анимации и воспроизведением звука по событиям анимации.
Также есть удобная привязка событий, вы можете привязать специальное событие к любому моменту анимации. События именованные, как и сами анимации, в Unreal можно легко привязать делегат события по названию и тут же реализовать реакцию игры на него.
Основной недостаток Spine в том, что система анимации на самом деле не связана с анриаловской. Всё, что нам дает Unreal (управление анимацией через Animation Blueprint, различные схемы блендинга, редакторы анимации и их последовательностей), — всё это мы не можем использовать для Spine и 2D-анимации. Придётся управлять анимацией и её переключением вручную, в функции Tick, и скорее всего, для этого понадобятся дополнительные таймеры и состояния. Чем-то такой подход напоминает старую систему анимации в Unity 4, в которой приходилось пользоваться функциями Play, Blend и CrossFade в компоненте Animation.
Оптимизация 2D в Unreal Engine 4
Типичный способ оптимизации — упаковка спрайтов уровня в атласы. Это избавляет нас от переключения текстур. В Unreal Engine, если вы перетащите на сцену даже несколько одинаковых спрайтов, получится столько же drawcall’ов. Встроенная автоматическая оптимизация рендеринга для 2D отсутствует, поэтому имеет смысл выделять некоторые части уровней, группировать с помощью инструмента MergeSprites. Команда Merge Sprites аналогична Merge Actors для 3D-объектов, она объединяет несколько объектов в один. Merge Sprites также объединяет коллизии объектов.
Редактирование геометрии спрайта
Также в движке есть инструмент редактирования геометрии спрайтов. Как показано на картинке, он позволяет вместо стандартной прямоугольной формы спрайта задать свою. Например, вырезав прозрачность, можно уменьшить overdraw и тем самым увеличить производительность.
Как и в трёхмерной графике, в 2D актуальна оптимизация через material instance. Можно по привычке, как в Unity, копировать материалы, но в Unreal так делать не стоит. Лучше делать один или несколько базовых материалов, которые фактически описывают шейдер рендеринга, а на его основе сделать инстансы материала с набором изменяемых параметров (цветов, текстур и констант). За счёт этой оптимизации движку не нужно будет создавать большой набор скомпилированных версий шейдеров, что сэкономит размер проекта после сборки, освободит некоторые количество оперативной и видеопамяти, повысит производительность.
2D-ассеты (Marketplace)
Ускорить разработку прототипа игры зачастую позволяют ассеты, которые можно приобрести в магазине. По аналогии с Unity Asset Store у Epic Games есть Marketplace для UE4. 2D-ассетов в нём мало, но они есть. В основном это наборы арта: уровни и персонажи. Иногда встречаются шаблоны целых проектов типа платформеров, раннеров и т. п. Их можно использовать как основу проекта или для создания прототипов. Но, к сожалению, нет специальных инструментов для 2D-проектов, а также эффектов, ориентированных на 2D. В этом плане в Unity Asset Store всё гораздо лучше: больше возможностей, даже систем для 2D-анимации штук пять: Puppet2D, Anima2D и т. д.
Примечательные фичи UnrealEngine 4 в 2D
Мне удалось найти в анриале и несколько примечательных фич. Например, в спрайтовой анимации Paper2D flipbook можно для каждого кадра задать свой физический коллайдер. То есть вы сможете одним таким ассетом сделать необычный объект, например магические ворота, которые открываются и закрываются анимацией. Наверно, менять в каждом кадре collision не очень оптимально, но тем не менее такая возможность есть.
На скриншоте трёхмерного персонажа окружают спрайты, отбрасывающие реалистичные тени. На самом деле они двумерные, и можно, не создавая специальных инструментов и костылей, включить от спрайтов 2D-тени и даже реакцию на освещение. Это делается заменой материала, используемого для спрайта. Для этого есть материалы Sprite Lit и Sprite Lit Shadows. Это может пригодиться, если ваша 2D-игра содержит в себе 3D-окружение, т. е. уровни трёхмерные, а сами персонажи при этом плоские. Например, в игре Ori And The Blind Forest есть такие элементы.
Также можно в настройках проекта включить специальную сортировку спрайтов. Если у вас обычный 2D-проект с видом сбоку, то вам, вероятно, не очень важно, как производится сортировка. Какие-то спрайты вы можете просто отодвинуть на задний план. Но если у вас изометрическая игра и нужен порядок расположения динамических объектов, то, возможно, имеет смысл выставить ось сортировки в виде оси вверх, и тогда они автоматически сами будут сортироваться.
Я встречал Unity-проект, в котором подобная сортировка была сделана в скрипте для каждого объекта. В Unity есть параметр для сортировки спрайтов — sorting layer offset, и каждый скрипт каждый кадр рассчитывал величину смещения на основе текущих координат объекта. Конечно, такой способ не может не повлиять на производительность. Ось сортировки спрайтов решает подобную задачу одним кликом.
Производительность UE 4 на мобильных устройствах
Есть миф, что на UE4 плохая производительность. Но на самом деле на нём вполне можно создавать эпичные по своей красоте проекты, даже в 3D. Впрочем, как и во всех движках, производительность и оптимизация связаны между собой. Просто надо учитывать это при разработке и своевременно заниматься профайлингом и оптимизацией. Что касается 2D, некоторые моменты я уже перечислил. Кроме того, возможно, вы захотите некоторые 2D-спрайты рисовать через canvas. Многое зависит от контекста и проекта в целом.
UE4 vs Unity 5: 2D
Подведём итог. Стоит ли вообще использовать Unreal и какие фичи критичны для разработки 2D-проектов, а какие нет? Я составил список в порядке важности фич.
Фича | Unreal Engine 4 | Unity 5 |
---|---|---|
2D-физика | Только Windows | Да |
Батчинг спрайтов | Ручной | Автоматический |
Эффекты спрайтов | Нет | Да |
2D-инструменты в Store | Мало | Да |
Тени от спрайтов | Да | Нет |
Визуальный «скрипт уровня» | Да | Нет |
Тайловый редактор уровней | Да | Нет |
Анимация модели столкновения | Да | Нет |
Рассмотрим каждый пункт немного подробнее.
2D-физика. С моей точки зрения, основная проблема заключается в том, что в Unreal сейчас нет двумерной физики для большинства платформ, существует лишь экспериментальная реализации для Windows. Пока на большинстве платформ нет 2D-физики, это будет причинять боль и физику придётся делать через 3D-компоненты и искусственные ограничения.
Батчинг 2D-спрайтов. В Unity не пишется количество drawcall’ов для 2D-спрайтов, если мы добавим в сцену много 2D-спрайтов, это не будет отображено в окне статистики, но производительность говорит сама за себя — движок их всё-таки объединяет в группы при рендеринге. А в Unreal придётся использовать инструмент Merge Sprites или, возможно, ждать, когда появится более хорошее решение, чем существующая система Paper2D.
Эффекты спрайтов. В Unity можно найти различные ассеты для эффектов на спрайтах, в Unreal Engine этого пока нет.
2D-инструменты в Store. Для Unity есть различные инструменты в Store, т. е. и плагины, и расширения, и эффекты. В Unreal Marketplace, к сожалению, только 2D-проекты и их шаблоны, инструментарий почти отсутствует.
Дальше идут фичи, которые понадобятся не всякому проекту, например тени от спрайтов. Преимуществом Unreal можно считать визуальный скриптинг, в том числе блупринт логики уровня — Level Blueprint. Тайловый редактор уровней пригодится, если вы захотите сделать в Unreal олдскульную игру с «пиксельной» графикой. Почему бы и нет? И анимация модели коллизий — тоже интересная экспериментальная фича.
Заключение
Если подвести итог: в Unreal есть самые базовые инструменты для 2D, несмотря на наличие некоторых интересных фич. Если вы захотите использовать скелетную анимацию, вам придётся дополнительно изучать сторонние инструменты. Увы, пока нет удобства, аналогичного тому, которое Unreal предлагает в 3D. Основная проблема Unreal — отсутствие встроенной 2D-физики на всех платформах, кроме Windows.
Скорее всего, для большинства 2D-проектов разумнее взять какой-нибудь другой движок вместо Unreal. Но это всегда зависит от самого проекта, от ваших желаний, целей, потребностей.
Создание Survival Horror в стиле RE2 на Unreal Engine и С++. Базовая настройка и импорт ассетов
С данного момента мы начинаем создавать что-то вроде Survival Horror в стиле Resident Evil 2 Remake, используя Unreal Engine 4 и С++.
Данные уроки буду публиковать в двух форматах(видео и статьи). Т.е. все что я буду показывать в видео, я буду дублировать в виде статей и публиковать в группе VK и на канале Яндекс.Дзен.
Также, на все функции и инструменты Unreal Engine, которые мы будем использовать, я буду оставлять ссылки на документацию в описании под видео и в статьях соответственно.
Начнем, конечно, с создания проекта и его базовой настройки. Добавим необходимые ассеты и познакомимся с миграцией контента.
О том, как скачать и установить Unreal Engine можно узнать из этого видео.
Создание проекта
Итак, Unreal Engine скачан и установлен. Можно приступать к созданию проекта.
Для создания проекта запустим соответствующую версию(В моем случае 4.27.2), нажав на желтую кнопку «Запустить».
Появится окно со всеми созданными проектами, которые можно открыть, а также можно создать новый проект нужной категории. Выбираем «Games» и жмем «Next».
В следующем окне можно выбрать один из стандартных шаблонов Unreal Engine, где будет реализована базовая игровая логика(передвижение, управление камерой и т.д.). Мы выбираем пустой проект «Blank» и жмем «Next».
В последнем окне можно выбрать некоторые настройки проекта. Можно выбрать тип проекта(С++ или Blueprints), качество графики, для какой платформы создается проект, включить рейтрейсинг и добавлять стартовый контент или нет. Также можно указать директорию где будет храниться проект и его имя. Выставляем настройки как на скриншоте и жмем «Create Project».
После компиляции появится окно редактора, а также запустится редактор кода(по умолчанию Microsoft Visual Studio), в моем случае JB Rider.
После этого в основной папке создам папку с названием «_Content» и покрашу ее в красный цвет. Здесь будут храниться все ассеты, которые мы будем добавлять в проект. Нижнее подчеркивание в начале названия я сделал для своего удобства, чтобы эта папка всегда была вверху.
Создам еще одну папку «Maps». Здесь будут лежать все уровни.
Сразу сохраним в эту папку текущий уровень, нажав File->Save Current.
Выбираем куда нужно сохранить уровень и меняем имя. Жмем «Save».
Теперь сделаем так, чтобы текущий уровень всегда запускался при запуске редактора и игры. Это делается в настройках проекта Edit->Project Settings.
В настройках переходим в категорию Maps&Modes.
Выставляем наш уровень в Defaults Maps.
Теперь добавим необходимые ассеты для проекта.
Переносим их в папку «_Content«
Эта папка сразу отобразится у нас в редакторе
Также, я хочу добавить стандартный манекен Unreal Engine.
Для этого добавим в наш проект шаблон от третьего лица. Чтобы это сделать, необходимо нажать на зеленую кнопку Add/Import.
В появившемся меню выбираем Add Feature or Content Pack
Откроется окно где нужно выбрать шаблон от третьего лица и добавить в наш проект.
В структуре проекта появятся новые папки
В папке «Mannequim» находим папку «Character» и перетаскиваем в «_Content»
В появившемся окне выбираем Move Here
Выделенные папки удаляем, они нам не нужны
Теперь нужно для ранее добавленных анимаций добавить скелет манекена, который мы только что добавили.
Переходим в папку Animations->InPlace и выбираем все анимации. Щелкаем по любой из них правой кнопкой мыши и находим Retarget sleleton on existing Anim Assets
В появившемся окне нужно выбрать скелет манекена и нажать на кнопку Retarget
Теперь, если открыть любую анимацию двойным щелчком, она будет проигрываться используя выбранный скелет манекена.
Тоже самое нужно проделать с анимациями, вернее позами, которые мы будем использовать для Aim Offset. Они находятся в папке AimOffset.
Это я оставлю в качестве домашнего задания:)
На этом я заканчиваю с первой частью. Если вам понравился контент, то буду рад вашей подписке, лайку или комменту:)
Туториал по Unreal Engine. Часть 10: Как создать простой FPS
Unreal Engine изначально был создан для разработки FPS, поэтому вполне логично использовать его для создания такой игры. В этом туториале вы научитесь следующему:
Примечание: эта статья является десятой частью серии туториалов, посвящённых движку Unreal Engine:
Приступаем к работе
Скачайте заготовку проекта и распакуйте её. Перейдите в папку проекта и откройте BlockBreaker.uproject. Вы увидите следующую сцену:
Зелёная стена состоит из множества целей. Когда им наносят урон, они становятся красными. Когда их здоровье достигает нуля, они исчезают. Красная кнопка заново устанавливает все цели.
Для начала нужно создать Pawn игрока.
Создание Pawn игрока
Перейдите в папку Blueprints и создайте новый Blueprint Class. Выберите в качестве родительского класса Character и назовите его BP_Player.
Character — это разновидность Pawn, но с дополнительным функционалом, например, с компонентом CharacterMovement.
Этот компонент автоматически обрабатывает движение, например, ходьбу и прыжки. Мы просто вызываем соответствующую функцию, благодаря чему Pawn перемещается. В этом компоненте также можно задать переменные, такие как скорость ходьбы и прыжков.
Чтобы заставить Pawn двигаться, нам нужно знать, когда игрок нажимает клавишу движения. Для этого мы привяжем движение к клавишам W, A, S и D.
Примечание: если вы незнакомы с привязками, то можете прочитать о них в части туториала, посвящённой Blueprints. Привязкой клавиш мы определяем, какие клавиши будут выполнять действие.
Создание привязок движения
Выберите Edit\Project Settings и откройте настройки Input.
Создайте два Axis Mappings под названием MoveForward и MoveRight. MoveForward будет управлять движением вперёд и назад. MoveRight — движением влево и вправо.
Для MoveForward замените клавишу на W. После этого создайте ещё одну клавишу и выберите S. Измените Scale для S на -1.0.
Примечание: если вы хотите подробнее узнать о поле Scale, прочитайте часть туториала, посвящённую Blueprints. В разделе «Значение оси и масштаб ввода» говорится, что это и как этим пользоваться.
Позже мы будем умножать значение масштаба на вектор forward Pawn. Это даст нам вектор, направленный вперёд при положительном масштабе. Если масштаб отрицателен, то вектор будет направлен назад. С помощью получившегося вектора можно будет двигать Pawn вперёд и назад.
Теперь нам нужно сделать то же для движения влево и вправо. Измените клавишу для MoveRight на D. Затем создайте новую клавишу и выберите для неё A. Измените Scale для A на -1.0.
Теперь, когда мы настроили привязки, нам нужно использовать их для движения.
Реализация движения
Откройте BP_Player, а затем откройте Event Graph. Добавьте событие MoveForward (то, которое указано в списке Axis Events). Это событие будет выполняться в каждом кадре, даже если вы ничего не нажимаете.
Также оно будет подавать на выход значение Axis Value, которое равно заданным ранее значениям Scale. Оно будет подавать на выход 1 при нажатии на W и -1 при нажатии на S. Если не нажимать клавиши, то на выходе будет 0.
Далее нужно приказать Pawn двигаться. Добавьте Add Movement Input и соедините его следующим образом:
Add Movement Input будет получать вектор и умножать его на Scale Value. Это преобразует его в соответствующем направлении. Поскольку мы используем Character, то компонент CharacterMovement будет перемещать Pawn в этом направлении.
Теперь нам нужно указать направление движения. Так как мы хотим двигаться вперёд, то можем использовать Get Actor Forward Vector. При этом будет возвращаться вектор, направленный вперёд. Создайте его и соедините следующим образом:
Для проверки движения нужно задать Pawn по умолчанию в игровом режиме.
Задание Pawn по умолчанию
Нажмите на Compile и вернитесь в основной редактор. Откройте панель World Settings и найдите раздел Game Mode. Измените значение Default Pawn Class на BP_Player.
Примечание: если у вас нет панели World Settings, то перейдите в Toolbar и выберите Settings\World Settings.
Теперь при запуске игры вы автоматически будете использовать BP_Player. Нажмите на Play и воспользуйтесь клавишами W, A, S и D для движения по уровню.
Теперь мы создадим привязки для поворота головы.
Создание привязок обзора
Откройте Project Settings. Создайте ещё два Axis Mappings под названием LookHorizontal и LookVertical.
Замените клавишу для LookHorizontal на Mouse X.
Эта привязка будет выдавать положительное значение при перемещении мыши вправо, и наоборот.
Теперь изменим клавишу для LookVertical на Mouse Y.
Эта привязка будет выдавать положительное значение при перемещении мыши вверх, и наоборот.
Теперь нам нужно создать логику, чтобы смотреть вокруг.
Реализация обзора
Если у Pawn нет компонента Camera, то Unreal автоматически создаёт камеру за вас. По умолчанию, камера будет использовать поворот контроллера.
Примечание: если вы хотите узнать больше о контроллерах, то изучите наш туториал «Искусственный интеллект».
Несмотря на то, что контроллеры не являются физическими, у них всё равно есть свой поворот. Это значит, что можно направить взгляд Pawn и камеры в разных направлениях. Например, в игре от третьего лица персонаж и камера не всегда смотрят в одном направлении.
Для поворота камеры в игре от первого лица нам достаточно изменить поворот контроллерая.
Откройте BP_Player и создайте событие LookHorizontal.
Чтобы заставить камеру поворачиваться влево или вправо, нам нужно регулировать рыскание (yaw). Создайте Add Controller Yaw Input и соедините его следующим образом:
Теперь при горизонтальном движении мыши контроллер будет поворачиваться влево или вправо. Поскольку камера использует поворот контроллера, она тоже будет поворачиваться.
Повторите процесс для LookVertical, но замените Add Controller Yaw Input на Add Controller Pitch Input.
Если запустите игру сейчас, то заметите, что вертикальное движение камеры инвертировано. Это значит, что при движении мыши вверх камера будет смотреть вниз.
Если вы предпочитаете неинвертированное управление, то умножьте Axis Value на -1. Это инвертирует Axis Value, что инвертирует наклон контроллера.
Нажмите на Compile и нажмите Play. Оглянитесь вокруг с помощью мыши.
Создание оружия
Помните, что при создании Blueprint Class можно выбрать родительский класс? Можно так же выбирать в качестве родительских собственные Blueprints. Это полезно, когда имеются разные типы объектов, обладающие общим функционалом или атрибутами.
Допустим, нам нужно создать разные типы автомобилей. Можно создать базовый класс автомобиля, содержащий такие переменные, как скорость и цвет. Затем можно создать классы (дочерние), которые будут использовать в качестве родительского базовый класс автомобиля. Каждый дочерний класс будет содержать те же переменные. Теперь у вас есть простой способ для создания машин с разными значениями скорости и цвета.
Создание базового класса оружия
Вернитесь в основной редактор и создайте Blueprint Class типа Actor. Назовите его BP_BaseGun и откройте.
Создание дочернего класса оружия
Нажмите на Compile и вернитесь в основной редактор. Для создания дочернего класса нажмите правой клавишей мыши на BP_BaseGun и выберите Create Child Blueprint Class.
Назовите его BP_Rifle и откройте. Откройте Class Defaults и задайте переменным следующие значения:
Это значит, что максимальный путь каждой пули будет равен 5000. Если она попадёт в актора, то нанесёт 2 единицы урона. При стрельбе очередями интервал перед каждым выстрелом будет равен не менее чем 0.1 секунды.
Создание камеры
Откройте BP_Player и создайте компонент Camera. Назовите его FpsCamera.
Позиция по умолчанию находится довольно низко, из-за чего игрок может почувствовать себя маленьким. Измените location камеры FpsCamera на (0, 0, 90).
По умолчанию, компоненты Camera не используют поворот контроллера. Чтобы исправить это, перейдите в панель Details и включите Camera Settings\Use Pawn Control Rotation.
Задание местоположения оружия
Создание и прикрепление оружия
Найдите Event BeginPlay и создайте Spawn Actor From Class. Выберите для Class значение BP_Rifle.
Выбрав для переменной тип BP_BaseGun, мы создали большое «отверстие», подходящее под многие «фигуры».
Теперь присвоим EquippedGun значение Return Value Spawn Actor From Class.
Теперь создадим ссылку на GunLocation и соединим всё следующим образом:
Стрельба пулями
Трассировка прямых — это функция, получающая начальную и конечную точки (образующие прямую). Она проверяет каждую точку на прямой (от начала до конца), пока на что-нибудь не наткнётся. В играх для проверки попадания пули чаще всего используется такой способ.
Затем создайте два входа Vector и назовите их StartLocation and EndLocation. Они будут начальной и конечной точками трассировки прямых (которые мы будем передавать из BP_Player).
Трассировку прямых можно выполнять с помощью LineTraceByChannel. Этот нод проверяет попадания с помощью канала коллизий Visibility или Camera. Создайте его и соедините следующим образом:
Теперь нам нужно проверить, попадает ли во что-нибудь трассировка прямых. Создайте Branch и соедините его так:
При попадании Return Value будет выдавать на выход true, и наоборот.
Чтобы дать игроку наглядную обратную связь о том, куда попала пуля, можно использовать эффект частиц.
Создание частиц попадания пули
Сначала нам нужно получить местоположение попадания трассировки. Перетащите левой клавишей мыши Out Hit на граф. В меню выберите Break Hit Result.
Так мы создадим нод с разными контактами, относящимися к результатам трассировки прямой.
Создайте Spawn Emitter at Location и задайте для Emitter Template значение PS_BulletImpact. Затем соедините его Location с Location нода Break Hit Result.
Вот как это будет выглядеть:
Вызов функции Shoot
Для начала нам нужно создать привязку клавиш для стрельбы. Нажмите на Compile и откройте Project Settings. Создайте новую Axis Mapping под названием Shoot. Выберите для неё клавишу Left Mouse Button и закройте Project Settings.
Затем откройте BP_Player и создайте событие Shoot.
Чтобы проверить, нажимает ли игрок клавишу Shoot, нам достаточно проверить, равно ли значение Axis Value единице (1). Создайте выделенные ноды:
Затем создайте ссылку на EquippedGun и вызовите его функцию Shoot.
Теперь нам нужно вычислить начальную и конечную точки для трассировки прямой.
Вычисление точек трассировки прямой
Создайте ссылку на FpsCamera и соедините её с GetWorldLocation.
Затем соедините всё следующим образом:
Уменьшение частоты стрельбы
Замените раздел Branch на следующее:
Теперь добавим выделенные ноды:
Теперь мы научим цели и кнопку реагировать на пули. Это можно сделать, добавив им урон.
Применение урона
Каждый актор в Unreal имеет возможность получения урона. Однако вы можете выбирать сами, как актор будет на него реагировать.
Например, персонаж файтинга при получении урона будет терять здоровье. Однако некоторые объекты, например, воздушный шарик, могут не иметь здоровья. Тогда можно запрограммировать шарик, чтобы он взрывался при получении урона.
Для того, чтобы можно было управлять получением актором урона, нам сначала нужно применить урон. Откройте BP_BaseGun и добавьте Apply Damage в конце функции Shoot.
Теперь нам нужно указать, какому актору мы хотим наносить урон. В нашем случае это актор, в которого попадает трассировка прямой. Соедините Damaged Actor с Hit Actor нода Break Hit Result.
Наконец, нам нужно указать величину нанесённого урона. Получите ссылку на Damage и соедините её с Base Damage.
Теперь при вызове Shoot она будет наносить урон акторам, попавшим в трассировку прямой. Нажмите на Compile и закройте BP_BaseGun.
Теперь нам нужно обработать то, как актор получает урон.
Обработка урона
Сначала мы обработаем то, как урон получают цели. Откройте BP_Target и создайте Event AnyDamage. Это событие выполняется, когда актор получает урон, не равный нулю.
Теперь вызовите функцию TakeDamage и соедините контакты Damage. Это вычтет здоровье из переменной Health цели и обновит цвет цели.
Теперь, когда цель получает урон, она теряет здоровье. Нажмите на Compile и закройте BP_Target.
Теперь нам нужно обработать то, как получает урон кнопка. Откройте BP_ResetButton и создайте Event AnyDamage. Затем вызовите функцию ResetTargets.
Это будет восстанавливать все цели при получении урона кнопкой. Нажмите на Compile и закройте BP_ResetButton.
Куда двигаться дальше?
Готовый проект можно скачать отсюда.
В технодемо на Unreal Engine 5 показали прогулки по лесу нового поколения
Всё больше студий разработки игр переходят на Unreal Engine 5. И если есть сомнения в целесообразности использования движка, то можно познакомиться ещё с одним технологическим демо.
На этот раз возможности Unreal Engine 5 представлены компанией MAWI United GmbH. Команда подготовила процедурно сгенерированный лес, разработанный на основе фотограмметрических сканов. Демоверсия Broadleaf Forest, которую можно скачать по ссылке, использует новейшее решение Epic Games по глобальному освещению, технологию Lumen. В демо можно свободно перемещаться по примерно одному квадратному километру лесного массива.
Вероятно, такого визуального качества, как в технодемо на Unreal Engine 5 от MAWI United, игроки вряд ли увидят в течение нескольких лет. Хотя бы из-за того, что разработчики продолжают выпускать игры для PS4 и Xbox One. Также стоит помнить, что вычислительная мощность аппаратного обеспечения используется в играх и другими элементами (например, вычислениями, связанными с работой искусственного интеллекта или продвинутой физикой), а не только при простом рендеринге 3D-объектов.
\u0410 \u043f\u0442\u0438\u0446\u0430 \u043d\u0430 \u0433\u043e\u043b\u043e\u0432\u0435 \u0441\u0438\u0434\u0438\u0442? «>,»type»:»html»>],»commenter_type»:»common_user»,»commenter_id»:5001250,»commenter_name»:»marauderfsb»,»avatar_html»:»
\u041e\u0431\u0438\u0434\u043d\u043e \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u044e\u043d\u0438\u0442\u0438 \u0445\u0443\u0439 \u043a\u043b\u0430\u043b\u0438 \u043d\u0430 \u0441\u0432\u043e\u0439 \u0434\u0432\u0438\u0436\u043e\u043a, \u0432\u0441\u0435 \u0447\u0442\u043e \u043e\u043d\u0438 \u0434\u0435\u043b\u0430\u044e\u0442, \u044d\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0435\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c.
\u042e\u043d\u0438\u0442\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u043d\u0430 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043d\u0430 \u043d\u0435 \u0443\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0438\u0435 \u043a\u0440\u0430\u0441\u043e\u0442\u044b, \u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0443\u0436\u0435 \u0437\u0430\u0431\u044b\u043b\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a, \u043d\u0435 \u0442\u043e \u0447\u0442\u043e \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438, \u0430 \u0434\u0430\u0436\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0434\u0435\u043c\u043e-\u043f\u0440\u0435\u0432\u044c\u044e-\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e-\u0438\u0433\u0440\u0443 \u0441\u0432\u043e\u0435\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430 \u0434\u043b\u044f \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u043c\u043e\u0433\u0443\u0442. «>,»type»:»html»>],»commenter_type»:»common_user»,»commenter_id»:2002919,»commenter_name»:»mepew»,»avatar_html»:»
\u0412\u043e \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u043b\u0435\u0441, \u0440\u0430\u0441\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0430 \u0442\u043e \u0432\u0441\u0451 \u043f\u0443\u0441\u0442\u044b\u043d\u0438, \u043a\u0430\u043c\u043d\u0438, \u043f\u0435\u0441\u043e\u043a. \u041d\u043e \u0432\u0441\u0451 \u0436\u0435 \u043b\u0435\u0441 \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0439, \u043a\u0430\u043a\u043e\u0439 \u0442\u043e \u043d\u0435 \u0436\u0438\u0432\u043e\u0439, \u043d\u0435\u0442 \u043f\u043e\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0439 \u043e\u0442 \u0432\u0435\u0442\u0440\u0430 \u0438 \u0444\u0438\u0437\u0438\u043a\u0438. \u0412\u0440\u043e\u0434\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \»\u043d\u0430\u043d\u0438\u0442\» \u043f\u043e\u043a\u0430 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u043d\u044b\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438! \u041d\u043e \u0432\u0441\u0451 \u0436\u0435 \u0444\u043e\u0442\u043e\u0440\u0435\u0430\u043b\u0438\u0437\u043c \u043d\u0430 \u043b\u0438\u0446\u043e, \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u043f\u0430\u0443\u0437\u0443 \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043f\u0443\u0442\u0430\u0442\u044c \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0435\u0439, \u043a\u043b\u0430\u0441\u0441! «>,»type»:»html»>],»commenter_type»:»common_user»,»commenter_id»:2000978,»commenter_name»:»Ayal Popov»,»avatar_html»:»
Создание игры на Unreal Engine 4 за 150 часов (видео + исходники)
3 часа каждый) на Unreal Engine 4. Проект я делал в прямом эфире только на стримах раз в неделю (в общей сложности ушел год), попутно отвечая на вопросы пользователей.
Сам проект не предназначался как коммерческий. Целью я ставил на практике показать всю сложность разработки игр, а именно такие проблемы, как:
В конце всей серии стримов у нас получился играбельный прототип “Сурвайвл” шутера. Те, у кого стакан наполовину полон, смогут даже назвать это пре-альфой без сюжета.
Если вам интересны подробности проекта, записи стримов, исходники и прочее, читайте далее.
Весь проект был реализован на визуальной системе программирования, под названием “Блупринты”. И конечно многие спецы могут назвать её ребяческой, разработать на ней можно спокойно даже относительно крупный проект. Более того, это можно сделать относительно быстро, как мы уже смогли доказать.
Сразу хочу ответить на вопрос: «Почему Блупринты, а не С++?«. Ну во первых, когда я начинал серию, плюсы я почти не знал. Хотя я и сейчас подобный сингл делал бы на БП. Во вторых, БП почти не уступают плюсам в нашем случае, но при этом дают ряд возможностей: Не позволяют наделать множество ошибок, возможных с плюсами, не приходится отвлекаться между БП и С++, понятнее новичкам. Да и они в нашем случае не намного медленнее, учитывая тот факт, что почти вся логика построена на событиях.
Мы так же успели немного поработать над графикой. К сожалению, ассеты делать времени у нас не было, поэтому мы часть оставили пустышками, часть сделали прямо в редакторе из примитивов, а некоторый контент позаимствовали из бесплатных демок Epic Games. Тем не менее, что-то успели сделать и сами, например систему дня и ночи, постобработку для воды и некоторые материалы объектов сцены.
В планы моих стримов так же стояли и проблемы, которые могут возникнуть при разработке. Их я специально решал в прямом эфире, дабы не только показать, с чем могут столкнуться юные разработчики, но и как отлаживать свой код, искать баги и писать свой код так, что бы все это дело можно было делать в два раза быстрее. Конечно опыта в программировании у меня не десятки лет, и это сказывалось на том, какие порой глупые ошибки я делал. Да и уверен, что многие разработчики могут оспорить множество моментов в процессе написания игры.
Естественно, полноценной игрой это вряд ли можно назвать, так как нету ни сюжета, ни цели в игре — только чистая механика. Тем не менее, я считаю, что результатом можно гордится и он вполне отражает то, для чего задумывался весь проект.
Впрочем, говорить о проекте можно бесконечно. И чтобы не превращать статью в книгу, предлагаю ознакомиться с игрой и возможностями по видео. А тем, кому стало действительно интересно, чуть ниже сможете найти записи всех стримов, ссылки на исходники и билд игры.
→ Исходники на Git (загрузка ZIP архивом не работает, архив почему-то поврежден.)
→ Исходники на ЯДиск (Лицензия та же, что и в исходниках)
→ Билд игры
В будущем я и дальше планирую проводить подобные стримы. Например на очереди у нас стрим по мультиплеерному шутеру, а затем стратегия.
[1] Создание Survival Horror в стиле RE2 на Unreal Engine и С++. Базовая настройка и импорт ассетов
С данного момента мы начинаем создавать что-то вроде Survival Horror в стиле Resident Evil 2 Remake, используя Unreal Engine 4 и С++.
Данные уроки буду публиковать в двух форматах(видео и статьи). Т.е. все что я буду показывать в видео, я буду дублировать в виде статей и публиковать в группе VK и на канале Яндекс.Дзен.
Также, на все функции и инструменты Unreal Engine, которые мы будем использовать, я буду оставлять ссылки на документацию в описании под видео и в статьях соответственно.
Начнем, конечно, с создания проекта и его базовой настройки. Добавим необходимые ассеты и познакомимся с миграцией контента.
О том, как скачать и установить Unreal Engine можно узнать из этого видео.
Итак, Unreal Engine скачан и установлен. Можно приступать к созданию проекта.
Для создания проекта запустим соответствующую версию(В моем случае 4.27.2), нажав на желтую кнопку «Запустить«.
Появится окно со всеми созданными проектами, которые можно открыть, а также можно создать новый проект нужной категории. Выбираем «Games» и жмем «Next«.
В следующем окне можно выбрать один из стандартных шаблонов Unreal Engine, где будет реализована базовая игровая логика(передвижение, управление камерой и т.д.). Мы выбираем пустой проект «Blank» и жмем «Next«.
В последнем окне можно выбрать некоторые настройки проекта. Можно выбрать тип проекта(С++ или Blueprints), качество графики, для какой платформы создается проект, включить рейтрейсинг и добавлять стартовый контент или нет. Также можно указать директорию где будет храниться проект и его имя. Выставляем настройки как на скриншоте и жмем «Create Project«.
После компиляции появится окно редактора, а также запустится редактор кода(по умолчанию Microsoft Visual Studio), в моем случае JB Rider.
После этого в основной папке создам папку с названием «_Content» и покрашу ее в красный цвет. Здесь будут храниться все ассеты, которые мы будем добавлять в проект. Нижнее подчеркивание в начале названия я сделал для своего удобства, чтобы эта папка всегда была вверху.
Создам еще одну папку «Maps«. Здесь будут лежать все уровни.
Сразу сохраним в эту папку текущий уровень, нажав File->Save Current.
Выбираем куда нужно сохранить уровень и меняем имя. Жмем «Save«.
Теперь сделаем так, чтобы текущий уровень всегда запускался при запуске редактора и игры. Это делается в настройках проекта Edit->Project Settings.
В настройках переходим в категорию Maps&Modes.
Выставляем наш уровень в Defaults Maps.
Теперь добавим необходимые ассеты для проекта.
Переносим их в папку «_Content«
Эта папка сразу отобразится у нас в редакторе
Также, я хочу добавить стандартный манекен Unreal Engine.
Для этого добавим в наш проект шаблон от третьего лица. Чтобы это сделать, необходимо нажать на зеленую кнопку Add/Import.
В появившемся меню выбираем Add Feature or Content Pack
Откроется окно где нужно выбрать шаблон от третьего лица и добавить в наш проект.
В структуре проекта появятся новые папки
В папке «Mannequim» находим папку «Character» и перетаскиваем в «_Content«
В появившемся окне выбираем Move Here
Выделенные папки удаляем, они нам не нужны
Теперь нужно для ранее добавленных анимаций добавить скелет манекена, который мы только что добавили.
Переходим в папку Animations->InPlace и выбираем все анимации. Щелкаем по любой из них правой кнопкой мыши и находим Retarget sleleton on existing Anim Assets
В появившемся окне нужно выбрать скелет манекена и нажать на кнопку Retarget
Теперь, если открыть любую анимацию двойным щелчком, она будет проигрываться используя выбранный скелет манекена
Тоже самое нужно проделать с анимациями, вернее позами, которые мы будем использовать для Aim Offset. Они находятся в папке AimOffset.
Это я оставлю в качестве домашнего задания:)
На этом я заканчиваю с первой частью. Если вам понравился контент, то буду рад вашей подписке, лайку или комменту:)
Все тоже самое но в виде видео:
Портирование игры на Unreal Engine 4
В этой статье расскажу про опыт переноса игры, созданной с использованием Marmalade SDK, на Unreal Engine 4.
Меня зовут Андрей. Я — независимый разработчик.
Сейчас занимаюсь созданием ассетов для Unreal Engine 4 и разработкой собственных игровых проектов на UE4.
Потом успел поработать PMом в одной из местных компании и поучаствовать в некоторых сторонних проектах в качестве разработчика.
После, полностью ушёл в независимую разработку, выпустил два проекта для iOS/Android и один из них — на PlayStation 4.
На данный момент новый проект находится на early pre-production стадии и о нём пока рано что-либо рассказывать.
Это стилизованная лоупольная головоломка в Sci-fi сеттинге.
В игре 50 уровней. В основном — комбинаторные головоломки.
Игрок управляет космическим дроном, которым взаимодействует с космонавтами. Цель каждого уровня — эвакуировать всех с космической платформы.
Космонавты обладают различными свойствами: некоторых можно цеплять и перетаскивать, другие могут толкать соседнего космонавта. Есть хрупкий космонавт, которого нельзя сбрасывать с высоты больше своего роста и т.д.
Отдельно хотелось бы отметить: в игре содержится почти час специально написанной композитором Helge Borgarts музыки в стиле space ambient. Если вам нравится музыка в таком стиле, уверен — треки из игры вам зайдут.
Изначально игра была написана с использованием Marmalade SDK под платформы iOS и Android. Это не игровой движок, а скорее кросс-платформенное API. Т.е. В нём нет специфических сущностей вроде Actor, Camera, уровень и т.д. Из языков в нём были C++ и Lua, из платформ — iOS, Android, PC и Tizen.
Было три фактора, которые спровоцировали наш отказ от мобильных версий.
По итогу убрал все мобильные версии и прекратил их поддержку. Но бросать проект не хотелось: всё же большинство отзывов были положительными. Поэтому решил перенести игру с канувшего в лету Marmalade SDK на Unreal Engine 4.
Что у меня было:
Формально работы по переносу игры можно разбить на три этапа:
Save\Load система, управление, Pawns, Камера, Система частиц, загрузка ассетов, материалы, конвертор уровней из XML в UE4, реимпорт всех 3д моделей и ассетов в UE4 и т.д.
Пришлось приводить исходный С++ код к типам UE4 (FVector, FTransfrom, UOBJECT и т.д.) и и убирать все хвосты, оставшиеся от Marmalade SDK.
Так же потребовалось добавление BluerpinrImplemantableEvent для того, чтобы С++ код мог отправлять сообщение Blueprint наследнику. Это используется, например, когда все космонавты эвакуированы с уровня и С++ вызывает event LevelComplete.
Добавление BlueprintCallable для того, чтобы Blueprint мог вызывать и использовать С++ код. Например, для расчёта рейтинга игрока. Сам метод расчёта написан на С++, к нему обращается Blueprint и получает результат расчёта.
Создание структуры уровней в виде sublevels и полностью новой логики камеры.
Меньше всего изменений было у 3д моделей. В основном — фиксы по мелочи.
После выполнения предварительных работы с кодом и ассетами приступил к переносу уровней.
Мне не потребовалось придумывать структуру заново и переделывать всю игровую логику. Разве что убрал все несущественные, в основном косметические, переменные и данные, которые были необходимы для работы Marmalade версии.
Потом создал актёра для декора. Он содержит все типы декора на уровнях, отрисовывает необходимую в данный момент модель и осуществляет с ней действия.
После финализации конвертера перенос всех 50 уровней занял 1.5-2 часа.
В игре есть 3 вида Pawns:
Уровни сделаны по схеме sub levels, т.е. это level streaming. Такой подход имеет два существенных плюса:
Цикл работы логики игры на UE4 можно описать так:
В версии на Marmalade SDK все расчёты логики, update, render и т.д. выполнялись внутри MainLoop, т.е. с однозначно заданной последовательностью.
В UE4, каждый актёр выполняет Tick() асинхронно. Основная логика находится в PlayerPawn, из-за чего возникала ситуация, когда часть актёров могла выполнить свой Tick до того как он выполнится у PlayerPawn, а другая часть уже после. Чтобы решить эту небольшую задачу удобно использовать метод AddTickPrerequisiteActor(). Так мы напрямую указываем последовательность тиков в разных актёрах.
Задав всем актёрам (кроме PlayerPawn) такое условие, мы помещаем PlayerPawn наверх списка и он всегда будет тикать первым.
Скажу честно — я тестировал с AddTickPrerequisiteActor и без него и существенной разницы не заметил. Поэтому в финальной версии это решение отсутствует.
В игре есть телепорты и созданный специально для них эффект телепортирования. В версии на Marmalade SDK он был реализован с помощью самописной системы частиц и представлял собой пролетающие из start в target по траектории близкой к параболе частицы. Одновременно может выполняться сколько угодно телепортирований.
В UE4 наиболее быстрым решением оказалось использование InstancedStaticMeshComponent. Во-первых, логика расчёта траектории у меня уже была. Во-вторых, ISMC отрисовывается за 2-4 (зависит от материала) draw calls.
Потребовалось лишь адаптировать логику для апдейта трансформов ISMC. В UE4 так же существует HierarchicalInstancedStaticMeshesComponent, который поддерживает LODs, но в моём случае поддержка lods не требовалась.
Для PlayStation 4 мне хотелось выпустить более качественную версию.
К существенным улучшениям можно отнести:
У меня ушло ровно 30 дней по 12-14 часов в сутки от текстовых исходников до полностью рабочей игры на UE4.
Скажу честно, после такого кранча я пару дней просто отсыпался и не реагировал на внешние сигналы.
Каких-либо сложностей и существенных проблем в процессе переноса не возникало, и я не могу что-то выделить особенное. Пожалуй, лишь разнообразие и масса мелких задач, которые необходимо было сделать и не забыть.
Пару слов о создании стори трейлера я решил добавить в эту статью потому, что он создавался под UE4 версию. Версия на Marmalade SDK имела только геймплейный трейлер.
Полагаю, он, положительно сказывается на восприятии игроком информации об игре на первоначальном этапе. Трейлер рассказывает небольшую историю и плавно подводит к действиям в игре и способствует сопереживанию судьбе маленьких героев.
Созданием трейлера занимался другой человек, за что ему большая благодарность. Несмотря на то, что он не обладал большим опытом в UE4, ему удалось быстро разобраться во всех необходимых инструментах и собрать трейлер в Unreal Engine 4 с помощью sequencer и других инструментов.
Через пару недель был готов драфтовый синематик без эффектов, текстур, звука, света и прочих красивостей. Он содержал в себе финальные тайминги, ракурсы и анимацию.
Еще через 12 дней я получил финальный проект в UE4.
Мне оставалось подправить гамму, т.к. она была слишком тёплая и, по моему мнению, слабо ассоциировалась с космосом, а также пофиксить косяки с DOF.
Еще через пару дней приехал саундтрек от композитора и я собрал финальную версию трейлера.
На все работы от создания сториборда до финального трейлера ушло 23 дня.
С момента релиза на PlayStation 4 прошло уже более 3 месяцев и я могу взглянуть на игру несколько отвлеченным взглядом и сделать определённые выводы:
Даже путём изменения story board. Примерно на 15-20% он урезается без потери идеи и motion design.
Обучающие уровни это первые 10 уровней. Они не содержат головоломок, лишь демонстрируют игровые возможности. Это очень очень устаревший подход. В идеале, надо было переделать на подсказки для уровней, где появляется какая-либо новая механика.
Несмотря на то, что космонавты анимированные и уже не воспринимаются мумиями в космосе, нужно было добавить глаза для передачи эмоций — для большей асоциации с живыми героями.
Первые уровни крайне простые и плейтестеры говорили, что играть скучно. Интересно играть становится только примерно после 22-23 уровня. Можно было переставить уровни местами, дав вызов уже на 13 или 14 уровне в виде достаточно сложной головоломки. К сожалению, это потребовало бы много дополнительной работы.
Это был интересный во всех отношениях опыт и мне хотелось бы поблагодарить всех людей, которые так или иначе принимали участие в создании игры!
Отдельная большая благодарность компании Sony Interactive Entertainment за возможность выпустить игру на PlayStation 4, дав возможность любителям головоломок поиграть в неё.
Специальное спасибо Яну Корвину за редактуру текста статьи!
Благодарю за уделённое статье время, всем хороших игр!
Для связи со мной, можете написать мне в Facebook
Спс, интересная статья.
А до переноса этой игры, сколько времени занимались UE4? Какой опыт?
Я если бы в такой кранч впрягся, бОльшая часть времени ушла бы на изучение особенностей движка (у меня лишь полгода опыт работы с UE4, и как-то конца-края не видно освоению хотя бы основ)
Не очень далеко, интересовала организация уровней, подход к их созданию и т.д.
Изучаю UE4, насколько я знаю, в движке очень много классов приспособленных под свои задачи, например, для меню UMG, UI классы, для игровой логики GameMode насколько помню и понимаю. У вас везде используется Pawn, класс который в UE4 создан для реализации механики персонажей, NPC на уровне. Это связано с тем, что игра создана не с нуля на UE4, а путем портирования? Или мобильные игры на UE4 так создаются? Просто я заметил изучение UE4 на моем примере, да и в общем чаще всего проходит с уклонам на большие открытые миры, когда в редакторе создаешь landscape, раставляешь StaticMesh и потом начинаешь писать логику, игровые механики и т.д.
GameMode используется в мультиплеерных играх. Т.к. у меня single player мне он не понадобился. Pawn используется для удобства, т.к. имеет всю необходимую коммуникацию, которая мне требовалась для реализации, к тому же это и есть представление игрока на уровне и тут не имеет никакого значения, как он визуально представлен.
Т.к. вся game play логика это достаточно массированный объем кода, не было смысла это разносить по классам, в противном случае это означало по сути создание игры с нуля. Такой задачи я перед собой не ставил.
Спасибо за ответ! Просто я подумал может не правильно изучаю UE4. Что интересно в этом движке можно создать практически идентичную игру разными способами. Поэтому конечно каждый выбирает свой оптимальный путь!
Андрей, а с вами можно пообщаться ВКонтакте? Можете мне там написать (мой ВК в профиле есть в «Информации»)?
Ок. Написал вам в ВК. Добавлю в статью контакт свой.
Список игр на движке Unreal Engine
Ниже привёден список компьютерных игр, использующих игровой движок Unreal Engine. Помимо применения в играх движки «Unreal» часто используются также для создания трёхмерной анимации и спецэффектов в кинофильмах, а также для разработки различных обучающих программ, таких как презентации и 3D-путеводители.
Содержание
Компьютерные игры [ править ]
Unreal Engine 1 [ править ]
Unreal Engine 2 [ править ]
30 ноября 2004 (PS2)
27 марта 2005 (Xbox)
26 октября 2005 (Xbox)
3 апреля 2006 (PC)
25 июля 2006 (PC)
4 апреля 2012 (PS3)
Unreal Engine 3 [ править ]
22 февраля 2008 (PC)
18 марта 2009 (PC)
27 марта 2009 (PS3/X360)
15 сентября 2009 (PC)
8 ноября 2011 (PC)
25 января 2013 (PC)
Ранее предполагалось что Too Human будет использовать движок Unreal Engine 3, однако Silicon Knights отказались от его использования, обвинив Epic Games в не предоставлении должных средств разработки. Используемый движок изменённый Unreal Engine 3.
Ранее предполагалось что Dark Sector будет использовать движок Unreal Engine 3, однако Digital Extremes отказались от его использования, объяснив тем, что движок плохо совместим с PlayStation 3. Компанией был разработан собственный движок Evolution Engine, который предлагается к лицензированию сторонним компаниям.
Unreal Engine 4 [ править ]
Дата выпуска | Название | Разработчик | Платформы |
---|---|---|---|
29 апреля 2014 | Daylight | PC, PlayStation 4 | |
25 ноября 2014 | Haunted House: Cryptic Graves | PC | |
18 марта 2015 | Tekken 7 | Arcade | |
1 июня 2015 | Hatred | PC | |
9 июня 2015 | Kholat | PC | |
11 июня 2015 | Alone in the Dark: Illumination | PC | |
16 февраля 2016 | Street Fighter V | PC, PlayStation 4 | |
24 февраля 2016 | The Flame in the Flood | PC, Xbox One | |
28 марта 2016 | ADR1FT | PC | |
май 2016 | Dangerous Golf | PC, PlayStation 4, Xbox One | |
2016, в разработке | Fortnite | PC | |
2016, в разработке | H-Hour: World’s Elite | PC, PlayStation 4 | |
2016, в разработке | Space Hulk: Deathwing | PC, PlayStation 4, Xbox One | |
2016, в разработке | Dreadnought | PC | |
2016, в разработке | Obduction | PC | |
2016, в разработке | The Lost Pisces | PC | |
2016, в разработке | Paragon | PC | |
2016, в разработке | Tekken 7 | PlayStation 4, Xbox One | |
2016, в разработке | Styx: Shards of Darkness | PC, PlayStation 4, Xbox One | |
2016, в разработке | Tower Unite | PixelTail Games | PC |
2016, в разработке | Without Memory | PlayStation 4 | |
2016, в разработке | Starfall Tactics [149] | PC | |
2016, в разработке | Hellblade | PC, PlayStation 4 | |
2016, в разработке | Sea of Thieves | PC, Xbox One | |
2016, в разработке | ARK: Survival Evolved | PC, PlayStation 4, Xbox One | |
2016, в разработке | Gears of War 4 | Xbox One, PC | |
2016, в разработке | The Solus Project | PC, Xbox One | |
2016, в разработке | Battlefleet Gothic: Armada | PC | |
2016, в разработке | LawBreakers | PC | |
2016, в разработке | Headlander | PC, Xbox One, PlayStation 4 | |
2016, в разработке | Everspace | PC | |
2016, в разработке | Unreal Tournament | PC | |
2016, в разработке | Will to Live | PC | |
2016, в разработке | Train Simulator 2016 | PC | |
2016, в разработке | Final Fantasy VII Remake | PlayStation 4 | |
2016, в разработке | Abzu | PC, PlayStation 4 | |
2016, в разработке | Crackdown 3 | Xbox One, PC | |
2017, в разработке | The Bard’s Tale IV | PC | |
2017, в разработке | Bloodstained: Ritual of the Night | PC, PlayStation 4, Xbox One, PlayStation Vita, Wii U | |
2017, в разработке | Shenmue III | PC, PlayStation 4 | |
2017, в разработке | Vampyr | PC, PlayStation 4, Xbox One | |
2017, в разработке | Insurgency: Sandstorm | PC, PlayStation 4, Xbox One | |
2017, в разработке | Call of Cthulhu | PC, PlayStation 4, Xbox One | |
2017, в разработке | Scalebound | Xbox One, PC | |
2018, в разработке | Psychonauts 2 | PC, PlayStation 4, Xbox One | |
TBA, в разработке | Project Ageless | PC | |
TBA, в разработке | Project: Session | PC | |
TBA, в разработке | Danger Days: The Game | PC | |
TBA, в разработке | Bulletstorm 2 | PC, PlayStation 4, Xbox One | |
TBA, в разработке | Borderlands 3 | PC, PlayStation 4, Xbox One | |
TBA, в разработке | Новый проект студии |
Blackbird Interactive
Перешедшие на коммерческую основу [ править ]
Модификация | Основа | Описание |
---|---|---|
Red Orchestra: Combined Arms | UT2004 | Тактический шутер о восточном фронте Второй мировой войны. После победы на конкурсе «Make Something Unreal», модификация была значительно доработана и перенесена в формат самостоятельной игры, Red Orchestra: Ostfront 41-45. |
Killing Floor | UT2004 | Кооперативный шутер, в котором команда игроков должна выдержать определённое число нападений групп монстров. Позднее была выпущена в виде самостоятельной игры. |
Damnation | UT2004 [150] | Стимпанк 3D-шутер с элементами action-adventure — конфликт с противником происходит от первого лица, а преодоление препятствий от третьего. Игрок может временно брать под контроль противников, управляя ими от первого лица. |
The Ball | UT3 | The Ball — головоломка-экшн, действие которого происходит в полных загадок и ловушек подземных городах древней цивилизации. |
Образовательные приложения [ править ]
Unreal Engine 1 [ править ]
Unreal Engine 2 [ править ]
По состоянию на октябрь 2007, более 500 компаний использовали Unreal Engine 2 Runtime для создания образовательных программ.
Как Unreal Engine используют в кино
Технология, пришедшая из игр, меняет кинематограф.
Раз в несколько десятилетий в кино происходит технологическая революция, обновляющая индустрию. Появление цвета и звука, компьютерная графика, «зелёный экран», технология захвата движения, новый подход к 3D в «Аватаре» — все эти инновации полностью меняли подход к съёмкам крупных студийных проектов.
Какой будет следующая революционная технология пока неизвестно. Один из правдоподобных вариантов — использование игровых движков.
Речь, прежде всего, об Unreal Engine 4, который использовали в блокбастерах Marvel, новых «Звёздных войнах» и сериале «Мандалорец». В этом материале мы расскажем, почему он может обеспечить новый прорыв в индустрии.
Что такое Unreal Engine 4
Unreal Engine разработала компания Epic Games в 1998-м для создания шутеров от первого лица. В следующих версиях движок упрощался и становился более универсальным, а поэтому теперь в нём можно создавать проекты любых жанров для всех популярных платформ.
Unreal Engine 4 позволяет создавать игры без долгого написания кода. Местная система визуального программирования Blueprint доступна даже новичкам. Никаких особых навыков не требуется — можно вообще создать готовую игру только на основе «блупринтов».
Unreal Engine 4 сильно повлиял на игровую индустрию: его использовали при создании Fortnite, Hellblade: Senua’s Sacrifice, Gears 5 и сотен других игр.
Но он полезен и за пределами игровой индустрии — в дизайне интерьеров или даже в кинематографе.
Интерьер, созданный при помощи Unreal Engine 4
От конкурентов UE4 отличает фотореалистичная графика и огромная библиотека ассетов — движок позволяет создать проработанный и детализированный фон, который практически неотличим от реального.
Видео с демонстрацией графических возможностей Unreal Engine
Ещё одно важное преимущество — быстрый производственный процесс.
Создатели видео рассказывают о производственном процессе
Неудивительно, что движок быстро взяли на вооружение киностудии — он пригодится и на препродакшне, и при создании спецэффектов в реальном времени. Режиссёры всё чаще отказываются от «зелёного экрана» и других популярных технологий в пользу UE4.
Как Unreal Engin используют в кино
Важная особенность UE4 — инструмент под названием Sequencer. Он решает задачи в реальном времени: перемещает фрагменты сцены, подбирает подходящие объективы, настраивает освещение и устанавливает фокусировку.
Благодаря Sequencer самым популярным способом применения UE4 на съёмках стало создание реалистичного фона. Технологию можно использовать как хромакей — в реальном времени, поэтому теперь это занимает не несколько часов, а всего пару минут и несколько кликов. Иногда специалисты по спецэффектам дорабатывают сцены на постпродакшне, но часто даже этого не требуется: хватает рендера в реальном времени.
В создании фонов помогает шаблон UE4 под названием nDisplay: он позволяет проецировать изображение сразу на несколько экранов или поверхностей. Сгенерированные фоны транслируются на огромные LED-экраны и создают иллюзию, будто актёры находятся внутри этого пространства. Процесс напоминает такие классические для кино методы, как рирпроекция и фронтпроекция (приёмы комбинированной съёмки, в которых фон проецировался на экран позади актёров), только без свойственных им недостатков, вроде теней от съёмочной группы и несовпадения деталей.
Ещё один полезный для кино инструмент — технология Stagecraft, которая создаёт и меняет реалистичное окружение прямо на съёмочной площадке.
UE4 помогает кинематографистам и в предварительной визуализации. Здесь роль играют не только классические возможности движка, которые позволяют заменить раскадровки реалистичной анимацией, но и специальный шаблон под VR-проекты. Надев очки, актёр может взаимодействовать со сгенерированной средой в реальном времени, что помогает точно распланировать его движение в кадре.
На конференции разработчиков игр GDC Epic Games представили действительно футуристичную технологию на базе UE4. Движок рендерил уже не фон внутри программы, а физический объект в реальном времени — автомобиль Chevrolet Camaro ZL. Для этого использовалась реальная модель авто без кузова, но с каркасом и нанесёнными на него QR-кодами.
В каких проектах использовали Unreal Engine
Пока что использование UE4 в кино — всё ещё редкость. Первопроходцем здесь в очередной раз стала Disney, которая всегда одной из первых применяла новые технологии — от ротоскопирования до 3D-анимации.
Главный сторонник использования UE4 в кино — режиссёр «Железного Человека», «Книги Джунглей» и «Короля Льва», а также шоураннер «Мандалорца» Джон Фавро.
Его появление на конференции специалистов по компьютерной графике SIGGRAPH в компании спикеров из Epic Games удивило зрителей. Но ничего странного в этом не было — именно у Фавро сегодня самый большой опыт по внедрению игровых движков в съёмочный процесс.
На конференции режиссёр подробно рассказал, как применял движок при создании трёх своих последних проектов. Всё началось с «Книги Джунглей», — живому актёру, игравшему Маугли, приходилось бегать среди «синих экранов». Необходимость подолгу перемещать хромакей и обдумывать детали рендеринга выводили режиссёра из себя. Тогда Фавро решил воспользоваться возможностями Unity.
На съёмках «Книги Джунглей» движок использовали не так часто — с его помощью создали предварительную визуализацию некоторых сцен, которая транслировалась в VR-очках у актёра и съёмочной команды. Как выразился сам Фавро, они создали нечто вроде «многопозовательской VR-игры о съёмках фильма». Именно эта технология стала фундаментом для создания его следующего крупного проекта — фотореалистичного ремейка «Короля льва».
Там виртуальная реальность применялась уже в полном объёме — перед съёмками сцены создавались в виртуальной реальности. Фавро даже называет ответственного за этот процесс Калеба Дешанеля «полноценным кинематографистом» и едва ли не ещё одним полноценным режиссёром.
Фактически, фильм был изначально полностью поставлен в VR, чтобы во время настоящих съёмок команда могла отталкиваться не от раскадровок, а от анимации с готовыми светом, цветокоррекцией, операторскими приёмами и так далее. Теперь больше не требовалось подолгу искать общий язык с VFX-художниками и присылать им правки. Вся графика уже перед глазами режиссёра, а заметки для пост-продакшна выглядят максимально наглядно. Этот опыт сильно повлиял на Фавро, — он окончательно убедился в эффективности своего новаторского подхода.
В сериале «Мандалорец» уже использовали Unreal Engine — причём по максимуму.
Во-первых, Фавро использовал ту же стратегию с предвизуализацией, что и в «Короле Льве». Во-вторых, хромакей окончательно заменили LED-экраны с проекциями созданных в UE4 фонов. Технология Stagecraft помогла с рендером не только экзотических пейзажей, но и фрагментов корабля, — это позволило сэкономить на реквизите.
С помощью этих возможностей в реальном времени дорисовывали недостающие объекты, меняли времена суток и добавлять детали, которые сразу же проецировались на светодиодные стены. Фавро уверяет, что многие эпизоды, снятые на фоне таких экранов, вошли в финальный монтаж без пост-обработки.
Джон Фавро
Для актеров это было здорово, потому что они могли ходить по съёмочной площадке, и даже в случае использования интерактивных проекций попадать в среду, где они видят всё окружение.
На эти светодиодные стены не стоит смотреть с близкого расстояния, но они всё равно полезны для периферического зрения во время работы. Вы всегда знаете, где горизонт, ощущаете освещение на себе. И вам даже не нужно настраивать свет на площадке, ведь вы получаете много интерактивного света от этих светодиодных стен.
Моду на виртуальную предварительную визуализацию быстро переняли коллеги Фавро. Во многих подконтрольных Disney проектах появился новый рабочий этап— виртуальный продакшн. Те же методы, которые помогали Фавро на съёмках «Книги Джунглей» и «Короля льва», использовались при создании «Стражей галактики 2» и «Тор: Рагнарёк».
Технологию переняли и конкуренты — например, Fox с их франшизой о «Планете обезьян», где актёрам, снимавшимся при помощи технологии захвата движения, предварительная визуализация сцен была просто необходима.
Что касается проекций на LED-экраны, то Фавро не был в этом первым. Их уже использовали в другом проекте по вселенной «Звёздных войн» — «Изгой-один». Помимо прочего, UE4 в фильме применялся для визуализации робота K-2SO, которого полностью отрисовали, а затем перенесли в VR, — это упростило актёрам взаимодействие с персонажем.
Виртуальный продакшн и проекции также применялись при создании «Соло» и девятого эпизода «Звёздных войн». Как и в прошлые десятилетия, именно эта франшиза задаёт тренды в индустрии эффектов.
Ещё движок от Epic Games используют при создании анимации — причём в качестве основного инструмента. С помощью UE4 была отрисована целая сцена мультфильма «В поисках Дори», — и Pixar продолжает сотрудничество с Epic.
Полнометражный анимационный фильм на базе UE4 тоже не за горами. Epic работают над проектом под названием Troll, который создаётся с применением технологии трассировки лучей. В главной роли – Алисия Викандер.
О процессе создания анимационных фильмов в UE4 подробно рассказали 3D-художники, работавшие над короткометражкой Fragment — в их гайде описаны все этапы производства.
Ниже наглядная демонстрация возможностей UE4: энтузиасты воссоздают культовые фрагменты и объекты из фильмов непосредственно в UE4. Примеров много: от «Бэтмобиля» и «ДеЛориана» до кадра из «Бегущего по лезвию: 2049».
Каково будущее Unreal Engine в кино
Фавро и другие режиссёры, которые использовали технологию, сходятся во мнении, что UE4 значительно повлияет на будущее кинематографа. Движок становится проще и удобнее для рендеринга, что позволяет добиваться высокого качества эффектов без лишних затрат.
Конечно, пока UE4 далёк до того, чтобы каждый мог с его помощью создать собственный фильм. Но он уже помогает профессионалам отрисовать необходимые объекты и фоны прямо в процессе производства — а ведь это ещё вчера звучало как мечта всех режиссёров блокбастеров, уставших от проблем, связанных с хромакеем.
Джон Фавро
Я думаю, что это не рушит весь процесс, а только заставляет вас принимать творческие решения на раннем этапеОбычно вы идёте на съемочную площадку, устанавливаете «зёленый экран» и только потом видите результат. Но здесь у вас есть все эти замечательные новые технологии, и есть столетний опыт создания кино, принципы которого сохраняются. Зачем отказываться от этого только потому, что мы больше не используем декорации? Давайте унаследуем навыки этих мастеров и создадим новые инструменты.
Если попытаться заглянуть в будущее — возможно, благодаря Unreal Engine 4 или аналогичному инструменту, кино станет в буквальном смысле интерактивным. Наблюдая за тем, как используется эта технология сегодня, можно представить, как зритель будущего изменяет фон и детали фильма прямо во время просмотра.
Туториал по Unreal Engine. Часть 2: Blueprints
Blueprints — это система визуального скриптинга Unreal Engine 4. Она является быстрым способом создания прототипов игр. Вместо построчного написания кода всё можно делать визуально: перетаскивать ноды (узлы), задавать их свойства в интерфейсе и соединять их «провода».
Кроме быстрого прототипирования, Blueprints также упрощают создание скриптов для непрограммистов.
В этой части туториала мы будем использовать Blueprints для следующих операций:
В этой части также используются векторы. Если вы с ними незнакомы, то рекомендую эту статью про векторы на gamedev.net.
Примечание: эта статья является одной из восьми частей туториала, посвящённого Unreal Engine:
Приступаем к работе
Скачайте начальный проект и распакуйте его. Чтобы открыть проект, перейдите в папку проекта и откройте BananaCollector.uproject.
Примечание: если откроется окно, сообщающее, что проект создан в более ранней версии Unreal editor, то всё в порядке (движок часто обновляется). Можно или выбрать опцию создания копии, или опцию преобразования самого проекта.
На рисунке ниже показана сцена. Именно в ней игрок будет перемещаться и собирать предметы.
Для простоты навигации я разбил файлы проекта на папки, как показано на рисунке:
Выделенную красным кнопку можно использовать, чтобы показать или скрыть панель исходников.
Создание игрока
В Content Browser перейдите к папке Blueprints. Нажмите на кнопку Add New и выберите Blueprint Class.
Мы хотим, чтобы актор получал вводимую игроком информацию, поэтому нам подходит класс Pawn. Выберите во всплывающем окне Pawn и назовите его BP_Player.
Примечание: класс Character тоже подойдёт. В нём даже по умолчанию есть компонент перемещения. Однако мы будем реализовывать собственную систему движения, поэтому класса Pawn нам достаточно.
Прикрепление камеры
Камера — это способ игрока смотреть на мир. Мы создадим камеру, смотрящую на игрока сверху вниз.
В Content Browser дважды нажмите на BP_Player, чтобы открыть его в Blueprint editor.
Для создания камеры перейдите на панель Components. Нажмите на Add Component и выберите Camera.
Чтобы камера смотрела сверху вниз, нужно расположить её над игроком. Выбрав компонент камеры, перейдите во вкладку Viewport.
Активируйте манипулятор перемещения, нажав клавишу W, а затем переместите камеру в (-1100, 0, 2000). Или же можно ввести координаты в поля Location. Она находится в разделе Transform панели Details.
Если вы потеряли камеру из виду, нажмите клавишу F, чтобы сфокусироваться на ней.
Затем активируйте манипулятор поворота, нажав клавишу E. Поверните камеру вниз на -60 градусов по оси Y.
Отображаем игрока
Мы обозначим персонажа игрока красным кубом, поэтому для его отображения нужно будет использовать компонент Static Mesh.
Во-первых, снимите выделение с компонента Camera, нажав левой клавишей мыша на пустом пространстве в панели Components. Если этого не сделать, то следующий добавленный компонент будет дочерним по отношению к камере.
Нажмите на Add Component и выберите Static Mesh.
Чтобы отобразить красный куб, выберите компонент Static Mesh, а затем перейдите во вкладку Details. Нажмите на раскрывающийся список, находящийся справа от Static Mesh и выберите SM_Cube.
Вы должны увидеть следующее (можно нажать F внутри Viewport, чтобы сфокусироваться на кубе, если вы его не видите):
Теперь настало время заспаунить актора Pawn игрока. Нажмите на Compile и вернитесь к основному редактору.
Спаун игрока
Чтобы игрок мог управлять Pawn, нужно указать две вещи:
Создание Game Mode
Класс Game Mode (игровой режим) — это класс, управляющий тем, как игрок входит в игру. Например, в многопользовательской игре Game Mode используется для задания спауна каждого игрока. Что более важно, Game Mode определяет. какой Pawn будет использовать игрок.
Перейдите к Content Browser и зайдите в папку Blueprints. Нажмите на кнопку Add New и выберите Blueprint Class.
Во всплывающем меню выберите Game Mode Base и назовите его GM_Tutorial.
Теперь нужно указать, какой класс Pawn будет использоваться по умолчанию. Дважды нажмите на GM_Tutorial, чтобы открыть его.
Перейдите на панель Details и загляните в раздел Classes. Нажмите на раскрывающийся список Default Pawn Class и выберите BP_Player.
Чтобы использовать новый Game Mode, нужно сообщить уровню, какой Game Mode он должен использовать. Это можно указать в World Settings. Нажмите на Compile и закройте Blueprint editor.
Каждый уровень имеет собственные параметры. Получить доступ к этим параметрам можно, выбрав Window\World Settings. Или же можно зайти в Toolbar и выбрать Settings\World Settings.
Рядом со вкладкой Details откроется новая вкладка World Settings. В ней нажмите на раскрывающийся список GameMode Override и выберите GM_Tutorial.
Теперь вы увидите, что классы сменились на те, которые выбраны в GM_Tutorial.
Наконец, нам нужно задать точку спауна игрока. Это реализуется размещением на уровне актора Player Start.
Размещение Player Start
В процессе спауна игрока Game Mode ищет актор Player Start. Если Game Mode находит его, то предпринимает попытку заспаунить игрока там.
Чтобы разместить Player Start, перейдите к панели Modes и найдите Player Start. Нажмите левой клавишей и перетащите Player Start из панели Modes во Viewport. Отпустите левую клавишу мыши, чтобы разместить его.
Можете разместить его где угодно. Когда закончите, перейдите в Toolbar и нажмите Play. Вы будете заспаунены в точке расположения Player Start.
Чтобы выйти из игры, нажмите кнопку Stop в Toolbar или нажмите клавишу Esc. Если вы не видите курсор, нажмите Shift+F1.
Это не похоже на игру, если мы не можем двигаться. Наша следующая задача — настроить параметры ввода.
Настройка ввода
Назначение клавиши действию называется привязкой клавиши.
В Unreal можно настроить привязки клавиш, чтобы при их нажатии срабатывали события. События — это ноды, выполняющиеся при определённых действиях (в этом случае — при нажатии указанной клавиши). При срабатывании события выполняются все ноды, соединённые с событием.
Такой способ привязки клавиш удобен, потому что он означает, что нам не нужно жёстко задавать клавиши в коде.
Если мы будем задавать клавиши жёстко, то нам придётся заходить в каждый актор и менять клавиши отдельно.
Привязка осей и действий
Чтобы перейти к параметрам ввода, зайдите в Edit\Project Settings. В разделе Engine выберите слева Input.
В разделе Bindings выполняется настройка ввода.
Unreal предоставляет два способа создания привязок клавиш:
Создание привязок движения
Во-первых, мы создадим две группы привязки осей. Группы позволяют привязывать несколько клавиш к одному событию.
Для создания новой группы привязки осей нажмите на значок + справа от Axis Mappings. Создайте две группы и назовите их MoveForward и MoveRight.
MoveForward будет управлять движением вперёд и назад. MoveRight будет управлять движением влево и вправо.
Мы привяжем движение к четырём клавишам: W, A, S и D. Пока у нас есть только два слота для привязки клавиш. Добавим к каждой группе ещё одну привязку осей, нажав на значок + рядом с полем имени группы.
Чтобы привязать клавишу, нажмите на раскрывающийся список с перечислением клавиш. Привяжите клавиши W и S к MoveForward. Привяжите клавиши A и D к MoveRight.
Теперь нужно задать значения в полях Scale.
Значение оси и масштаб ввода
Перед заданием полей Scale нам нужно больше узнать о том, как работать со значениями осей.
Мы можем использовать значение оси для управления скоростью Pawn. Например, если мы нажмём стик до упора, то значение оси будет 1. Если нажать наполовину, то значение будет 0.5.
Умножая значение оси на переменную скорости, мы можем регулировать с помощью стика скорость движения.
Также значение оси можно использовать для задания направления вдоль оси. Если умножить скорость Pawn на положительное значение оси, то мы получим положительное смещение. При использовании отрицательного значения оси получим отрицательное смещение. Прибавляя это смещение к местонахождению Pawn, мы задаём направление его движения.
Клавиши клавиатуры могут подавать на выход только значения 1 или 0, то можно использовать scale для преобразования их в отрицательные числа. Это можно сделать, взяв значение оси и умножив его на масштаб.
Умножив положительное (значение оси) на отрицательный (масштаб), мы получим отрицательное значение.
Задайте масштаб клавиш S и A, нажав на поле Scale и введя -1.
Теперь начинается интересное: заставим Pawn двигаться! Закройте Project Settings и откройте BP_Player в Blueprints editor, дважды нажав на него.
Перемещение игрока
Сначала нам нужно выбрать события для привязок движения. Нажмите правой клавишей мыши на пустом пространстве в Event Graph, чтобы открыть список нодов. Найдите в этом меню MoveForward. Добавьте нод MoveForward из списка Axis Events. Учтите, что вам нужен красный нод в Axis Events, а не зелёный нод в Axis Values.
Повторите процесс для MoveRight.
Теперь мы настроим ноды для MoveForward.
Использование переменных
Для перемещения необходимо указать, с какой скоростью будет двигаться Pawn. Один из простых способов указания скорости — хранение её в переменной.
Чтобы создать переменную, зайдите во вкладку My Blueprint и нажмите на значок + в правой части раздела Variables.
Выбрав новую переменную, перейдите во вкладку Details. Измените имя переменной на MaxSpeed. После этого замените тип переменной на Float. Для этого нужно нажать на раскрывающийся список рядом с Variable Type и выбрать Float.
Теперь необходимо задать значение по умолчанию. Но чтобы его задать, нужно будет нажать Compile в Toolbar.
Выбрав переменную, перейдите ко вкладке Details. Зайдите в раздел Default Value и измените значение MaxSpeed по умолчанию на 10.
Затем перетащите переменную MaxSpeed из вкладки My Blueprint на Event Graph. Выберите из меню пункт Get.
Теперь нужно умножить MaxSpeed на значение оси, чтобы получить конечную скорость и направление. Добавим нод float * float и присоединим к нему Axis Value и MaxSpeed.
Получение направления игрока
Чтобы двигаться вперёд, нам нужно знать, куда смотрит Pawn. К счастью, в Unreal есть для этого нод. Добавьте нод Get Actor Forward Vector.
Затем добавьте нод Add Movement Input. Этот нод получает направление и значение, преобразуя их в хранимое смещение. Соедините ноды следующим образом:
Белая линия обозначает цепочку выполнения. Другими словами, когда игрок перемещает ось ввода, то генерируется событие, выполняющее нод InputAxis MoveForward. Белая линия показывает, что после этого выполняется нод Add Movement Input.
Нод Add Movement Input получает на входе следующие данные:
Добавление смещения
Чтобы действительно двигать Pawn, нам нужно получить смещение, вычисленное Add Movement Input, и прибавить его к местоположению Pawn.
В сущности, наша стратегия будет заключаться в перемещении игрока на небольшую величину в каждом кадре игры, поэтому нам нужно добавить перемещение к событию Event Tick, которое генерируется каждый кадр.
Перейдите к ноду Event Tick в Event Graph. Он должен быть неактивным и находиться слева, но если его нет, то создайте нод самостоятельно.
Чтобы получить смещение, создадим нод Consume Movement Input Vector. Чтобы прибавить смещение, создадим нод AddActorLocalOffset. После этого соединим их следующим образом:
Это означает, что в каждом кадре игры мы будем сохранять весь ввод перемещения и прибавлять его к текущему местоположению актора.
Нажмите Compile, перейдите к основному редактору и нажмите на Play. Теперь вы можете двигаться в сцене!
Однако у нас есть небольшая проблема. Мощные компьютеры могут рендерить кадры с большей частотой. Event Tick вызывается каждый кадр, поэтому ноды перемещения будут выполняться чаще. Это значит, что Pawn будет двигаться на мощных компьютерах быстрее, и наоборот.
Чтобы решить эту проблему, наше движение должно быть независимым от частоты кадров.
Примечание: я настроил привязки клавиш, чтобы показать влияние зависимости от частоты кадров. Нажмите 0, чтобы ограничить частоту 60 кадрами в секунду, и нажмите 1, чтобы снять ограничение. Попробуйте перемещаться при обоих частотах кадров и вы заметите разницу в скорости.
Независимость от частоты кадров
Независимость от частоты кадров означает, что мы постоянно будем получать одинаковые результаты, вне зависимости от частоты кадров. К счастью, достичь такой независимости в Unreal очень просто.
Выйдите из игры, а затем откройте BP_Player. Затем перейдите к узлу Event Tick и посмотрите на Delta Seconds.
Delta Seconds — это величина времени, прошедшего после предыдущего Event Tick. Умножив смещение на Delta Seconds, мы сделаем перемещение независимым от частоты кадров.
Например, наш Pawn имеет максимальную скорость 100. Если после предыдущего Event Tick прошла одна секунда, то Pawn переместится на полные 100 единиц. Если прошли полсекунды, то он переместится на 50 единиц.
Если движение зависимо от частоты кадров, то Pawn будет перемещаться на 100 единиц в каждом кадре, вне зависимости от времени между кадрами.
Чтобы умножить смещение на Delta Seconds, добавьте нод vector * float. После этого соедините ноды следующим образом:
Время между кадрами (Delta Seconds) очень мало, поэтому Pawn будет двигаться намного медленнее. Это можно исправить, заменив значение MaxSpeed по умолчанию на на 600.
Поздравляю вам удалось добиться независимости от частоты кадров!
Можно заметить, что куб проходить сквозь все объекты. Чтобы исправить это, нам нужно познакомиться с коллизиями.
Надевайте шлем, потому что сейчас нам придётся столкнуться с теорией!
Коллизии актора
Когда мы вспоминаем о столкновениях, то представляем автомобильные аварии. К счастью, коллизии в Unreal намного безопаснее.
Чтобы иметь возможность сталкиваться с объектами, актору нужно обозначение его пространства столкновений (обычно называемого коллизией). Можно использовать одно из следующих пространств:
Коллизия происходит, когда коллизия актора касается коллизии другого актора.
Теперь настало время включить коллизии.
Включение коллизий
Вы, наверно, недоумеваете, почему куб не сталкивается с объектами, хотя у него есть меш коллизии. При перемещении актора Unreal учитывает для коллизий только корневой компонент. Поскольку корневой компонент Pawn не имеет коллизии, он проходит сквозь все объекты.
Примечание: актор, не имеющий коллизии в корневом компоненте, всё равно может блокировать других акторов. Но если перемещать актора, то он не будет ни с чем сталкиваться.
Итак, чтобы использовать меш коллизии, StaticMesh должен быть корневым. Для этого перейдите в панель Components. Затем зажмите левую клавишу мыши и перетащите StaticMesh на DefaultSceneRoot. Отпустите левую клавишу мыши, чтобы сделать StaticMesh новым корневым компонентом.
Чтобы коллизии начали работать, нужно выполнить ещё одно действие. Переключитесь на Event Graph и перейдите к узлу AddActorLocalOffset. Найдите вход Sweep и измените значение на true, нажав левой клавишей мыши на флажок.
AddActorLocalOffset занимается тем, что телепортирует актора в новое место. Sweep гарантирует, что актор будет сталкиваться со всем, что находится между старым и новым местоположением.
Перейдите в основной редактор и нажмите на Play. Теперь куб будет реагировать на коллизии с уровнем!
Последнее, что мы создадим — это предмет, исчезающий при контакте с персонажем игрока.
Создание предмета
В общем случае предметом является любой собираемый игроком объект. Мы используем в качестве предмета BP_Banana.
Чтобы распознать контакт куба и предмета, нам нужен нод события, срабатывающего при коллизии. Для генерирования таких событий можно использовать реакции на коллизи.
Реакция на коллизию также определяет, как актор реагирует на коллизию с другим актором. Существует три типа реакций на коллизии: Ignore, Overlap и Block. Вот как они взаимодействуют друг с другом:
Хотя здесь можно использовать и Overlap, и Block, в этом туториале мы будем использовать только Overlap.
Задание реакции на коллизию
Закройте игру и откройте BP_Banana. Выберите компонент StaticMesh, а затем перейдите в панель Details. Реакции на коллизии задаются в разделе Collision.
Как вы видите, большинство параметров неактивно. Чтобы сделать их изменяемыми, нажмите на раскрывающийся список рядом с Collision Presets. Выберите в списке Custom.
Теперь нам нужно указать реакцию на коллизию между предметом и кубом.
Компоненты имеют атрибут под названием object type (тип объекта). Тип объекта — это просто удобный способ группировки похожих акторов. Подробнее о типах объектов можно прочитать здесь.
Куб имеет тип WorldDynamic, поэтому нам нужно изменить реакцию на коллизию этого типа. В разделе Collision Responses измените реакцию на коллизию WorldDynamic на Overlap. Это можно сделать, нажав на средний флажок справа от WorldDynamic.
Обработка коллизий
Для обработки коллизий нужно использовать событие наложения. Перейдите в панель Components и нажмите правой клавишей мыши на StaticMesh. В контекстном меню выберите Add Event\Add OnComponentBeginOverlap.
Так мы добавим в Event Graph нод OnComponentBeginOverlap (StaticMesh).
Наконец, создадим нод DestroyActor и соедините его с нодом OnComponentBeginOverlap (StaticMesh). Как можно догадаться по названию, он удаляет целевой актор из игры. Однако поскольку целевого актора нет, он уничтожит актор, вызвавший его.
Размещение предмета
Закройте Blueprint editor и перейдите в папку Blueprints.
Начните располагать бананы на уровне зажав левую клавишу мыши и перетаскивая BP_Banana во Viewport.
Нажмите Play и начните собирать бананы!
Куда двигаться дальше?
Готовый проект можно скачать отсюда.
Вы сделали ещё один шаг к тому, чтобы стать специалистом по Unreal Engine.
Если вы хотите продолжить обучение, то прочитайте следующий пост в серии, где мы подробнее рассмотрим материалы Unreal Engine.
Источники:
- http://gamebomb.ru/gbnews/13834
- http://habr.com/ru/company/vk/blog/327520/
- http://wtftime.ru/articles/126481/unreal-portal-razrabotchik-potratil-god-perenosja-portal-na-unreal-engine-vot-chto-vyshlo/
- http://habr.com/ru/company/piter/blog/269415/
- http://habr.com/ru/company/vk/blog/564302/
- http://habr.com/ru/company/otus/blog/585090/
- http://habr.com/ru/company/pixonic/blog/501828/
- http://habr.com/en/post/344394/
- http://proglib.io/p/kak-s-pomoshchyu-unreal-insights-optimizirovat-igru-na-unreal-engine-2022-08-12
- http://dtf.ru/games/843386-telo-na-svobode-razum-pod-kontrolem-detali-horrora-the-outlast-trials
- http://ixbt.games/news/2021/12/27/the-elder-scrolls-v-skyrim-i-oblivion-pokazali-na-dvizke-unreal-engine-5.html
- http://habr.com/ru/news/t/659267/
- http://habr.com/ru/post/348600/
- http://dtf.ru/gamedev/7227-orel-ili-reshka-sravnenie-unity-i-unreal-engine
- http://habr.com/ru/post/488028/
- http://app-time.ru/vo-chto-poigrat/podborka-krasivyh-igr-na-unreal-engine-4-dlya-ios-i-android
- http://habr.com/ru/company/unigine/blog/670518/
- http://habr.com/ru/post/647521/
- http://habr.com/en/company/vk/blog/341828/
- http://habr.com/ru/post/675906/
- http://habr.com/ru/post/347036/
- http://ixbt.games/news/2022/08/26/v-texnodemo-na-unreal-engine-5-pokazali-progulki-po-lesu-novogo-pokoleniya.html
- http://habr.com/en/post/327372/
- http://render.ru/ru/VlaKu/post/23054
- http://dtf.ru/unrealengine/70250-portirovanie-igry-na-unreal-engine-4
- http://www.wiki-wiki.ru/wp/index.php/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%B8%D0%B3%D1%80_%D0%BD%D0%B0_%D0%B4%D0%B2%D0%B8%D0%B6%D0%BA%D0%B5_Unreal_Engine
- http://render.ru/ru/XYZ/post/17173
- http://habr.com/ru/post/344446/