Курс C++ для Unreal Engine 5
Изучайте C++ с нуля и программирование Unreal Engine 5: задания, память, ООП, геймплей, репликация, GAS и архитектура движка.
Учимся программировать на C++ с нуля и постепенно переходим к коду внутри Unreal Engine — с практикой в каждом уроке. Это не жёсткий линейный курс: каждая тема самодостаточна, объясняет себя сама и заканчивается небольшим заданием прямо на странице, а проходить их можно в своём темпе. Encyclopedia рядом — про то же самое, но глубже: туда Learning отправляет ссылками, когда тема выходит за пределы одного урока.
Learning и Encyclopedia — два направления одного сайта, с общим аккаунтом, темой и переключателем языка. Как только урок Learning вводит понятие Unreal, он ссылается на соответствующую deep-dive статью Encyclopedia — не дублируя её, а дополняя практикой на пути к этой теме.
Весь путь выше (00…19) строится вокруг C++ и архитектуры Unreal на AActor/UActorComponent — это единственный обязательный маршрут курса, ничего в нём не требует ECS. Внизу этой страницы есть также ECS Bonus Track — необязательная ветка на 7 уроков для тех, кто прошёл Stage 03 (OOP) и хочет расширить архитектурное мышление сравнением с Data-Oriented Design и Mass Entity. Честное объяснение, почему курс держит эту границу, — в разделе «OOP — фундамент курса, а не единственный способ мыслить об архитектуре» на странице Философия движка.
Путь: C++ → Unreal Gateway
- Что такое программа и как она запускается
- Инструкции и выражения
- Как думает программист
- Переменные, идентификаторы и типы
- Основные типы данных
- Операторы: арифметика, сравнение, логика
- Условия: if, else, switch
- Циклы: while, do-while, for
- Функции: параметры, аргументы, return
- Область видимости, ввод и итоговая практика
- Зачем нужны классы
- Методы, модификаторы доступа, инкапсуляция
- Конструктор, параметры, initializer list
- this, деструктор, время жизни объекта
- Композиция и агрегация
- Наследование, базовый и производный класс
- virtual, override, полиморфизм
- Абстрактный класс, чистая virtual-функция, интерфейс
- Композиция vs наследование, владение, связи объектов
- Иерархия классов персонажей: капстоун стадии
- auto и вывод типов
- nullptr в Modern C++, лямбда-выражения
- Захват в лямбдах, std::function
- unique_ptr, make_unique
- shared_ptr, make_shared, weak_ptr
- Владение, RAII, время жизни ресурса
- Копирование vs перемещение, std::move
- std::optional и std::variant
- constexpr, noexcept, современный C++
- Капстоун Stage 04: party без единого raw new/delete
- Header/Source, объявление и определение, #pragma once
- #include, порядок подключения, forward declaration
- Translation unit, namespace, оператор ::
- Линковка, циклические зависимости
- Coupling, cohesion, направление зависимостей
- Композиция систем, интерфейс-ориентированный дизайн
- Указатели на функции, callback
- Событийная модель, делегат как концепция
- Manager и System как архитектурные роли
- Границы модулей, SOLID на практике
- Рефакторинг: плохая и хорошая архитектура
- Организация проекта, подготовка к Pure C++ проекту
- Ошибки компиляции, линковки и выполнения
- Отладка: точки останова, стек вызовов, переменные
- Unreal-проект: .uproject, Source, структура
- Build: Build.cs и Target.cs
- Модули: IModuleInterface, IMPLEMENT_MODULE
- UHT: Unreal Header Tool, .generated.h
- Reflection: что значит «рефлексия» в Unreal
- UCLASS: спецификаторы Blueprintable, Abstract
- UPROPERTY: спецификаторы, GC и указатели
- UFUNCTION: BlueprintCallable, BlueprintPure
- USTRUCT: F-префикс и отличие от UCLASS
- UENUM: BlueprintType и обязательный uint8
- UObject: корень reflected-иерархии Unreal
- Garbage Collection: mark-and-sweep вместо delete
- CDO: Class Default Object — эталонный экземпляр класса
- Outer: организационная принадлежность, не время жизни
- Создание UObject: NewObject и CreateDefaultSubobject
- Указатели на UObject: UObject*, TObjectPtr, TWeakObjectPtr
- Полный жизненный цикл UObject — капстоун Stage 08
- UWorld: контейнер игрового мира
- AActor: наконец объяснённый базовый класс
- UActorComponent: композиция, инженерная под Unreal
- Transform: FTransform, USceneComponent, иерархия
- Коллизия: каналы, Overlap vs Block, события
- SpawnActor: почему AActor не использует NewObject
- Destroy(): конец жизни актора — капстоун Stage 09
- APawn: актор, предназначенный для управления
- ACharacter: Pawn с готовым движением
- AController: кто управляет Pawn'ом
- APlayerController: живой игрок за клавиатурой
- APlayerState: что переживает респаун
- AGameModeBase: правила, которых нет на клиенте
- AGameStateBase: публичный снимок правил
- UGameInstance: то, что переживает смену уровня
- Subsystems: объекты, которые создаёт сам движок
- Delegates: события вместо прямых вызовов
- UDataAsset: данные как редактируемый контент
- UPrimaryDataAsset: идентификатор вместо жёсткой ссылки
- DataTable: много однотипных строк данных
- AssetManager: асинхронная загрузка по идентификатору
- GameplayTags: именованные иерархические метки
- Config: настройки проекта вне кода
- SaveGame: сохранение прогресса игрока
- Проблема ввода: почему BindAction/BindAxis мало
- UInputAction: действие как файл-ассет
- UInputMappingContext: какая клавиша запускает действие
- Modifiers: как изменить сырое значение ввода
- Triggers: когда именно действие считается сработавшим
- EnhancedInputLocalPlayerSubsystem: как контекст становится активным
- RemoveMappingContext: снять контекст и проверить, активен ли он
- FModifyContextOptions: чистое переключение контекста
- Gameplay input: получить значение действия и подвинуть персонажа
- UI input: переключение между управлением персонажем и интерфейсом
- Controller → Character: как ввод переживает смену персонажа
- Input architecture: как всё это складывается в систему
- Зачем GAS: почему bool/float-поля перестают работать
- AbilitySystemComponent: компонент-хаб способностей
- AttributeSet: характеристики как управляемые данные
- GameplayAbility: способность как класс
- Activation: как способность реально запускается
- GameplayEffect: декларативный путь менять характеристики
- Duration: когда эффект перестаёт действовать
- GameplayTags в GAS: теги и Tag Requirements
- Cost: стоимость способности как GameplayEffect
- Cooldown: перезарядка способности
- Ability Tasks: асинхронное ожидание внутри способности
- GameplayCue: визуальные и звуковые эффекты
- Execution Calculation: модификаторы, зависящие от атрибутов
- Modifier Magnitude Calculation: лёгкий способ вычислить один модификатор
- Prediction: сетевое предсказание способностей
- Multiplayer GAS: HasAuthority() и RPC
- Debugging GAS: showdebug abilitysystem и живая диагностика
- Капстоун Stage 14: полная способность
- Зачем AI: почему bool-флаги для NPC перестают работать
- AAIController: запуск Behavior Tree
- Blackboard: общая память дерева
- BT-узлы: Task, Decorator, Service
- EQS: запрос точек в мире
- AI Perception: откуда на самом деле берётся PlayerDistance
- Navigation: MoveTo и NavMesh
- Smart Objects: найти, занять, освободить
- Капстоун Stage 15: полный AGuardAIController
- Зачем World: почему один Level не тянет большую карту
- Level Streaming: загрузка и выгрузка целых уровней
- World Partition: автоматическая сетка стриминга
- Data Layers: переключаемые группы контента
- PCG: процедурная расстановка контента
- Foliage: runtime-инстансы деревьев
- HLOD: участие актора в упрощении дальней геометрии
- Капстоун Stage 16: открытый мир Novarium
- Зачем Animation: почему у персонажа мало одной анимации
- AnimInstance: кто управляет анимацией скелета
- AnimMontage: разовое проигрывание клипа поверх позы
- Root Motion: движение, зашитое в анимацию
- Motion Warping: подгонка движения из анимации под сцену
- State Machine: граф состояний вместо строковой метки
- Blend Space: одно состояние, несколько клипов по скорости и направлению
- Linked Anim Layers: подменяемые модули поверх одного AnimInstance
- Animation Thread: игровой поток и рабочий поток внутри AnimInstance
- Капстоун Stage 17: анимационная система Novarium
- Зачем Engine Internals: то, что действительно происходит при нажатии Build
- Build: один и тот же модуль, разные зависимости в разных таргетах
- UnrealBuildTool: почему правка одного заголовка иногда пересобирает половину проекта
- Modules: почему движок — сотня модулей, а не один монолитный бинарник
- UHT: GENERATED_BODY() — не код, а обещание кода, которого ещё не существует
- Plugins: почему GAS выключен по умолчанию, а Enhanced Input — нет
- Serialization: как SaveGameToSlot() превращает UPROPERTY в байты
- Cooking: выбор пакетов и подготовка контента под платформу
- Loading: что реально происходит между LoadPrimaryAsset и колбэком
- Threading: Game Thread и безопасная фоновая работа
- Memory: откуда физически берутся байты под NewObject/SpawnActor
- Containers: как на самом деле растёт TArray
- Капстоун Stage 19: один инвентарь через весь конвейер движка