Blutilities и EditorUtilityWidget


И Blutilities, и EditorUtilityWidget выполняют одну и ту же задачу: экономят нам время. Они призваны автоматизировать ту работу, для которой мы можем составить алгоритм. Например, покрасить каждое второе дерево на уровне в желтый, поставить лампу на каждую тумбочку, или что угодно еще, что мы можем, но не хотим делать самостоятельно.
Глобальной разницы между Blutility и EditorUtilityWidget нет, почти всегда они могут заменить друг друга, но у них есть отличие: Blutility всегда нужно размещать на уровне, благодаря чему мы можем использовать его координаты в логике. EditorUtilityWidget размещать на уровне нельзя.

Blutilities

Blutility или блютилити - это блюпринт, унаследованный от AActor, который имеет один, или несколько специальных ивентов, которые можно вызывать прямо в эдиторе.
Как сделать:
1 - Для начала создадим новый BP Actor.
2 - Теперь добавим Custom Event.
3 - Выбрав новый ивент, во вкладке Details назначим Call In Editor - True.
4 - Добавим блюпринт на уровень.
При выборе блюпринта, во вкладке Details появится кнопка с названием ивента.
Блютилити готов и работает, но в настоящий момент ничего не делает.
Я добавлю блюпринт BP_Box, который будет из себя представлять простой Static Mesh в виде белого куба.
1 - В блютилити добавлю простейшую логику:
В начало ивента поставлю цикл For Loop на десять шагов, в теле цикла будет создаваться BP_Box и ему будет назначаться Transfrom с вычисленным Location. Location берет Y и Z координаты от блютилити, X получается умножением индекса цикла на 150 и сложением этого числа с X координатой блютилити.
2 - Компилируем, сохраняем и пробуем запустить блютилити.
Отлично, все работает.

Но это можно легко и быстро сделать вручную, скажете вы и будете правы, поэтому вот следующий пример:

Допустим, нам нужно разместить 10 кубов не просто в пространстве, а обязательно положить их на наклонную поверхность с правильным углом. Звучит сложнее, да и времени займет больше, особенно, если количество кубов вырастет с 10 до 100 или 1000.

А теперь доработаем наше блютилити, чтобы оно делало эту работу за нас:
1 - Добавляем новую логику в блюпринт:
После создания куба ставлю LineTraceByChannel, который будет делать трейс вниз на 10 метров. Ноде лайнтрейса важно добавить созданный куб в ActorsToIgnore, так как действие происходит не в кубе, а в блютилити, и куб, следовательно, игнорироваться не будет. Далее нода Branch проверяет, был ли положительным хит лайнтрейса и если да, то назначаем кубу координаты столкновения из Hit Result, угол получаем с помощью ноды RotationFromXVector, которой даем Normal так же из Hit Result.
2 - Жмем кнопку, все работает, отлично!

EditorUtilityWidget

EditorUtilityWidget или ЭдиторЮтилитиВиджет - это блюпринт виджет, наследованный от UEditorUtilityWidget, который позволяет запускать его прямо в эдиторе и выполнять любую написанную в нем логику.
Как сделать:
1 - Для начала создадим новый EditorUtilityWidget.
2 - Теперь добавим кнопку и текст, напишем что она будет делать.

3 - Откроем EventGraph и добавим логику.
В начале ивента создам ноду GetAllActorsOfClass, которая будет искать все BP_Box на уровне. По найденным экторам пройдет цикл, внутри которого нода FlipFlop будет вызывать SetMaterial через раз, благодаря чему можно добиться изменения материала у каждого второго эктора.
4 - Чтобы запустить виджет, нужно кликнуть на него ПКМ и выбрать “Run Editor Utility Widget

5 - Жмем кнопку и радуемся результату:

Заключение

Используя EditorUtilityWidget и Blutility, можно создать удивительные и крайне полезные инструменты, размером с целые плагины. Их функционал можно сильно расширить, если добавить код в C++, который позволит менять CDO блюпринтов, о чем я обязательно напишу в следующем посте.

Written on January 3, 2023