![](https://habrastorage.org/getpro/habr/upload_files/dda/723/4f6/dda7234f6097ae7b5936b7d42dea1ed7.png)
Дисклеймер
Эта статья писалась для новичков Unreal Engine, если вы профи, то вам будет скучно. Для нормального прочтения, осмысления и понимания происходящего ниже, необходимо знать, что такое переменная и их основные типы, что такое метод, булеву логику и самые базовые принципы программирования. Спасибо. Приступим.
Вступление
Всем привет, я Артем Тарасов и я в геймдеве уже более 5 лет. Занимался разработкой игр самых разных масштабов под мобилки, пк, консоли и VR/AR. Сейчас работаю в компании JoyWay над VR проектом Stride и также являюсь преподавателем курса Технический Game Designer Unreal Engine в Otus.
Сегодня (и в следующих частях) я расскажу и покажу, как вы можете сделать свой собственный простенький, но вполне себе рабочий шутер от третьего лица.
Для написания этой статьи я использовал версию движка 4.27. В следующих версиях могут быть отличия, но они вряд-ли будут очень значительны, поэтому не закрывайте статью в случае другого вида окошка (изучите немного вопрос).
Создаем проект
При открытии движка, он предложит несколько видов преднастроек проектов. Мы с вами делаем игру, поэтому выбираем Games и жмем кнопку Next.
![](https://habrastorage.org/getpro/habr/upload_files/16f/f54/e7c/16ff54e7c78b91422dbe0eafdd85a255.png)
В следующем окне движок предложит выбрать шаблон, на основе которого мы будем делать игру. Выбираем ThirdPerson. Он уже содержит персонажа и базовую логику для перемещения. Снова жмем Next.
![](https://habrastorage.org/getpro/habr/upload_files/1a2/375/11e/1a237511e089d5ae3ada81e5bf73a3c7.png)
В следующем окне мы настраиваем сам шаблон. Немного пояснений. Мы выбираем Blueprint проект, потому что мы будем создавать проект используя только язык визуального программирования Blueprints. Платформу выбираем Desktop/Console, потому что игру мы будем делать на ПК. Остальные настройки ставьте либо как на скриншоте, либо по своему усмотрению. Снизу задаем директорию проекта, а также имя самого проекта. Я назвал его HabrTPS. Жмем Create Project.
![](https://habrastorage.org/getpro/habr/upload_files/2f5/cc0/947/2f5cc09475966ccc8a191a7109d1fc5a.png)
Разбираемся с интерфейсом движка
Когда откроется проект, вы увидите что-то похожее на скриншот ниже.
![](https://habrastorage.org/getpro/habr/upload_files/dce/6fd/316/dce6fd316c6aa553a84e3f3dd136ea19.png)
Самое интересное - по центру. Окошко с игровым миром. Оно также называется Viewport. Вы можете редактировать положения и вращения объектов просто кликая по ним и меняя режим редактирования с помощью кнопок W (изменение положения), E (изменение ротации), R (изменение размера). Также, зажав ПКМ, вы можете вращать камерой (перемещая мышь) и перемещаться по миру привычными WASDQE кнопками.
Далее Content Browser. В нем вы видите все ассеты, файлы с блупринтами, карты и все, что относится к вашему проекту. Любые взаимодействия с файлами проекта нужно делать строго с помощью Content Browser внутри Unreal Engine, иначе возникнут проблемы.
World Outliner - список всех объектов на карте, где мы находимся. Их можно выделять как по-одному, так и сразу несколько, выделяя через зажатый Shift или Ctrl.
Place Actors - панель, в которой вы можете найти любой интересующий вас объект и перетащить его на сцену, как в гифке ниже.
![](https://habrastorage.org/getpro/habr/upload_files/909/0d0/6de/9090d06de1eba1cbde0e85c283417eec.gif)
Запускаем шаблон в движке
Запустим шаблон в игровом режиме, нажав кнопку Play
![](https://habrastorage.org/getpro/habr/upload_files/6fc/b35/635/6fcb356356fecc71e155efa7f902e1ce.png)
Мы уже можем бегать, прыгать и осматриваться
![](https://habrastorage.org/getpro/habr/upload_files/f49/8cc/0e4/f498cc0e4c4cc666c60886cf37d58cb6.gif)
Скачиваем в проект пушки и анимации
Заходим в Unreal Marketplace и ищем Animation Starter Pack и FPS Weapon Bundle. Покупаем их (беслпатно - это все-таки покупка, да-да). В Epic games launcher жмем Add To Project и выбираем наш проект.
![](https://habrastorage.org/getpro/habr/upload_files/b37/f95/39c/b37f9539c93a045483ddcaec560dada4.png)
![](https://habrastorage.org/getpro/habr/upload_files/bd0/d08/de5/bd0d08de5bdf39e8db9b73a07ee5a18d.png)
Если в списке проекта вдруг не будет нашего проекта, то не пугайтесь, а просто жмите на галочку Show All Projects, выбирайте последнюю версию и добавляйте набор к проекту, несмотря на предупреждение о несовместимости версий.
Теперь наборы отображаются в Content Browser и мы можем использовать их для нашего проекта.
![](https://habrastorage.org/getpro/habr/upload_files/a99/823/0a1/a998230a109aaa474824c075e871f791.png)
Заменяем стандартного персонажа на боевого
В наборе который мы добавили уже есть персонаж с настроенными анимациями, поэтому мы воспользуемся именно им в целях упрощения процесса.
Нам нужно выделить нашего игрового персонажа и нажать Backspace или Delete, чтобы удалить его.
![](https://habrastorage.org/getpro/habr/upload_files/741/5ef/d76/7415efd7604c305948486ea684e0fc51.gif)
После этого ищем в папке AnimStarterPack персонажа, который называется Ue4ASP_Character и перетаскиваем его в Viewport.
![](https://habrastorage.org/getpro/habr/upload_files/808/516/5dd/8085165dd8058633aabdd8204be28c0c.gif)
Теперь, чтобы мы автоматически начинали игру именно за этот персонаж, нам необходимо в панели Details установить Auto Possess Player - Player0
![](https://habrastorage.org/getpro/habr/upload_files/48c/fd1/adb/48cfd1adb9718cc936705e4b6163b2c7.gif)
Затем, когда мы нажмем Play, мы начнем играть за нового персонажа.
![](https://habrastorage.org/getpro/habr/upload_files/8c1/3e0/096/8c13e00961d0f8ee25e345f006ed3918.gif)
Выдаем оружие персонажу
Сейчас нам в первый раз нужно будет взаимодействовать с так называемым Блупринтом персонажа. Для того, чтобы открыть редактор - нужно найти блупринт персонажа (ранее мы перетаскивали его на игровую карту) и два раза кликнуть по нему.
Вы увидите что-то похожее на скриншот ниже
![](https://habrastorage.org/getpro/habr/upload_files/013/853/083/013853083517f84523cd84e785369ab4.png)
Нас сейчас интересуют вкладки Construct script и Viewport. Во viewport мы можем увидеть как будет выглядеть то, что мы насоздавали в нашем блупринте в игровом мире. А в Construction script находится логика, которая выполняется каждый раз, когда мы меняем положение нашего персонажа в редакторе в сцене и/или когда персонаж появляется в игровом мире. В дальнейшем воспринимайте Construction script как кусок кода, который выполняется всякий раз, когда персонаж проходит инициализацию (в т.ч. и после изменения свойств). Открываем вкладку Construction script. Видим следующее.
![](https://habrastorage.org/getpro/habr/upload_files/192/ffc/ead/192ffcead4cc6c0dee012a9a024c476f.png)
Перемещаться по рабочей области мы можем, зажав ПКМ.
Следующее, что нам нужно сделать - это выдать оружие нашему персонажу. В Unreal Engine для таких вещей существует система компонентов. На каждый объект, который может находиться на карте, можно повесить компоненты. Каждый компонент наделяет объект теми или иными свойствами.
![](https://habrastorage.org/getpro/habr/upload_files/b64/57c/2aa/b6457c2aa9211da392d96f62a4aa5ec5.png)
Мы видим, что на нашем персонаже уже есть компоненты. Теперь кратко по каждому.
Capsule Component (коллизия, то, что позволяет нашему персонажу соприкасаться с окружающим его миром, для столкновений в играх используется облегченная модель коллизий, такие как капсула - для упрощения расчетов и увеличения FPS, как следствие)
Arrow (визуальная стрелочка, которая не отображается в игре, полезна исклютельно для редактирования и удобства работы дизайнеров)
Mesh (тело нашего персонажа, именно этот компонент отвечает за то, что тело отображается, а также именно на нем проигрываются все анимации)
CameraBoom (умный компонент, который следит за положением камеры и приближает ее к персонажу, если она упирается в стену. таким образом мы не проходим сквозь стену нашей камерой)
PlayerCamera (камера от лица которой мы видим все происходящее в игре)
Character Movement (наделяет нашего персонажа возможностью передвигаться, прыгать, плавать, летать и делать очень много всего. у меня есть информация еще не для одной статьи именно про него)
Нам нужно добавить оружие. Нажимаем на Add Component и ищем Skeletal Mesh и перетаскиваем его на компонент Mesh, чтобы закрепить компонент на теле нашего персонажа.
![](https://habrastorage.org/getpro/habr/upload_files/e1a/610/445/e1a61044597c42058ddcf8f984dc9b36.gif)
Теперь нужно поставить модель нашего оружия внутрь этого компонента, чтобы оно отображалось. Я выберу AK 47.
![](https://habrastorage.org/getpro/habr/upload_files/9af/d4a/65e/9afd4a65efdb5d3595af0368c4117433.gif)
Но, как мы видим, оружие находится не в руках у персонажа, а в ногах. Вот именно здесь мы и используем Construct Script. Заходим внутрь Construct Script, жмем ПКМ по пустой области и находим команду (в дальнейшем буду называть их нодами) Attach Component To Component (Skeletal mesh). После добавления оно должно выглядеть вот так.
![](https://habrastorage.org/getpro/habr/upload_files/353/3a6/940/3533a6940ead190949bd11eec238770a.png)
Теперь нам нужно с помощью простого зажатия обведенного Пина (соединения) соединить эти две ноды как показано на скриншоте ниже. Таким образом после команды Construction Script (а точнее не команды, а начала функции) выполнится команда AttachComponentToComponent.
![](https://habrastorage.org/getpro/habr/upload_files/1c7/1d5/eb9/1c71d5eb90142b6d09c74fbb0f7275e9.png)
Как понятно по названию, нода прикрепляет один компонент к другому. У нас уже указан Target (т.е. то, что мы прикрепляем), но не указан Parent (к чему мы будем крепить Target). Просто перетягиваем Drag&Drop операцией компонент Mesh на граф и подсоединяем его в Parent.
![](https://habrastorage.org/getpro/habr/upload_files/bd1/78d/31e/bd178d31e4ef359cfb702533ddcef059.gif)
Далее нам необходимо указать кость, на которую будет крепиться оружие. Указывайте hard_r в поле Socket Name.
Должно получиться вот так.
![](https://habrastorage.org/getpro/habr/upload_files/151/312/3c9/1513123c9fe89558ccd2705ca37053d2.png)
Для того, чтобы наш персонаж обновился - нужно нажать кнопку Compile внутри нашего блупринта.
Теперь нам нужно зайти в Viewport блупринта, выбрать компонент оружия и настроить его локацию и ротацию, чтобы оружие смотрелось естественно. У меня получилось вот так.
![](https://habrastorage.org/getpro/habr/upload_files/f1a/313/4ab/f1a3134ab0238347b08bde4a5bb5d455.png)
Ура! У нас есть оружие.
Стрельба методом HitScan
В игровой индустрии распространены два основных метода стрельбы. Физическими пульками, которые действительно летят по баллистике и врезаются в объекты. И так называемая лучевая стрельба (или же HitScan). HitScan выстреливает лучем (без баллистики) и поражает цель мгновенно. Такой подход используется в огромном количестве современных соревновательных и не только игр.
Вопреки многим убеждениям, в играх от третьего лица стрельба HitScan происходит не из дула пушки, а из центра нашего экрана по направлению, куда мы смотрим. Сейчас мы с вами сделаем стрельбу и отрисовку луча по нажатию ЛКМ. Стрельба пока что будет не функциональной, но сейчас нам нужно подготовить механику к дополнительной "докрутке", а нанесение урона, эффекты выстрела и прочие радости жизни будем делать в следующих частях.
Итак, первое, что нам нужно сделать - понять, что игрок нажал ЛКМ. Для этого идем в EventGraph, нажимаем ПКМ по пустой области и ищем ноду Left Mouse Button.
![](https://habrastorage.org/getpro/habr/upload_files/0b6/45d/e06/0b645de06680e86517e716299b9edb4e.gif)
Нас интересует нажатие на кнопку, поэтому мы будем работать с выходным пином Pressed. По знакомой схеме ищем ноду LineTraceByChannel, именно она будет запускать луч. Соединяем эту ноду с пином Pressed.
![](https://habrastorage.org/getpro/habr/upload_files/e81/d84/8a5/e81d848a5b2a3241f26083dcca39b49c.png)
Теперь нам необходимо указать точки откуда мы пускаем луч и куда мы пускаем луч. Стартовая точка, как я говорил ранее - это центр экрана. Но вот незадача. Экран у нас двухмерный, а мир у нас трехмерный. Т.е. курсор мы передвигаем по плоскости, которая находится во фруструме камеры (так называется усеченная пирамида, от ближней поскости которой мы и видим мир - она по сути и является нашим экраном)
![](https://habrastorage.org/getpro/habr/upload_files/c64/eda/df4/c64edadf4e43350b3bcb0fd1352cdf8b.png)
Помочь получить проекцию двумерного экрана на трехмерный мир нам поможет нода Deproject Screen To World.
Из нод, что вы видите на скриншоте, соберите вот такую конструкцию.
![](https://habrastorage.org/getpro/habr/upload_files/f5e/d2e/f62/f5ed2ef6290aee63a632251dc8b31466.png)
Deproject Screen To World принимает PlayerController (о нем не сегодня) и позицию экрана в пикселях, чтобы нам получить центр экрана - нам необходимо взять размеры всего экрана и поделить их пополам с помощью ноды деления (ее можно найти как Vector2D/float). Теперь в пине WorldPosition будет проекция экранной плоскости на 3Д мир - эта точка пойдет, как точка начала луча. Соединим все как показано ниже.
![](https://habrastorage.org/getpro/habr/upload_files/01b/54b/ac0/01b54bac0670226d501b5f16ea884c5a.png)
Теперь необходимо указать точку куда мы будем пускать луч. У нас также есть пин WorldDirection (который является направляющим вектором, который указывает в мировых координатах куда направлен перпендикуляр к плоскости экрана). Если вы не знакомы с основами векторной алгебры, то очень советую ознакомиться с этой статьей.
Предположим, что хотим пускать луч на 10000 едениц вперед (кстати по умолчанию единица в координатах - это 1 сантиметр). Таким образом пользуясь вектором направления создаем вот такую конструкцию.
![](https://habrastorage.org/getpro/habr/upload_files/a6f/c3e/428/a6fc3e4287eddf768974d42f362561ea.png)
И единственное, что нам осталось - это добавить отрисовку нашего луча. Нажимаем на стрелочку на ноде трейса и ставим настройки как на скриншоте ниже.
![](https://habrastorage.org/getpro/habr/upload_files/b8a/5c8/b95/b8a5c8b95fa3b8a5366692bda2d46a07.png)
Не забываем нажать кнопку Compile и идем тестировать в игре.
![](https://habrastorage.org/getpro/habr/upload_files/63a/d73/f3a/63ad73f3a5351dd303319c1339db34e8.gif)
Лучи отрисовываются, как мы и ожидали. Вот именно таким образом происходит стрельба в подавляющем количестве игр от третьего лица с HitScan методом стрельбы.
Что дальше?
Сегодня вы научились основам работы с Unreal Engine, настроили своего персонажа и научились стрелять лучами. Это уже очень круто, но впереди еще очень много интересного и сложного, что предстоит узнать. В следующих уроках этого цикла статей я расскажу и покажу, как добавить противников, настроить их логику, наносить им урон, добавить различные эффекты на выстрел, добавить прицел и собрать вашу игру на Windows в готовый .exe файл, чтобы отправить друзьям.
Лучшей благодарностью за статью будет активность и плюсик к статье. Всем спасибо за ваше время, увидимся еще в Нереальном Движке.
А всех, кто хочет подробнее узнать о нашем урсе, приглашаю на бесплатный вебинар, в рамках которого вы сможете познакомиться с программой курса и подробно узнать о процессе обучения.
Зарегистрироваться на вебинар по ссылке
Комментарии (4)
Heinhain
30.09.2021 20:35+1Почему бы не настроить сразу GameMode для спавна игрока (сразу знакомство с фреймворком)? Было бы куда как логичнее, потому что потом все равно к нему возвращаться. Трейсы же с таким же успехом можно и с позиции камеры пускать, разве нет? Тут уже было бы проще - берется позиция объекта и так существующего в мире, его направление и т.д.
theedge
27.10.2021 22:26Даже по такому подробному уроку сложно. Запомнить это все, чтобы потом без подглядывания делать - вообще не понимаю как. Что-же дальше будет)) Но очень интересно!
agranom555
А на UE5 сильно отличия будут?
artarasov Автор
Нет, почти не будет ничего отличиться. В UE5 поменялись ноды математических операций. Они там универсальные и меняют свои типы в зависимости от того, что вы в них втыкаете. Остальное должно быть так же.