Unreal Engine 4 Интеграция сторонних библиотек
В этой статье объясняется, как интегрировать сторонние библиотеки, включая стандартные шаблоны для добавления библиотек, особые соображения по поводу динамических библиотек, размещение зависимостей и полезную информацию об ошибках, с которыми вы можете столкнуться при интеграции сторонней библиотеки в ваш проект Unreal.
Исходный код Unreal Engine включает в себя несколько сторонних библиотек, которые хранятся в UnrealEngine/Engine/Source/ThirdParty/... При разработке плагинов, использующих сторонние библиотеки, удобнее располагать эти библиотеки в папку с плагином.
Шаблон плагина со сторонней библиотекой
Браузер плагинов в редакторе имеет шаблон для интеграции сторонних библиотек. Чтобы создать новый плагин с помощью этого шаблона, выберите New Plugin в окне браузера плагинов и прокрутите вниз до шаблона Third Party Plugin (для использования данного шаблона вам нужен проект с C++ кодом).
Настройка модуля
Обычные C++ модули Unreal Engine настраиваются с помощью файла .build.cs, сторонние библиотеки ничем не отличаются. Чтобы создать модуль, который не имеет исходного кода и существует для использования другими модулями, создайте файл .build.cs для своего плагина следующим образом:
Файл .build.cs должен находиться в обычной папке с кодом, где механизм ищет модули, например MyProject/Source или MyPlugin/Source.
Параметр ModuleType.External указывает движку не искать (или компилировать) исходный код. Он будет использовать другие параметры, которые вы определили в этом файле, а именно перечисленные пути включения в среду компиляции, макросы и связи с указанными статическими библиотеками.
Динамические библиотеки
Windows имеет довольно негибкую модель для загрузки DLL. Каждый исполняемый файл или DLL хранит список библиотек DLL от которых он зависит, ОС сканирует этот список при загрузке модуля, чтобы удовлетворить эти зависимости.
Чтобы поместить стороннюю DLL-библиотеку рядом с исполняемым файлом при упаковке игры, вы можете объявить ее как runtime dependency в файле build.cs:
Это предполагает, что DLL уже существует в данном каталоге и что плагин будет загружать ее вручную из этого места. Если вы хотите, чтобы DLL копировалась в тот же выходной каталог, что и исполняемый файл во время сборки, вы делаете это с помощью перегрузки метода RuntimeDependencies.Add:
Другие переменные могут быть использованы для выходных путей DLL:
Поле RuntimeDependencies не ограничивается промежуточными DLL; Вы также можете использовать его для добавления дополнительных файлов в процесс подготовки. Эти файлы могут храниться в PAK-файлах Unreal или свободно храниться на диске. DLL загружаются операционной системой, поэтому они обычно не могут быть сохранены в файле PAK.
Возможные значения для StagedFileType:
Windows.h
Стандартный заголовок Windows (Windows.h) не включен по умолчанию в большинство кодов UE. Если вам это нужно для сторонних библиотек, включите его через файл WindowsHWrapper.h из модуля Core.
C ++ Предупреждения и Ошибки
В кодовой базе Unreal Engine по умолчанию много предупреждений, которые рассматриваются как ошибки. Чтобы ослабить некоторые из этих ограничений для стороннего кода, существуют кроссплатформенные макросы для временного отключения общих предупреждений:
Упаковка и выравнивание по умолчанию
По старым причинам Unreal Engine форсирует 4-байтовую упаковку на Win32. Это может привести к трудным для отладки проблемам выравнивания в классах, которые используют 8-байтовые типы, такие как double или long. Чтобы восстановить упаковку по умолчанию вокруг стороннего кода, который определяет 8-байтовые типы в открытых структурах, используйте следующие макросы:
Ошибка сборки RTTI
Связывание вашего двоичного файла из исходных файлов, скомпилированных с различными флагами RTTI (run-time type information), может вызвать ошибки сборки в Windows. Если вы сталкиваетесь с ошибками сборки RTTI, вы можете либо определить вспомогательный макрос для смешивания модулей включения/выключения RTTI, либо, если вы строите из исходного кода, вы можете включить RTTI для всего движка, установив для bForceEnableRTTI значение true в TargetRules.cs.
Ошибки Dynamic Cast
Если вы используете dynamic cast для типа объекта, который не является типом UObject, когда RTTI выключен, вы столкнетесь с ошибкой «can't use dynamic_cast when RTTI is disabled error», потому что в CoreUObject/Public/Templates/Casts.h, #define dynamic_cast перенаправляет модули CUObject. Для типов UObject dynamic cast использует систему Reflection, но для других типов оно использует обычный dynamic_cast.

















