Автор: Михаил Русаков
Данный курс научит Вас созданию игр на C++ в Unreal Engine 5. Курс состоит из 12 разделов, в которых Вас ждёт теория и практика. Причём, в качестве практики будет создан весьма крупный проект объёмом свыше 5000 строк качественного кода, который уже на практике познакомит Вас с принципами создания игр на C++ в Unreal Engine 5.
Параллельно с курсом Вы также будете получать домашние задания, результатом которых станет, в том числе, полноценная серьёзная работа для портфолио.
Помимо самого курса Вас ждёт ещё и очень ценный Бонус: «Тестирование Unreal-проектов на Python», в рамках которого Вы научитесь писать очень полезные тесты для тестирования самых разных аспектов разработки игр.
Модуль №1. Введение
В уроке будут даны важные рекомендации по эффективному прохождению курса.
В уроке скачаем и установим весь необходимый софт. Уже даже на этом этапе у новичков возникают проблемы, но благодаря этому уроку у Вас их не будет.
Совершенно необходимый инструмент, нужный для быстрого форматирования/выравнивания кода.
После этого модуля у Вас будет уже всё готово для работы в самом движке.
Модуль №2. Основы C++ в Unreal Engine
Материал этого раздела совершенно необходим, прежде чем пытаться хоть что-то делать в Unreal Engine на C++.
Создадим проект из шаблона ThirdPerson и подробно разберём каждую строчку кода. Это уже будет отличным стартом.
Достаточно важный урок, если Вы действительно хотите понять, как работает вся «магия» изнутри. Это, во-первых, может пригодиться на собеседовании, во-вторых, Вы лучше будете понимать, что делаете.
В уроке мы почистим сгенерированные классы от лишнего мусора, переименуем классы (а это не так просто сделать, как кажется), наведём порядок.
В уроке создадим C++-класс с нуля.
В рамках урока Вы познакомитесь с основными типами, которые нам предоставляет фреймворк Unreal Engine 5.
После урока Вы научитесь делать записи в лог, в том числе, выводя переменные самых разных типов. Это необычайно важные знания, особенно, когда речь заходит об отладке.
Подробно обсудим этот важнейший макрос в Unreal Engine.
Разберём аналог Construction Script из Blueprint, но в рамках C++.
Разберём эту группу макросов, которые очень важны, если Вы хотите писать качественный код.
Ещё один фундаментальный макрос, который мы тщательно обговорим.
Обсудим создание структур в C++, которые будут доступны, в том числе, и в Blueprint.
После этого урока Вы научитесь создавать перечисления в C++ для Unreal Engine.
Это эквивалент Event Dispatcher из Blueprint. И из урока Вы узнаете, как создавать делегаты с параметрами или без, только для C++ или для C++ и Blueprint.
Обсудим процедуру создания виджетов с использованием C++. Здесь очень много тонкостей и нюансов, дойти до которых можно лишь, имея большой опыт. Но Вы получите всё и сразу в этом уроке.
После этого урока Вы научитесь использовать таймеры в C++.
Функция Delay является очень часто используемой (гораздо чаще, чем надо, кстати), и как её реализовать в C++ мы и обсудим.
В уроке мы разберём процедуру создания и применения интерфейсов на C++, которая доступна благодаря фреймворку Unreal Engine.
После данного раздела Вы уже будете иметь очень серьёзную базу. Даже этих знаний уже достаточно, чтобы уверенно начать программировать на C++ в Unreal Engine. Но, безусловно, это пока всего лишь теория с абстрактными примерами. А ведь гораздо лучше всё усваивается, когда после теории идёт наглядный пример. И вот во всех последующих разделах будет создаваться достаточно серьёзный проект на C++.
Модуль №3. Создание игры: подготовка проекта
Материал этого раздела совершенно необходим, прежде чем пытаться хоть что-то делать в Unreal Engine на C++.
Один из ценнейших уроков курса, в котором мы, во-первых, подробно разберём то, что мы будем создавать. Во-вторых, Вы научитесь писать свои технические задания (для себя или для других), узнаете про итеративные методики создания ПО, поймёте, как, в целом, строится pipeline разработки.
Сделаем все необходимые стартовые вещи.
Добавим персонажа для игрока, импортируем анимации, наведём порядок.
Добавим животных и все необходимые ассеты для них.
Поскольку у нас будет создаваться инвентарь в будущем, мы заранее добавим сами предметы в наш проект, чтобы потом на этом не останавливаться.
Модуль №3. Создание игры: подготовка проекта
Материал этого раздела совершенно необходим, прежде чем пытаться хоть что-то делать в Unreal Engine на C++.
Один из ценнейших уроков курса, в котором мы, во-первых, подробно разберём то, что мы будем создавать. Во-вторых, Вы научитесь писать свои технические задания (для себя или для других), узнаете про итеративные методики создания ПО, поймёте, как, в целом, строится pipeline разработки.
Сделаем все необходимые стартовые вещи.
Добавим персонажа для игрока, импортируем анимации, наведём порядок.
Добавим животных и все необходимые ассеты для них.
Поскольку у нас будет создаваться инвентарь в будущем, мы заранее добавим сами предметы в наш проект, чтобы потом на этом не останавливаться.
Модуль №5. Создание игры: AI
В рамках этих уроков мы реализуем на C++ всю логику искусственного интеллекта для животных.
Создадим основной контроллер, который будет своего рода «пультом», отвечающего за включение и выключение тех или иных компонентов, которые будут созданы впоследствии.
Создадим базовый AI-компонент, от которого будут наследоваться остальные.
При запуске в контроллере этого компонента животные будут спокойно прогуливаться по территории недалеко от своего спавна.
Если животное увидит противника, то немедленно начнёт от него убегать до тех пор, пока расстояние не будет безопасным. Как реализовать подобную логику, Вы узнаете в этом уроке.
В уроке мы возьмём созданные компоненты и подключим их к нашему контроллеру, а также настроим логику их включения/выключения.
Создадим спавнер для животных (вообще говоря, он подойдёт для любых Actor), который можно будет в редакторе вытащить на сцену и настроить.
Модуль №6. Создание игры: инвентарь
В рамках этого раздела мы будем создавать техническую часть инвентаря для нашей игры.
В этом уроке Вы увидите, как можно добавить свои собственные настройки в Project Settings, доступ к которым потом получить из кода на C++.
В уроке мы создадим структуру для предметов, а также таблицу с ними, которую будет очень легко заполнять, добавляя всё новые и новые предметы в игру.
В уроке Вы узнаете, как использовать DataTable, создадим необходимые Helper и, само собой, сам класс предмета.
Я своими глазами видел, как один «учитель» с очень положительными комментариями под его видео создавал инвентарь в виде Actor (видимо, у инвентаря по мнению автора есть местоположение и поворот в мире), а попутно хранил сами предметы в массиве опять же типа Actor. Мы же всё с Вами реализуем, как полагается: с интерфейсом, с хранением только RowName и в виде ActorComponent.
Реализуем подбирание предметов и добавление их в инвентарь.
Чтобы в начале игры у наших персонажей (игрока и животных) были уже какие-то предметы в инвентаре, мы реализуем и добавим необходимый для этого компонент.
Модуль №7. Создание игры: виджеты
В рамках этого большого раздела будут созданы все необходимые виджеты. Помимо большого объёма C++-кода, здесь нам потребуется использовать и редактор виджетов для их вёрстки.
В уроке разберём, зачем нужен наш собственный базовый класс для всех виджетов, и создадим его.
Поскольку кнопки мы будем использовать многократно в других виджетах, разумно создать отдельный виджет для неё, чтобы всегда можно было поменять её дизайн, а, по сути, автоматически изменить дизайн всех остальных виджетов.
Непосредственно создадим логику виджета и сделаем его вёрстку.
Создадим компонент, который будет отвечать за вывод виджета при наведении на объекты мира (например, на предметы, которые можно подобрать) с информацией о них и о том, как с ними взаимодействовать.
Объединим созданный виджет из позапрошлого урока с компонентом из прошлого и подключим всё это, например, в тот же класс предмета.
Создадим и выведем виджет, который будет доступен во время игры.
Создадим виджет слотов инвентаря.
Полностью создадим весь виджет инвентаря, включая логику и вёрстку.
Используя делегат, реализуем механизм открытия и закрытия инвентаря.
Реализуем механизм, при котором, подбирая или тратя предметы в инвентаре, у нас будет писаться соответствующее сообщение.
Реализуем паттерн Strategy, благодаря которому мы гибко сможем делать обработку нажатий на предмет в инвентаре.
Создадим виджет для главного меню.
В уроке обработаем кнопки главного меню.
Процесс перехода из главного меню на уровень игры занимает некоторое время, на протяжении которого желательно вывести какой-нибудь загрузочный виджет, чем мы и займёмся в этом уроке.
Реализуем логику появления и плавного исчезновения загрузочного экрана.
В этом уроке мы создадим меню паузы.
Из этого урока Вы узнаете, как правильно реализовать функционал переключения видимости виджета с помощью нажатия одной и той же кнопки.
В меню паузы будет несколько кнопок, обработку которых мы реализуем в этом уроке.
Добавим свой собственный курсор в нашу игру.
Модуль №8. Создание игры: лук и экипировка
В этом разделе мы займёмся созданием механизма экипировки и стрельбы из лука.
В уроке будет создан общий класс для любого оружия.
Поскольку в игре тетива лука будет натягиваться, нам потребуется AnimInstance и AnimBlueprint, чем мы и займёмся в этом видео.
Данный компонент будет являться общим для любых других компонентов-экипировки.
Создадим компонент экипировки, который подойдёт для любого оружия. Всю общую логику, характерную именно для экипированного оружия, мы пропишем в этом компоненте.
Реализуем компонент, который будет отвечать за экипировку лука.
Реализуем класс для стрелы, которая будет лететь по баллистическому закону.
Создадим класс для лука.
Реализуем нужную стратегию и экипируем уже сам лук, путём клика по нему на слот в инвентаре.
Реализуем саму стрельбу из лука, а так же сделаем так, чтобы при попадании стрелы в голову, наносился повышенный урон.
Сделаем сбор ресурсов с животных и добавление их в инвентарь.
Модуль №9. Создание игры: магазины
В рамках этого раздела мы реализуем механизм магазинов. У нас будут магазины, которые скупают товары (например, кожу и мясо), а будут магазины, которые продают товар (например, различные луки и стрелы).
В уроке мы создадим общую логику для любых магазинов.
Реализуем магазин, который будет скупать соответствующие предметы у игрока, когда тот взаимодействует с магазином.
Создадим логику магазина, который продаёт различные предметы. И при взаимодействии с ним игрок сможет делать покупки.
Модуль №10. Создание игры: смена времени суток
В этом разделе мы создадим динамическую смену дня и ночи.
Поскольку солнце будет двигаться, то мы заранее создадим CurveFloat, в котором опишем движение солнца.
Напишем основной класс, в котором можно будет задавать текущее время, а также в котором будет происходить его течение.
В уроке добавим Луну и подключим к нашей системе., причём не только с её движением по небосводу, но и с фазами луны.
Настроим движение Луны по небосводу, а дополнительно сделаем и плавное изменение фаз Луны.
Модуль №11. Создание игры: звуки и музыка
В рамках этого раздела мы добавим в наш код проигрывание самых разных звуков и музыки.
Натягивание тетивы, выстрел из лука, попадание стрелы – для всего этого мы добавим звуки.
Достаточно простой урок, в котором мы обойдёмся без программирования.
Добавим различные звуки для животных. Они будут проигрываться произвольным образом в случайное время.
Поскольку часть нашего мира будет покрыта лесами, то разумно будет сделать правильную атмосферу в нём с помощью звуков, чем мы и займёмся в этом уроке.
Добавим фразу персонажа при попытке уйти за границы карты.
Объекты данных классов будут вызываться во время проигрывания анимации. Таким образом, в определённые моменты анимации мы сможем выполнить определённую логику.
В рамках этого урока мы, используя класс AnimNotify из прошлого урока, реализуем проигрывание звуков шагов в зависимости от поверхности под ногами персонажа.
Добавим музыку в игру.
Модуль №12. Создание игры: игровой уровень
Заключительный раздел, в котором мы соберём все наши уже работающие механики в рамках игрового уровня, а также сделаем и протестируем готовую сборку.
Проведём небольшой рефакторинг для улучшения кода.
Заменим классические Input на Enhanced Input, которые уже на данный момент являются стандартом Unreal Engine 5.
В уроке мы импортируем необходимые ассеты для дизайна уровня.
Используя импортированные ассеты, создадим мир нашей игры.
Добавим все необходимые элементы: спавнеры животных, звуки леса, навигационную сетку, магазины, дом ловчего, стартовые предметы и много чего ещё по мелочи.
Соберём и протестируем shipping-версию.
Важные слова напутствия и советы, в каком направлении стоит двигаться дальше, исходя из моего опыта.