Compiling Game Projects
Compiling individual game projects using Visual Studio on Windows, or Xcode on Mac.
Unreal Engine 4 (UE4) uses a custom building method via the UnrealBuildTool which handles all the complex aspects of compiling the project and linking it with the engine. This process occurs transparently allowing you to simply build the project through the standard Visual Studio build workflow.
UnrealBuildTool uses the .Build.cs and .Target.cs files to build the game project. These are automatically generated when a project is created using a C++ template, or when the CPP Class Wizard is used to add code to a project created from a Blueprints Only template.
Build Configuration
Unreal projects have multiple targets (Editor, Client, Game, and Server) described by *.target.cs files, each of which can be built to different configurations. In Visual Studio, this manifests as a Visual Studio *.vcxproj file with different configurations for each target. The solution configurations are named as [Configuration][Target Type] (for example, «DevelopmentEditor» for the default editor target, and «Development» for the default standalone game target). The configuration you use will be determined by the purposes of the build you want to create.
Every build configuration contains two keywords, and the first keyword indicates the state of the engine and your game project. For instance, if you compile using a Debug configuration, you will be able to debug your game’s code. The second keyword indicates the target you are building for. For example, if you want to open a project in Unreal, you need to build with the Editor target keyword.
Build Configuration — State
Debug
This configuration contains symbols for debugging. This configuration builds both engine and game code in debug configuration. If you compile your project using the Debug configuration and want to open the project with the Unreal Editor, you must use the «-debug» flag in order to see your code changes reflected in your project.
DebugGame
This configuration builds the engine as optimized, but leaves the game code debuggable. This configuration is ideal for debugging only game modules.
Development
This configuration enables all but the most time-consuming engine and game code optimizations, which makes it ideal for development and performance reasons. Unreal Editor uses the Development configuration by default. Compiling your project using the Development configuration enables you to see code changes made to your project reflected in the editor.
Shipping
This is the configuration for optimal performance and shipping your game. This configuration strips out console commands, stats, and profiling tools.
Test
This configuration is the Shipping configuration, but with some console commands, stats, and profiling tools enabled.
Build Configuration — Target
[empty]
This configuration builds a stand-alone executable version of your project, but requires cooked content specific to the platform. Please refer to our Packaging Projects Reference page to learn more about cooked content.
Editor
To be able to open a project in Unreal Editor and see all code changes reflected, the project must be built in an Editor configuration.
Client
If you’re working on a multiplayer project using UE4 networking features, this target designates the specified project as being a Client in UE4’s client-server model for multiplayer games. If there is a <Game>Client.Target.cs file, the Client build configurations will be valid.
Server
If you’re working on a multiplayer project using UE4 networking features, this target designates the specified project as being a Server in UE4’s client-server model for multiplayer games. If there is a <Game>Server.Target.cs file, the Server build configurations will be valid.
Building with Visual Studio
Setting the Build Configuration
The build configuration can be set in the Visual Studio toolbar.
Project — Configuration Menu

Setting the Solution Platform
The solution platform can be set in the Visual Studio toolbar.
UE4 currently supports the following platforms:
Windows 32-bit
Windows 64-bit
When working with Unreal Engine 4, you will typically use the Win64 platform. This is the only one included by default when generating project files; the Project Files for IDEs page has instructions for generating project files for additional platforms.
Building the Project
Make sure you are running Visual Studio 2015 or higher for Windows Desktop installed before proceeding. If you are using Mac, make sure to have Xcode 9.0 or higher installed.
Set the Solution Configuration to the configuration you want to build. In this example, it is set to Development Editor. Refer to the Build Configuration section for descriptions of each available configuration.

Right-click your game project and choose Rebuild to recompile.

You can now run the engine with your compiled project.
When running the engine, it is important to use the Unreal Engine executable that matches the build configuration you rebuilt your project in. For example, if you compiled your project in the DebugGame Uncooked build configuration, you would run the UE4-Win64-DebugGame.exe executable with your game information as an argument. More information on the binary naming convention can be found on the Building Unreal Engine page.
When running Unreal, it is important to add the -game flag if you rebuilt your project in any Uncooked configuration, and the -debug flag if you rebuilt your project in any Debug configuration.
Visual Studio Known Issues
«Project is out of date» message always appears
Visual Studio thinks the project is out of date when it really is up to date. You can safely suppress this message by checking the Do not show this dialog again box and pressing No.
No Debugging Information window appears when using the Debug configuration
The reason for this is that the UE4editor.exe was compiled using the Development configuration. Your game project will still be debuggable when compiled using the Debug configuration despite this warning. You can safely suppress this message by checking the Do not show this dialog again box and pressing Yes.
Building with Xcode
When building in Xcode, you are only compiling the game project, not the Editor.
To compile the project:
The Unreal Engine Xcode project is configured to build Debug configuration when you use Xcode’s Product > Build option and Development configuration when you use Product > Build For > Profiling. You can edit this behavior by editing the target schemes.
You can now run the engine with your compiled project.
When running the binary Editor, it is important to add the -game flag if you rebuilt your project in any Uncooked configuration, and the -debug flag if you rebuilt your project in any Debug configuration.
Xcode Known Issues
Xcode does not stop at breakpoints
Xcode’s LLDB debugger needs to be configured to correctly handle breakpoints in Unreal Engine projects. You need to create (or edit, if you already have it) a .lldbinit file in your home folder and add the following line to it:
Туториал по Unreal Engine: C++

