Найти тему

3. Устройство игрового проекта

Поскольку в Unreal Engine не совсем плюсы (подробнее читайте вступление), то и проекты - не совсем проекты.

Основным файлом проекта является файл "[project name].uproject" в корне папки проекта. Этот тот файл, с которого движок начинает загрузку проекта. Соответственно он обязателен и должен находиться под системой контролем версии, если вы ее используете.

Файл содержит перечень загружаемых плагинов, версию используемого движка и перечень платформ, под которые проект будет собираться.

Папка Source

Source - исходники вашей игры. В дальнейшем вы (скорее всего) придете к использованию плагинов и исходники переедут в Plugins. Естественно всё под этой папкой - версионируем.

Что забыл C# в папке Source?

Unreal Engine использует собственную систему сборки, которая написана на C#. Называется она UBT (Unreal Build Tool), документации по ней практически нет.

Каждый модуль и таргет представляют собой C#-класс, в котором описывается конфигурация, поэтому в папке Source вы будете иметь как минимум файл [project name].Target.cs. А то и [project name]Editor.Target.cs

Так что когда вы собираете проект, сначала компилируется dll с Target.cs, а затем они исполняются командой dotnet и выполняют все шаги сборки и упаковки проекта, например генерируют обвязку для интроспекции, запускают компилятор как внешний процесс, зипуют файлы и т.д.

Вам точно захочется изучить процесс сборки, читайте исходники UBT, лежат примерно тут C:\Program Files\Epic Games\UE_5.3\Engine\Source\Programs\UnrealBuildTool

Ошибки в cs-файлах или их именах приводят к тому, что проект вообще не сможет загрузиться и вы будете получать не очень вменяемые сообщения. Будьте трижды внимательны, если решите что-то править.

Папка Plugins

Здесь лежат исходники плагинов. Unreal Engine построен по модульной архитектуре, что конечно же круто. Итоговый билд как правило будет монолитом и строго модульности никакой не будет в плане динамической подгрузки, но на уровне исходников по крайней мере у нас есть плагины и модули. Плагины могут быть сторонними (купили в магазине или скачали), так и вашими.

Плагины могут (и должны) содержать ассеты. Структуру плагина рассмотрим позднее. Не всё в плагинах должно версионироваться, но об этом потом.

Папка Content

Ассеты игры. Опять же я предпочитаю хранить ассеты в плагинах ради модульности, но для простых игр или для быстрого старта можно держать ассеты здесь. Важно, что в Content лежат не исходники ассетов (fbx, png, wav), а Unreal-представление. Сюда файлы попадают в результате импорта исходников через редактор.

Папка версионируется, причем с включенным git lfs, так как файлы - большие.

Важно: в билде игры содержатся не файлы ассетов из папки Content, а специальным образом приготовленные данные (Epic используют термин Cook). По большому счету готовка заключается в компиляции блюпринтов, шейдеров, подготовке статического освещения, текстур под заданную целевую платформу.

Папка Config

Конфигурация проекта и редактора. Структура - простые ini-файлы, можно редактировать руками, если понимаете что делаете. Имеется удобный API для работы с конфигами из игры.

Версионируем.

Папки с временными данными

Всё остальное (Binaries, Build, DerivedDataCache, Intermediate, Saved) является результатом работы движка, редактора, IDE и не версионируется. Можно смело удалять при необходимости (а при смене версии движка лучше удалять наверняка). Содержит различные кеши, предзаготовленные данные, сгенерированный код, логи редактора и прочее. Совершенно точно генерируется заново, если вы вдруг удалили. Бывает полезно почистить эти папки в случае возникновения непонятных ошибок запуска или сборки.

А что же собственно запускать?

Rider умеет "запускать" файл uproject, чем и будем пользоваться.

Visual Studio генерирует sln по uproject (правой кнопкой) и запускает его.

Под капотом IDE хранят свои описания проектов в Intermediate\ProjectFiles, но это как правило не интересно.

Как создать проект?

Ввиду всего выше перечисленного рекомендую создавать проект через Epic Games Launcher. Запускаем launcher, оттуда движок, и создаем новый проект. Конечно же ставим ему тип CPP, а не Blueprint. После того, как структура проекта будет создана, закрываем движок и открываем проект в IDE.

Запускать игру или редактор будем так же из IDE, это позволяет подключить отладчик да и вообще удобнее.