Автоматизуйте все, що тільки можна в Unreal Engine! Потім подякуєте мені.

Мені дуже подобається автоматизувати процеси в Unreal Engine, адже це робить процес розробки менш фрустраційним і допомагає значно швидше знаходити важливі проблеми. Коли мова заходить про автоматизацію в UE, є 2 основні теми, які варто охопити:

  1. Скриптування та автоматизація Unreal Editor
  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.

pic

Опція в Project Settings->Plugins->Python

До речі, ви також можете створювати Blueprint Function Libraries в Python.

Насправді, для автоматизації редактора вам не обов'язково потрібно використовувати C++. Комбінація Editor Utility BPs з Python повинна бути більш ніж достатньою більшу частину часу. Але іноді вам може знадобитися написати статичні допоміжні функції в C++, якщо потрібна функціональність, яка за замовчуванням відсутня в engine.

Автоматизаційні тести

Хоча автоматизаційні тести та автоматизація редактора звучать схоже, вони обробляються різними фреймворками. Більшість автоматизаційних тестів потрібно писати в C++, оскільки структура FAutomationTestBase знаходиться поза екосистемою UObject. Однак деякі тести можна створювати й у BP (я про це поговорю пізніше).

pic

Якщо ви працюєте з 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. Ви можете легко запустити кілька тестів одночасно там.

pic

Frontend автоматизації тестів в UE Editor

Функціональні тести

Якщо ви увімкнете плагін Functional Testing Editor, тепер ви можете створювати й Функціональні тести. Клас Functional Test наслідується від актора і призначений для тестування функцій під час виконання. Функціональні тести можна створювати в BP, але Editor Functional Tests потрібно створювати в BP, тому що, якщо ви відкриєте заголовковий файл цього класу, ви помітите, що він має макроси Blueprintable та MinimalAPI — що означає, що ви не можете створити клас C++, який наслідується від класу AEditorFunctionalTest, але можете створити BP, який наслідується від нього:

pic

Ось найбільш важливі події та функції, які надаються класом Functional Test:

pic

Після створення вашого Functional Test актора, просто розмістіть його на карті. Тепер його тестовий тег має автоматично згенеруватися у вікні Frontend автоматизації тестів:

pic

Тести редактора

Якщо ви увімкнете плагін Editor Tests, ви зможете використовувати новий клас Editor Utility Blueprint — Editor Utility Test. Це означає, що ви також можете створювати тести редактора в BP.

pic

Клас UEditorUtilityTest має дуже схожі функції до класу AFunctionalTest

Подібно до Функціональних тестів, Editor Utility Tests повинні автоматично відображатися в Testing Automation Frontend:

pic

Крім того, ви можете використовувати ці теги для запуску як Функціональних тестів, так і Editor Utility Tests з командного рядка! 🎉

Приклад тестів

Нещодавно я створив плагін під назвою Editor Test Utilities. Це, по суті, набір автоматизаційних тестів для поширених проблем з активами.
З наданими тестами ви можете перевіряти такі проблеми, як:

  • Надто складний ланцюг залежностей/посилань активів для Player Pawn
  • Активи з надто великим розміром карти (розмір на диску)
  • Меші з надто великою кількістю трикутників
  • Blueprints з порожніми тиками або тиками, увімкненими за замовчуванням
  • Blueprints, що використовують функції, як “GetAllActorsOfClass”
  • Blueprints, що використовують чисті функції з кількома виходами
  • User Widgets, що використовують прив'язки
  • Redirectors в проекті

Я також надав Python скрипти, які активують ці тести. Ці скрипти можна виконати під час запуску редактора. Якщо тест із скрипту не пройде, це викликає сповіщення в Message Log (якщо тест проходить успішно, сповіщення не буде додано до Message Log під час запуску редактора).

Ці тести повинні допомогти вам підтримувати проект у хорошому стані.

Інші корисні матеріали

  1. Курс з автоматизації Python для Unreal Engine 5
  2. Як використовувати Python в Unreal Engine 4
  3. Python Input & Output змінні в утилітах Blueprints
  4. Створення функціональних тестів з Automation System

Вам сподобалися мої статті? Будь ласка, подумайте про підтримку мене. Дякую!

Перекладено з: Automate everything you can in Unreal Engine! You will thank me later

Leave a Reply

Your email address will not be published. Required fields are marked *