Blueprints — очень популярный способ создания геймплея в Unreal Engine 4. Однако если вы уже давно программируете и предпочитаете код, то вам идеально подойдёт C++. С помощью C++ можно даже вносить изменения в движок и создавать собственные плагины.
В этом туториале вы научитесь следующему:
- Создавать классы C++
- Добавлять компоненты и делать их видимыми для Blueprints
- Создавать класс Blueprint на основе класса C++
- Добавлять переменные и делать их изменяемыми из Blueprints
- Связывать привязки осей и действий с функциями
- Переопределять функции C++ в Blueprints
- Связывать событие коллизии с функцией
Приступаем к работе
Если вы ещё этого не сделали, то вам понадобится установить 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.

На следующем экране можно указать имя и путь к файлам .h и .cpp. Замените Name на BasePlayer и нажмите на Create Class.

При этом будут созданы файлы и скомпилирован проект. После компиляции Unreal откроет Visual Studio. Если BasePlayer.cpp и BasePlayer.h не будут открыты, то перейдите в Solution Explorer и откройте их. Они находятся в папке Games\CoinCollector\Source\CoinCollector.

Прежде чем двигаться дальше, вам нужно узнать о системе рефлексии Unreal. Эта система управляет различными частями движка, такими как панель Details и сборка мусора. При создании класса с помощью C++ Class Wizard движок Unreal добавляет в заголовок три строки:
- #include «TypeName.generated.h»
- UCLASS()
- GENERATED_BODY()
Вы можете также заметить, что класс называется ABasePlayer , а не BasePlayer . При создании класса типа actor Unreal ставит перед названием класса префикс A (от слова actor). Чтобы система рефлексии могла работать, ей нужно, чтобы классы имели соответствующие префиксы. Подробнее прочитать о префиксах можно в Стандарте оформления кода Epic.
Это всё, что вам пока нужно знать о системе рефлексии. Теперь нам нужно добавить модель игрока и камеру. Для этого нужно использовать компоненты.
Добавление компонентов
Для Pawn игрока нам нужно добавить три компонента:
- Static Mesh: он позволит выбрать меш, являющийся моделью игрока
- Spring Arm: этот компонент используется в качестве штатива камеры. Один конец будет прикреплён к мешу, а к другому будет прикреплена камера.
- Camera: Unreal показывает игроку всё, что видит камера.
Примечание: Важно добавлять файл .generated.h последним. В нашем случае директивы include должны выглядеть следующим образом:
Если он будет не последним include, то при компиляции мы получим ошибку.
Теперь нам нужно объявить переменные для каждого компонента. Добавьте после SetupPlayerInputComponent() следующие строки:
Использованное здесь имя будет именем компонента в редакторе. В нашем случае компоненты будут отображаться как Mesh, SpringArm и Camera.
Далее нам нужно сделать каждую переменную видимой для системы рефлексии. Для этого добавим над каждой переменной UPROPERTY() . Теперь код должен выглядеть вот так:
Также можно добавить к UPROPERTY() описатели (specifiers). Они будут управлять поведением переменной в различных аспектах движка.
Добавьте VisibleAnywhere и BlueprintReadOnly внутри скобок каждого UPROPERTY() . Отделите каждый описатель запятой.
VisibleAnywhere позволит каждому компоненту быть видимым в редакторе (в том числе и в Blueprints).
BlueprintReadOnly позволит получать ссылку на компонент с помощью нодов Blueprint. Однако он не позволит нам задавать компонент. Для компонентов важно быть read-only, потому что их переменные являются указателями. Мы не хотим, чтобы пользователи задавали их, иначе они могут указать на случайное место в памяти. Стоит заметить, что BlueprintReadOnly всё-таки позволяет задавать переменные внутри компонента, и именно к такому поведению мы стремимся.
Теперь, когда у нас есть переменные для каждого компонента, нам нужно их инициализировать. Для этого необходимо создать их внутри конструктора.
Инициализация компонентов
Для создания компонентов можно использовать CreateDefaultSubobject<Type>(«InternalName») . Откройте BasePlayer.cpp и добавьте в ABasePlayer() следующие строки:
Это создаст компонент каждого типа, а затем назначит их адрес в памяти переданной переменной. Аргумент-строка будет внутренним именем компонента, используемым движком (а не отображаемым именем, несмотря на то, что в нашем случае они одинаковы).
Затем нам нужно настроить иерархию (выбрать корневой компонент и так далее). Добавьте после предыдущего кода следующее:
Первая строка сделает Mesh корневым компонентом. Вторая строка прикрепит SpringArm к Mesh . Наконец, третья строка прикрепит Camera к SpringArm .
После завершения кода компонентов нам нужно выполнить компиляцию. Выберите один из следующих способов компиляции:
- В Visual Studio выберите Build\Build Solution
- В Unreal Engine нажмите на Compile в Toolbar
Однако в Blueprints достаточно будет просто выбрать меш из раскрывающегося списка.

