Вы можете создать проект в Unreal Engine (UE), используя только Blueprint или только C++, но в большинстве проектов полезно применять оба инструмента. Как же выбрать наилучшее сочетание Blueprint и C++ для своего проекта? Ниже приведены рекомендации, которые помогут вам принять правильное решение.
Программирование и написание сценариев
Чтобы обоснованно выбрать Blueprint или C++, сначала нужно понять разницу между программированием и написанием сценариев.
Программирование подразумевает написание инструкций, определяющих саму систему.
Сценарий же содержит инструкции, определяющие поведение посредством взаимодействия с другими системами.
Например, вы можете использовать программирование для определения системы транспортного средства, управляющей базовыми функциями, такими как ускорение и поворот; а сценариями определить разные типы транспортных средств, такие как автомобили или лодки.
В этом контексте C++ — это язык программирования, а Blueprint — язык написания сценариев. Однако такое разделение не является однозначным, поскольку вы можете использовать C++ для определения поведений или же использовать Blueprint для определения систем. Кроме того, иногда границы между программированием и написанием сценариев размыты, и оптимальное разделение между ними зависит от ситуации.
Blueprint работает как язык сценариев, взаимодействуя с доступными функциональными возможностями UE. Аналогичным образом вы можете использовать свои пользовательские функции в схемах Blueprint. Дополнительную информацию см. в разделе Combining Blueprints and C++ (Сочетание Blueprint и C++).
Сравнение схем Blueprint и C++
Поскольку каждый проект и команда уникальны, не существует единственно верного подхода относительно использования Blueprint или C++. Рекомендуем предварительно оценить их преимущества.
Преимущества схем Blueprint
Это язык сценариев: с помощью Blueprint проще определять поведение.
Быстрее вносятся изменения: схемы Blueprint отлично подходят для создания прототипов, поскольку с их помощью можно быстрее создавать, изменять, компилировать и тестировать классы Blueprint.
Проще в освоении: визуальное представление выполнения на схеме Blueprint проще для понимания и использования, что делает этот инструмент доступным как для программистов, ориентированных на визуальное восприятие, так и для людей других профессий, например дизайнеров и художников.
Проще поиск: в Blueprint проще находить и включать ссылки на API и ресурсы.
Более безопасная модель памяти: в Blueprint реализована безопасная модель памяти, исключающая сбои.
Преимущества C++
Программирование: на C++ проще создавать новые системы.
Выше производительность во время выполнения: в целом язык C++ более производителен, но это заметно не в каждом контексте. Более подробную информацию см. в разделе «Вопросы производительности» ниже.
Более глубокий доступ: C++ имеет доступ к функциям UE более низкого уровня.
Лучше расширяемость: на C++ можно создавать внешние системы и библиотеки и взаимодействовать с ними.
Больший контроль: C++ обеспечивает низкоуровневый контроль над системами, ресурсами и сложными алгоритмами.
Более удобная совместная работа: исходный код на C++ хранится в виде текста, что упрощает его сравнение, объединение и совместное использование между проектами. Однако вы можете использовать для схем Blueprint инструмент Unreal Diff Tool.
Лучше масштабируемость: в большие файлы на C++ проще вносить изменения, чем в большие схемы Blueprint.
Удобнее отладка: для C++ существуют более мощные инструменты отладки, чем Blueprint Debugger.
Вопросы производительности
В целом C++ более производителен, чем Blueprint, потому что:
Исходный код на C++ компилируется в машинный код, выполняемый непосредственно ЦП.
Схемы Blueprint компилируются в байт-код, который выполняется виртуальной машиной.
Это означает, что Blueprint требует дополнительных ресурсов на выполнение сценария. Обычно различия в производительности Blueprint и C++ незначительны и зависят от контекста. Ниже приведены примеры контекстов, когда разница наиболее велика:
Базовая инфраструктура низкого уровня.
Сплошные циклы, в которых интенсивно используются ресурсы ввода-вывода или обработки.
Системы, обрабатывающие большие массивы данных.
Зависимые от такта классы со множеством экземпляров.
Сценарии, в которых выгодна многопоточность, поскольку Blueprint её не поддерживает.
Чтобы повысить производительность, используйте для планирования выполнения в схемах Blueprint таймеры или делегаты вместо тактов.
Если вы используете Blueprint и у вас возникли проблемы с производительностью, оцените производительность своего проекта с помощью Unreal Insights и оптимизируйте наиболее существенные узкие места, прежде чем рассматривать преобразование Blueprint в код C++.
Сочетание Blueprint и C++
Лучший подход к сочетанию Blueprint и C++ — это использовать код на C++ в качестве основы и создавать классы Blueprint поверх него. На практике это означает, что ваш код на C++ можно использовать в схемах Blueprint.
Вы можете сделать код на C++ доступным в Blueprint, используя следующие методы:
Создайте класс Blueprint, который расширяет класс C++, и используйте спецификаторы метаданных, такие как
UPROPERTY(BlueprintReadWrite)иUFUNCTION(BlueprintCallable), чтобы предоставить доступ к определённым элементам.Создайте класс C++, расширяющий
UBlueprintFunctionLibrary, чтобы предоставить доступ к статическим функциям класса.
В некоторых более редких случаях может потребоваться открыть доступ к Blueprint в C++, что можно сделать следующими методами:
Используйте спецификатор
UFUNCTION(BlueprintImplementableEvent), чтобы определить полностью виртуальную функцию, которую необходимо реализовать в Blueprint.Используйте спецификатор
UFUNCTION(BlueprintNativeEvent), чтобы определить виртуальную функцию, которую при желании можно переопределить в Blueprint.При создании пользовательского интерфейса вы можете обращаться к UserWidget, созданному в Blueprint, используя
UPROPERTY(meta=(BindWidget)).
Дополнительную информацию об этих методах см. на следующих страницах:
C++ and Blueprint (C++ и Blueprint): подробный пример создания класса C++, расширяемого с помощью Blueprint.
Exposing C++ to Blueprints (Предоставление доступа к ресурсам C++ в Blueprint): советы и рекомендации по написанию API, пригодного для использования в Blueprint.
Exposing Gameplay Elements to Blueprints (Доступ к элементам игрового процесса из Blueprint): техническое руководство по доступу к элементам игрового процесса в Blueprint для программистов игрового процесса.
Blueprint Function Library (Библиотека функций Blueprint): узнайте, как использовать
UBlueprintFunctionLibrary.Lyra Sample Game (Пример игры Lyra): ознакомьтесь с проектом Lyra, в котором есть примеры каждого из рассмотренных выше методов.
Преобразование Blueprint в код C++
Если вам нужно преобразовать ресурсы Blueprint в C++, сначала можно использовать инструмент Blueprint Header View, чтобы сгенерировать файл заголовка C++ для класса или структуры Blueprint. Сгенерированный файл с расширением .h содержит все объявления переменных и функций из Blueprint, но вам необходимо вручную преобразовать реализацию своих функций в соответствующий файл .cpp .
После преобразования Blueprint в код C++ может потребоваться обновить ссылки, чтобы использовать новый класс C++. Если обновление требует много изменений, рассмотрите возможность использования Core Redirects для автоматического изменения ссылок.