C++ в Unreal Engine 5. За 81 день Вы научитесь создавать игры на C++ в Unreal Engine 5, увидите наглядный пример создания игры, создадите свой собственный серьёзный проект для портфолио, и всё это с нуля! Дать Вам всю необходимую базу для создания Ваших C++ проектов на Unreal Engine 5. Дать Вам достаточно знаний для устройства на работу в игровую студию. Заинтересовать Вас на дальнейшее развитие в области геймдева.
Для кого этот курс?
- Для тех, кто ещё на слабом уровне владеет C++, и хочет повысить свой навык работы в нём, а параллельно с этим научиться применять его при создании игр в Unreal Engine. Если знания по C++ отсутствуют полностью, то ниже по тексту я расскажу, что делать в этом случае.
- Для тех, кто уже хорошо владеет C++ и хочет освоить фреймворк Unreal Engine в разы быстрее и интереснее, чем самостоятельно, а также не хвататься постоянно за сердце, когда очередной «туторщик» хардкодит, вызывает виртуальные функции из конструктора, делает все переменные класса открытыми и тому подобное.
- Для тех, кто хочет трудоустроиться на работу в игровую студию программистом. Думаю, не нужно пояснять, что умеющих «программировать» на Blueprint вагон и маленькая тележка, а вот хороших C++-программистов днём с огнём не сыщешь. Поэтому если Вы хотите иметь конкурентное преимущество перед другими (и, само собой, более высокую зарплату), то этот курс обязателен.
- Для тех, кто хочет создать серьёзный проект. Далеко не весь функционал можно сделать на Blueprint. В первую очередь, это касается сетевых игр. Во-вторых, Blueprint в несколько раз медленнее работает, чем C++, и при тяжёлой логике – это очень критично.
Программа курса:
Курс состоит из 105 уроков (101 в основном + 4 в бонусном) общей продолжительностью более 31-го часа. Сам курс разбит на 12 разделов. Первые 2 раздела – это теория, оставшиеся 10 частей – это практика, в рамках которой Вы увидите создание достаточно сложного и крупного (для одного человека) проекта на более, чем 5000 строк качественного кода.
Игра будет про средневекового ловчего, а функционал игры можно посмотреть ниже в описании разделов и уроков.
Модуль 1. Введение
1. Как проходить курс? В уроке будут даны важные рекомендации по эффективному прохождению курса.
2. Установка необходимого ПО В уроке скачаем и установим весь необходимый софт. Уже даже на этом этапе у новичков возникают проблемы, но благодаря этому уроку у Вас их не будет.
3. Установка и настройка clang-format Совершенно необходимый инструмент, нужный для быстрого форматирования/выравнивания кода.
Модуль 2. Основы C++ в Unreal Engine
1. Создание первого проекта. Создадим проект из шаблона ThirdPerson и подробно разберём каждую строчку кода. Это уже будет отличным стартом.
2. Как работает движок изнутри? Достаточно важный урок, если Вы действительно хотите понять, как работает вся «магия» изнутри. Это, во-первых, может пригодиться на собеседовании, во-вторых, Вы лучше будете понимать, что делаете.
3. Рефакторинг шаблона от третьего лица. В уроке мы почистим сгенерированные классы от лишнего мусора, переименуем классы (а это не так просто сделать, как кажется), наведём порядок.
4. Создание C++-класса. В уроке создадим C++-класс с нуля.
5. Типы данных. В рамках урока Вы познакомитесь с основными типами, которые нам предоставляет фреймворк Unreal Engine 5.
6. Логирование. После урока Вы научитесь делать записи в лог, в том числе, выводя переменные самых разных типов. Это необычайно важные знания, особенно, когда речь заходит об отладке.
7. Макрос UPROPERTY. Подробно обсудим этот важнейший макрос в Unreal Engine.
8. Construction Script в C++. Разберём аналог Construction Script из Blueprint, но в рамках C++.
9. Asserts. Разберём эту группу макросов, которые очень важны, если Вы хотите писать качественный код.
10. Макрос UFUNCTION. Ещё один фундаментальный макрос, который мы тщательно обговорим.
11. Структуры. Обсудим создание структур в C++, которые будут доступны, в том числе, и в Blueprint.
12. Перечисления. После этого урока Вы научитесь создавать перечисления в C++ для Unreal Engine.
13. Делегаты. Это эквивалент Event Dispatcher из Blueprint. И из урока Вы узнаете, как создавать делегаты с параметрами или без, только для C++ или для C++ и Blueprint.
14. Виджеты. Обсудим процедуру создания виджетов с использованием C++. Здесь очень много тонкостей и нюансов, дойти до которых можно лишь, имея большой опыт. Но Вы получите всё и сразу в этом уроке.
15. Таймеры. После этого урока Вы научитесь использовать таймеры в C++.
16. Delay. Функция Delay является очень часто используемой (гораздо чаще, чем надо, кстати), и как её реализовать в C++ мы и обсудим.
17. Интерфейсы. В уроке мы разберём процедуру создания и применения интерфейсов на C++, которая доступна благодаря фреймворку Unreal Engine.
Модуль 3. Создание игры: подготовка проекта
1. Разбор технического задания. Один из ценнейших уроков курса, в котором мы, во-первых, подробно разберём то, что мы будем создавать. Во-вторых, Вы научитесь писать свои технические задания (для себя или для других), узнаете про итеративные методики создания ПО, поймёте, как, в целом, строится pipeline разработки.
2. Создание и настройка проекта. Сделаем все необходимые стартовые вещи.
3. Добавление персонажа. Добавим персонажа для игрока, импортируем анимации, наведём порядок.
4. Добавление животных. Добавим животных и все необходимые ассеты для них.
5. Добавление предметов. Поскольку у нас будет создаваться инвентарь в будущем, мы заранее добавим сами предметы в наш проект, чтобы потом на этом не останавливаться.
Модуль 4. Создание игры: основные классы и компоненты
1. Создание уровней и GameMode. Создадим карту для тестового уровня, для главного меню, а так же необходимые GameMode.
2. Создание класса персонажа и игрока. После этого урока у нас уже будет готовый персонаж с видом от первого лица, которым можно управлять. Оба класса будут созданы с нуля.
3. Создание AnimInstance и AnimBlueprint. В рамках этого урока мы создадим необходимый интерфейс (чтобы не было лишних зависимостей), реализуем его, применим. Так же создадим AnimInstance, который ближе к концу урока ляжет в основу AnimBlueprint.
4. Создание класса животных и их AnimBlueprint. Создадим класс для животных, которые в будущем будут жить своей жизнью. Также благодаря нашему классу AnimInstance, созданному ранее, Вы увидите, насколько приятно создавать AnimBlueprint для самых разных персонажей.
5. Создание HUD. Создадим HUD, основа которого нам пригодится в будущем.
6. Создание «границы». Сделаем так, что если игрок попытается уйти за пределы карты, то его возвращало обратно на уровень. Подобная механика реализована в таких играх как «Ведьмак 3: Дикая охота» и «Kingdom Come Deliverance».
7. Создание компонента взаимодействия. Создадим компонент, который позволит нам взаимодействовать с внешним миром (например, взаимодействовать с магазином, поднимать предметы).
8. Создание компонента здоровья. Думаю, не нужно пояснять, что просто добавить переменную Health в класс персонажа – это плохая идея. Это классический пример нарушения принципа единственной ответственности класса. В общем, в уроке мы всё сделаем правильно.
9. Создание компонента для выносливости. Поскольку в будущем быстрый бег и прицеливание из лука будут расходовать выносливость, нам необходимо заранее написать компонент для выносливости.
10. Создание компонента CharacterMovementComponent. Поскольку у нас есть режим спринта, а также расходование выносливости в этом режиме, мы реализуем свой компонент для передвижения, попутно заменив в классе персонажа базовый компонент своим.
11. Режим спринта и расход выносливости. Реализуем спринт, плюс расход выносливости от него.
12. Создание компонента камеры. При расходе выносливости у нас будет искажаться и затемняться экран, поэтому будет разумным создать свой компонент камеры, чем мы и займёмся.
13. Создание компонента CameraShakeSourceComponent. Данный компонент будет создавать тряску при прицеливании из лука. Более того, чем ниже выносливость, тем сильнее будет тряска (и тем сложнее будет прицелиться).
Модуль 5. Создание игры: AI
1. Создание AnimalAIController. Создадим основной контроллер, который будет своего рода «пультом», отвечающего за включение и выключение тех или иных компонентов, которые будут созданы впоследствии.
2. Создание базового AI-компонента. Создадим базовый AI-компонент, от которого будут наследоваться остальные.
3. Создание компонента патрулирования. При запуске в контроллере этого компонента животные будут спокойно прогуливаться по территории недалеко от своего спавна.
4. Создание компонента для убегания от противника. Если животное увидит противника, то немедленно начнёт от него убегать до тех пор, пока расстояние не будет безопасным. Как реализовать подобную логику, Вы узнаете в этом уроке.
5. Подключение AI-компонентов к контроллеру. В уроке мы возьмём созданные компоненты и подключим их к нашему контроллеру, а также настроим логику их включения/выключения.
6. Создание спавнера. Создадим спавнер для животных (вообще говоря, он подойдёт для любых Actor), который можно будет в редакторе вытащить на сцену и настроить.
Модуль 6. Создание игры: инвентарь
1. Добавление своих настроек в Project Settings. В этом уроке Вы увидите, как можно добавить свои собственные настройки в Project Settings, доступ к которым потом получить из кода на C++.
2. Создание структуры и DataTable. В уроке мы создадим структуру для предметов, а также таблицу с ними, которую будет очень легко заполнять, добавляя всё новые и новые предметы в игру.
3. Создание класса предметов. В уроке Вы узнаете, как использовать DataTable, создадим необходимые Helper и, само собой, сам класс предмета.
4. Создание компонента инвентаря. Я своими глазами видел, как один «учитель» с очень положительными комментариями под его видео создавал инвентарь в виде Actor (видимо, у инвентаря по мнению автора есть местоположение и поворот в мире), а попутно хранил сами предметы в массиве опять же типа Actor. Мы же всё с Вами реализуем, как полагается: с интерфейсом, с хранением только RowName и в виде ActorComponent.
5. Сбор предметов. Реализуем подбирание предметов и добавление их в инвентарь.
6. Создание компонента стартовых предметов. Чтобы в начале игры у наших персонажей (игрока и животных) были уже какие-то предметы в инвентаре, мы реализуем и добавим необходимый для этого компонент.
Модуль 7. Создание игры: виджеты
1. Создание базового класса виджета. В уроке разберём, зачем нужен наш собственный базовый класс для всех виджетов, и создадим его.
2. Создание виджета кнопки. Поскольку кнопки мы будем использовать многократно в других виджетах, разумно создать отдельный виджет для неё, чтобы всегда можно было поменять её дизайн, а, по сути, автоматически изменить дизайн всех остальных виджетов.
3. Создание виджета для взаимодействия. Непосредственно создадим логику виджета и сделаем его вёрстку.
4. Создание компонента InteractWidgetComponent. Создадим компонент, который будет отвечать за вывод виджета при наведении на объекты мира (например, на предметы, которые можно подобрать) с информацией о них и о том, как с ними взаимодействовать.
5. Вывод виджета при взаимодействии с миром. Объединим созданный виджет из позапрошлого урока с компонентом из прошлого и подключим всё это, например, в тот же класс предмета.
6. Создание GameHUDWidget. Создадим и выведем виджет, который будет доступен во время игры.
7. Создание виджета для слота инвентаря. Создадим виджет слотов инвентаря.
8. Создание виджета инвентаря. Полностью создадим весь виджет инвентаря, включая логику и вёрстку.
9. Открытие и закрытие виджета инвентаря. Используя делегат, реализуем механизм открытия и закрытия инвентаря.
10. Создание виджета для сообщений инвентаря. Реализуем механизм, при котором, подбирая или тратя предметы в инвентаре, у нас будет писаться соответствующее сообщение.
11. Создание стратегий для инвентаря. Реализуем паттерн Strategy, благодаря которому мы гибко сможем делать обработку нажатий на предмет в инвентаре.
12. Создание главного меню. Создадим виджет для главного меню.
13. Обработка главного меню. В уроке обработаем кнопки главного меню.
14. Создание загрузочного виджета. Процесс перехода из главного меню на уровень игры занимает некоторое время, на протяжении которого желательно вывести какой-нибудь загрузочный виджет, чем мы и займёмся в этом уроке.
15. Открытие и закрытие загрузочного виджета. Реализуем логику появления и плавного исчезновения загрузочного экрана.
16. Создание меню паузы. В этом уроке мы создадим меню паузы.
17. Открытие и закрытие виджета паузы. Из этого урока Вы узнаете, как правильно реализовать функционал переключения видимости виджета с помощью нажатия одной и той же кнопки.
18. Обработка меню паузы. В меню паузы будет несколько кнопок, обработку которых мы реализуем в этом уроке.
19. Добавление курсора. Добавим свой собственный курсор в нашу игру.
Модуль 8. Создание игры: лук и экипировка
1. Создание класса оружия. В уроке будет создан общий класс для любого оружия.
2. Создание анимации лука. Поскольку в игре тетива лука будет натягиваться, нам потребуется AnimInstance и AnimBlueprint, чем мы и займёмся в этом видео.
3. Создание базового компонента для экипировки. Данный компонент будет являться общим для любых других компонентов-экипировки.
4. Создание компонента для экипировки оружия. Создадим компонент экипировки, который подойдёт для любого оружия. Всю общую логику, характерную именно для экипированного оружия, мы пропишем в этом компоненте.
5. Создание компонента для экипировки лука. Реализуем компонент, который будет отвечать за экипировку лука.
6. Создание класса стрелы. Реализуем класс для стрелы, которая будет лететь по баллистическому закону.
7. Создание класса лука. Создадим класс для лука.
8. Экипировка лука. Реализуем нужную стратегию и экипируем уже сам лук, путём клика по нему на слот в инвентаре.
9. Реализация стрельбы из лука. Реализуем саму стрельбу из лука, а так же сделаем так, чтобы при попадании стрелы в голову, наносился повышенный урон.
10. Сборка ресурсов с животных. Сделаем сбор ресурсов с животных и добавление их в инвентарь.
Модуль 9. Создание игры: магазины
1. Создание базового класса магазина. В уроке мы создадим общую логику для любых магазинов.
2. Создание класса для магазина-покупателя. Реализуем магазин, который будет скупать соответствующие предметы у игрока, когда тот взаимодействует с магазином.
3. Создание класса для магазина-продавца. Создадим логику магазина, который продаёт различные предметы. И при взаимодействии с ним игрок сможет делать покупки.
Модуль 10. Создание игры: смена времени суток
1. Создание кривой для солнца. Поскольку солнце будет двигаться, то мы заранее создадим CurveFloat, в котором опишем движение солнца.
2. Создание класса для изменения времени суток. Напишем основной класс, в котором можно будет задавать текущее время, а также в котором будет происходить его течение.
3. Добавление Луны. В уроке добавим Луну и подключим к нашей системе., причём не только с её движением по небосводу, но и с фазами луны.
4. Движение Луны и её фазы. Настроим движение Луны по небосводу, а дополнительно сделаем и плавное изменение фаз Луны.
Модуль 11. Создание игры: звуки и музыка
1. Добавление звуков лука. Натягивание тетивы, выстрел из лука, попадание стрелы – для всего этого мы добавим звуки.
2. Добавление звуков кнопки. Достаточно простой урок, в котором мы обойдёмся без программирования.
3. Добавление звуков животных. Добавим различные звуки для животных. Они будут проигрываться произвольным образом в случайное время.
4. Добавление звуков леса. Поскольку часть нашего мира будет покрыта лесами, то разумно будет сделать правильную атмосферу в нём с помощью звуков, чем мы и займёмся в этом уроке.
5. Добавление звука попытки уйти с карты. Добавим фразу персонажа при попытке уйти за границы карты.
6. Создание классов AnimNotify. Объекты данных классов будут вызываться во время проигрывания анимации. Таким образом, в определённые моменты анимации мы сможем выполнить определённую логику.
7. Добавление звуков шагов. В рамках этого урока мы, используя класс AnimNotify из прошлого урока, реализуем проигрывание звуков шагов в зависимости от поверхности под ногами персонажа.
8. Добавление музыки. Добавим музыку в игру.
Модуль 12. Создание игры: игровой уровень
1. Рефакторинг. Проведём небольшой рефакторинг для улучшения кода.
2. Замена Input на Enhanced Input. Заменим классические Input на Enhanced Input, которые уже на данный момент являются стандартом Unreal Engine 5.
3. Импорт ассетов. В уроке мы импортируем необходимые ассеты для дизайна уровня.
4. Создание игрового уровня. Используя импортированные ассеты, создадим мир нашей игры.
5. Добавление игровых элементов. Добавим все необходимые элементы: спавнеры животных, звуки леса, навигационную сетку, магазины, дом ловчего, стартовые предметы и много чего ещё по мелочи.
6. Сборка проекта. Соберём и протестируем shipping-версию.
7. Заключение. Важные слова напутствия и советы, в каком направлении стоит двигаться дальше, исходя из моего опыта.
Бонус. Тестирование Unreal-проектов на Python
Чему Вы научитесь?
- Научитесь реализовывать любые игровые механики с помощью C++.
- В десятки раз сократите время на решение проблем, связанных с компиляцией кода и вообще с его работоспособностью.
- Перестанете испытывать постоянные затыки на каждом углу.
- Начнёте писать гораздо более грамотный код, который будет приятно показать коллеге или работодателю.
- Научитесь тестировать Unreal-проекты с помощью Python.