Если вы переместите ресурс в другую папку, в Blueprints ничего не испортится. Однако в C++ придётся менять каждую ссылку на этот ресурс.
Чтобы задать поворот меша и пружинного рычага в Blueprints, нужно будет создать Blueprint на основании BasePlayer.
Выделение подклассов классов C++
В Unreal Engine перейдите в папку Blueprints и создайте Blueprint Class. Разверните раздел All Classes и найдите BasePlayer. Выберите BasePlayer, а затем нажмите на Select.

Переименуйте его в BP_Player, а затем откройте.
Сначала мы зададим меш. Выберите компонент Mesh и задайте для его Static Mesh значение SM_Sphere.

Затем нам нужно задать поворот и длину пружинного рычага. Наша игра будет с видом сверху, поэтому камера должна быть над игроком.
Выберите компонент SpringArm и задайте для Rotation значение (0, -50, 0). Это повернёт пружинный рычаг так, что камера будет смотреть на меш сверху вниз.

Поскольку пружинный рычаг является дочерним элементом меша, он начинает вращаться, когда начинает вращаться шар.
Чтобы исправить это, нам нужно сделать так, чтобы поворот рычага был абсолютным. Нажмите на стрелку рядом с 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 ).
Теперь нам нужно создать реализацию для каждой функции. Откройте BasePlayer.cpp добавьте в конец файла следующее:
MoveUp() добавляет физическую силу для Mesh по оси X. Величина силы задаётся MovementForce . Благодаря умножению результата на Value (масштаб привязки оси), меш может перемещаться в положительном или отрицательном направлениях.
MoveRight() делает то же самое, что и MoveUp() , но по оси Y.
Закончив создание функций движения, мы должны связать с ними привязки осей.
Связывание привязок осей с функциями
Ради упрощения я уже заранее создал привязки осей. Они находятся в Project Settings, в разделе Input.

