Мені дуже подобається автоматизувати процеси в Unreal Engine, адже це робить процес розробки менш фрустраційним і допомагає значно швидше знаходити важливі проблеми. Коли мова заходить про автоматизацію в UE, є 2 основні теми, які варто охопити:
Скриптування редактора
Редакторське скриптування важливе, коли вам потрібно встановити подібні дані в кількох активах або акторах рівня, або якщо ви хочете знайти специфічні дані у вашій папці Content. Хочете встановити властивості в кількох активах? Перекомпілювати та зберегти багато Blueprint одночасно? Або знайти активи з конкретними властивостями? Якщо так, то саме тут і повинна вступити в гру автоматизація редактора.
Створення скриптів для редактора відносно просте, оскільки за допомогою лише Blueprints можна автоматизувати чимало речей — точніше, використовуючи Editor Utility Blueprints та Editor Utility Widgets. Їх називають Editor Utilities або Blutilities.
Проте, я настійно рекомендую також використовувати Python для скриптування редактора. Є кілька переваг використання Python:
- Unreal Python API дозволяє використовувати не лише всі функції
BlueprintCallable
, але й деякі функції, які за замовчуванням доступні лише в C++ (наприклад,UObject::Modify
). - Скрипти Python — це текстові файли, тому їх легко модифікувати та об'єднувати кількома людьми одночасно.
- За допомогою Python можна використовувати StartupScripts, які спрацьовують безпосередньо після ініціалізації Engine. Їх можна налаштувати в Project Settings->Plugins->Python.
Опція в Project Settings->Plugins->Python
До речі, ви також можете створювати Blueprint Function Libraries в Python.
Насправді, для автоматизації редактора вам не обов'язково потрібно використовувати C++. Комбінація Editor Utility BPs з Python повинна бути більш ніж достатньою більшу частину часу. Але іноді вам може знадобитися написати статичні допоміжні функції в C++, якщо потрібна функціональність, яка за замовчуванням відсутня в engine.
Автоматизаційні тести
Хоча автоматизаційні тести та автоматизація редактора звучать схоже, вони обробляються різними фреймворками. Більшість автоматизаційних тестів потрібно писати в C++, оскільки структура FAutomationTestBase
знаходиться поза екосистемою UObject
. Однак деякі тести можна створювати й у BP (я про це поговорю пізніше).
Якщо ви працюєте з Rider, ви можете легко додавати тестовий клас шаблону
Найважливіше — це додати макроси IMPLEMENT_SIMPLE_AUTOMATION_TEST
або IMPLEMENT_COMPLEX_AUTOMATION_TEST
. У них потрібно визначити тестовий тег і тестові прапорці.
Тоді єдина віртуальна функція, яку потрібно перевизначити, це FAutomationTestBase::RunTest
(або разом з функцією FAutomationTestBase::GetTests
, якщо ви створюєте складний тест).
IMPLEMENT_SIMPLE_AUTOMATION_TEST(FPlaceholderTest, "TestGroup.TestSubgroup.PlaceholderTest", EAutomationTestFlags::EditorContext | EAutomationTestFlags::MediumPriority | EAutomationTestFlags::ProductFilter)
bool FPlaceholderTest::RunTest(const FString& Parameters)
{
// ви можете використовувати ці функції для виведення результатів тесту
const FString LogMessage = TEXT("TestLog");
AddInfo(LogMessage);
AddWarning(LogMessage);
AddError(LogMessage);
return true;
}
Ви можете запустити тест з командного рядка, використовуючи тег (EzArgs плагін для Rider або UnrealVS плагін для Visual Studio буде корисний для цього):
-skipcompile -execcmds=”Automation RunTests TestGroup.TestSubgroup.PlaceholderTest$;Quit” -stdout -unattended -NOSPLASH -NullRHI
Це означає, що ви можете запускати автоматизаційні тести за допомогою CI/CD (Jenkins, TeamCity). Ви можете тестувати свою гру 24/7, навіть коли спите! 🎉
Ви також можете запускати тести через UE Editor. Спочатку переконайтеся, що плагін Functional Testing Editor увімкнений.
Потім перейдіть у Tools->Test Automation. Ви можете легко запустити кілька тестів одночасно там.
Frontend автоматизації тестів в UE Editor
Функціональні тести
Якщо ви увімкнете плагін Functional Testing Editor, тепер ви можете створювати й Функціональні тести. Клас Functional Test наслідується від актора і призначений для тестування функцій під час виконання. Функціональні тести можна створювати в BP, але Editor Functional Tests потрібно створювати в BP, тому що, якщо ви відкриєте заголовковий файл цього класу, ви помітите, що він має макроси Blueprintable
та MinimalAPI
— що означає, що ви не можете створити клас C++, який наслідується від класу AEditorFunctionalTest
, але можете створити BP, який наслідується від нього:
Ось найбільш важливі події та функції, які надаються класом Functional Test:
Після створення вашого Functional Test актора, просто розмістіть його на карті. Тепер його тестовий тег має автоматично згенеруватися у вікні Frontend автоматизації тестів:
Тести редактора
Якщо ви увімкнете плагін Editor Tests, ви зможете використовувати новий клас Editor Utility Blueprint — Editor Utility Test. Це означає, що ви також можете створювати тести редактора в BP.
Клас UEditorUtilityTest має дуже схожі функції до класу AFunctionalTest
Подібно до Функціональних тестів, Editor Utility Tests повинні автоматично відображатися в Testing Automation Frontend:
Крім того, ви можете використовувати ці теги для запуску як Функціональних тестів, так і Editor Utility Tests з командного рядка! 🎉
Приклад тестів
Нещодавно я створив плагін під назвою Editor Test Utilities. Це, по суті, набір автоматизаційних тестів для поширених проблем з активами.
З наданими тестами ви можете перевіряти такі проблеми, як:
- Надто складний ланцюг залежностей/посилань активів для Player Pawn
- Активи з надто великим розміром карти (розмір на диску)
- Меші з надто великою кількістю трикутників
- Blueprints з порожніми тиками або тиками, увімкненими за замовчуванням
- Blueprints, що використовують функції, як “GetAllActorsOfClass”
- Blueprints, що використовують чисті функції з кількома виходами
- User Widgets, що використовують прив'язки
- Redirectors в проекті
Я також надав Python скрипти, які активують ці тести. Ці скрипти можна виконати під час запуску редактора. Якщо тест із скрипту не пройде, це викликає сповіщення в Message Log (якщо тест проходить успішно, сповіщення не буде додано до Message Log під час запуску редактора).
Ці тести повинні допомогти вам підтримувати проект у хорошому стані.
Інші корисні матеріали
- Курс з автоматизації Python для Unreal Engine 5
- Як використовувати Python в Unreal Engine 4
- Python Input & Output змінні в утилітах Blueprints
- Створення функціональних тестів з Automation System
Вам сподобалися мої статті? Будь ласка, подумайте про підтримку мене. Дякую!
Перекладено з: Automate everything you can in Unreal Engine! You will thank me later