Как я два месяца писал плагин для Unreal Engine 5 и что из этого вышло

Как я два месяца писал плагин для Unreal Engine 5 и что из этого вышло

Всё началось с работающего плагина для UE 4.27. Он умел конвертировать Static Mesh в ISM/HISM, объединять группы и применять настройки оптимизации. 4000 строк кода, полгода разработки, доведённый до ума интерфейс. Задача - портировать на UE 5.5, 5.6 и 5.7. Казалось бы, поменять пару API, пересобрать - и готово. На практике всё пошло иначе.

Первое, что стало очевидно, нельзя просто скопировать код. UE5 слишком сильно отличается от UE4. Нужна новая архитектура. Плагин разбился на модули: общие структуры, runtime-логика без привязки к редактору, editor-слой с транзакциями и интерфейсом. Добавился слой совместимости для различий между версиями движка, один заголовочный файл, который решает, какой API использовать. Позже модульная структура упростилась, но фундамент остался гибким.

Основная логика портировалась не без сюрпризов. В UE5 все акторы Blueprint'ы, и старый добрый Cast просто не находил объекты на сцене. Пришлось переписывать группировку мешей. Дальше — транзакции для Undo/Redo, сохранение в Blueprint, перемещение по папкам аутлайнера, настройки пивота и судьбы оригиналов.

UE5 принёс Nanite, и это потребовало отдельного внимания. Плагин теперь анализирует выделенные меши и предупреждает о конфликтах: Nanite с World Position Offset сломает рейтрейсинг-тени, Nanite с Masked-материалами даст дикий overdraw. Плагин не блокирует работу - он информирует. Пользователь принимает решение сам.

Появились новые операции. Extract - точечное извлечение одного инстанса из группы. Раньше чтобы подвинуть один камень из пятисот, нужно было разобрать всю группу, поправить и собрать обратно. Теперь это одна кнопка. Append - добавление новых мешей к существующим инстансам при смешанном выделении. Больше никаких «выберите объекты одного типа».

Интерфейс собирался на Editor Utility Widget - чекбоксы, комбобоксы, текстовые поля, кнопки. Информационная панель с подсчётом Draw Calls до и после, Nanite-статус, автообновление при выделении. Снапшот настроек - выделил группу, и все параметры подтянулись в интерфейс.

Баги находились там, где не ждали. Кнопка Convert не работала из-за неправильной передачи World из виджета. Append при Undo ломал ISM-компоненты - транзакции не сохраняли состояние компонентов перед удалением. CalculateDrawCallSavings для ISM считал каждый инстанс как отдельный Draw Call, хотя тысяча кубов в одном компоненте - это один вызов. NaniteSettings в UE 5.7 стал deprecated, пришлось делать макрос совместимости. Extract в первой версии сбрасывал пивот в ноль - логику пришлось переписывать через связку Extract-Convert.

Плагин должен работать на трёх версиях движка с одним кодом. Никаких «скачайте версию для вашего UE». Слой совместимости в одном заголовочном файле разруливает всё: где-то отличается API Content Browser, где-то методы Data Layer переименованы, где-то доступ к свойствам заменён на аксессоры.

Финальный этап - документация на двух языках, описание для площадок, чистка билдов, проверка на чистом проекте.

Что получилось в итоге. InstanceForge - это не просто порт старого плагина. Это новый продукт под современные реалии UE5. Шесть операций, Nanite-валидация, поддержка смешанного выделения, точечное редактирование инстансов, полный Undo/Redo, три версии движка.

Два месяца работы. 4000 строк оригинального кода превратились в 6000 строк нового. Десятки исправленных багов. Три переписанных архитектуры.

Оно того стоило.

Руководство пользователя для ознакомления

Сам плагин можно приобрести тут за вполне скромную цену.

Чуть позже будет возможность купить через FAB.

7
3
1
1
28 комментариев