Добавьте внутрь SetupPlayerInputComponent() следующий код:
Так мы свяжем привязки осей MoveUp и MoveRight с MoveUp() и MoveRight() .
На этом мы закончили с функциями движения. Теперь нам нужно включить физику для компонента 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() следующие строки:
Первое — это переменная float с именем JumpImpulse . Мы можем использовать её при реализации прыжка. Она использует EditAnywhere , чтобы её можно было изменять в редакторе. Также в ней используется BlueprintReadWrite , чтобы мы могли считывать и записывать её с помощью нодов Blueprint.
Далее идёт функция прыжка. UFUNCTION() делает Jump() видимой для системы рефлексии. BlueprintImplementableEvent позволяет Blueprints реализовать Jump() . Если реализация отсутствует, то вызовы Jump() ни к чему не приведут.
Так как Jump — это привязка действия, способ связывания немного отличается. Закройте BasePlayer.h и откройте BasePlayer.cpp. Добавьте внутрь SetupPlayerInputComponent() следующее:
Так мы свяжем привязку Jump с Jump() . Она будет выполняться только при нажатии клавиши прыжка. Если вы хотите выполнять её при отпускании клавиши, то используйте IE_Released .
Дальше мы переопределим 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 и попробуйте попрыгать с помощью клавиши пробела.
В следующем разделе мы заставим монеты исчезать при контакте с игроком.
Собирание монет
Для обработки коллизий нам нужно связать функцию с событием наложения. Для этого функция должна удовлетворять двум требованиям. Первое — функция должна иметь макрос UFUNCTION() . Второе требование — функция должна иметь правильную сигнатуру. В этом туториале мы будем использовать событие OnActorBeginOverlap. Это событие требует, чтобы у функции была следующая сигнатура:
Вернитесь в Visual Studio и откройте BaseCoin.h. Добавьте под PlayCustomDeath() следующие строки:
После связывания OnOverlap() будет исполнятся при наложении монеты и другого актора. OverlappedActor будет монетой, а OtherActor — другой актор.
Далее нам нужно реализовать OnOverlap() .
Реализация наложений
Откройте BaseCoin.cpp и добавьте в конец файла следующее:
Так как мы хотим распознавать только наложения игрока, то нужно привести OtherActor к ABasePlayer . Прежде чем выполнить приведение, нам нужно добавить заголовок для ABasePlayer . Добавьте под #include «BaseCoin.h» следующее:
Теперь нам нужно выполнить приведение. В Unreal Engine приведение можно выполнить так:
Если приведение выполнено успешно, то оно вернёт указатель на ObjectToCast . Если неудачно, то оно вернёт nullptr . Проверяя результат на nullptr , мы можем определить, имел ли объект нужный тип.
Добавьте внутрь OnOverlap() следующее:
Теперь, когда OnOverlap() выполняется, она будет проверять, имеет ли OtherActor тип ABasePlayer . Если это так, то она будет уничтожать монету.
Далее нам нужно привязать OnOverlap() .
Связывание функции наложения
Чтобы связать функцию с событием наложения, нам нужно использовать с событием AddDynamic() . Добавьте внутрь ABaseCoin() следующее:
Так мы свяжем OnOverlap() с событием OnActorBeginOverlap. Это событие происходит всегда, когда актор накладывается на другого актора.
Выполните компиляцию и вернитесь в Unreal Engine. Нажмите Play и начните собирать монеты. При контакте с монетой она будет уничтожаться, что приводит к её исчезновению.
В следующем разделе мы создадим ещё одну переопределяемую функцию C++. Однако на этот раз мы также создадим реализацию по умолчанию. Для демонстрации этого мы воспользуемся OnOverlap() .
Создание реализации функции по умолчанию
Чтобы создать функцию с реализацией по умолчанию, нужно использовать описатель BlueprintNativeEvent . Вернитесь в Visual Studio и откройте BaseCoin.h. Добавьте для OnOverlap()
в UFUNCTION() BlueprintNativeEvent :
Чтобы сделать функцию реализацией по умолчанию, нам нужно добавить суффикс _Implementation . Откройте BaseCoin.cpp и замените OnOverlap на OnOverlap_Implementation :
Теперь если дочерний Blueprint не реализует OnOverlap() , то будет использована эта реализация.
Следующим этапом будет реализация OnOverlap() в BP_Coin.
Создание реализации в Blueprint
Для реализации в Blueprint мы будем вызывать PlayCustomDeath() . Эта функция C++ увеличит скорость вращения монеты. Через 0,5 секунды монета будет себя уничтожать.
Для вызова функции C++ из Blueprints нам нужно использовать описатель BlueprintCallable . Закройте BaseCoin.cpp и откройте BaseCoin.h. Добавьте над PlayCustomDeath() следующее:
Выполните компиляцию и закройте Visual Studio. Вернитесь к Unreal Engine и откройте BP_Coin. Переопределите On Overlap и создайте следующую схему:

Теперь при наложении игрока на монету будет выполняться Play Custom Death.
Нажмите на Compile и закройте BP_Coin. Нажмите Play и соберите несколько монет, чтобы протестировать новую реализацию.
Куда двигаться дальше?
Вы можете скачать готовый проект отсюда.
Как вы видите, работать с C++ в Unreal Engine довольно просто. Хотя мы уже добились кое-чего в C++, вам ещё нужно многому научиться! Я рекомендую изучить серию туториалов Epic по созданию с помощью C++ шутера с видом сверху.
Если вы новичок в Unreal Engine, то изучите нашу серию туториалов для начинающих из десяти частей. В этой серии вы познакомитесь с различными системами, такими как Blueprints, материалы и системы частиц.
#6 — Компиляция проекта
Выполните компиляцию проекта под вашу операционную систему.
После компиляции запустите игру.
Следуйте инструкциям из видео урока.
Также стоит посмотреть

Навигация по курсу
- Уроки по Unreal Engine 4 / #1 — Создание игр на движке UE4
- #2 — Создание пустого проекта
- #3 — Разбор интерфейса
- #4 — Создание окружения
- #5 — Работа с текстурами
- #6 — Компиляция проекта
Навигация
Справочник
Консультация
Необходима консультация? Вы можете задавать все свои вопросы из личного кабинета и получать ответы в удобном формате прямиком на сайте!
Тест на выбор языка
Не знаете какой язык изучать? Пройдите быстрый тест и определите какой язык программирования подходит именно вам
Подписка на проект
Оформите подписку и после этого вам будут доступны: домашние задания, программный код, материалы, консультации и многое другое!
Мы используем файлы cookie, чтобы улучшить работу и повысить эффективность сайта. Продолжая пользование данным сайтом, вы соглашаетесь с использованием файлов cookie .