В этом непродолжительном уроке мы поговорим об использовании Apparatus-плагина в Unreal Engine. Вы создадите свою первую деталь и научитесь реализовывать игровую логику в специально отведённом Blueprint-классе. Здесь продемонстрированы самые главные особенности работы с плагином на примере простого двумерного платформера.
Для дальнейшего чтения необходимо понимать базовые концепции ECS-подхода. Для этого есть наша краткая справка по ECS.
D_Moveable
,D_Moving
,D_OnFloor
,D_Fallable
.D_Moveable
с значением по умолчанию 100.0
.ETouch Swipe Direction
с именем Direction
со свойством „Editable“ в D_Moving
.Box Collision Object Reference
с именем „Bottom“ к D_Fallable
детали со свойствами „Editable“ и „Exposed on spawn“.(0.25, 0.25, 0.25)
- и, щёлкнув правой кнопкой мыши по вектору scale, вставьте скопированное значение; если всё сработает правильно, значения компонент установятся в надлежащие числа). Теперь добавим Actor-component „Spring Arm“ и привяжем его к „DefaultSceneRoot“, затем добавим также камеру, привязав её к „Arm“ (убедитесь, что при этом вектора масштаба на новых компонентах остались в значениях по умолчанию (1,1,1)
). Немного повернём „Arm“ по Z-оси на 180°, а после и по Y-оси, но уже на -30°.+
добавляем новые детали и выбираем их типы. Нам понадобятся два класса, как изображено на скриншоте:500
.D_Moving
. После этого вы можете видеть, что выходной тип функции сменился на D Moving Object Reference
. Иначе говоря, после того, как деталь была добавлена к сущности, можно преобразовать её в переменную („promote to variable“) и использовать в своём коде для вызова её функций или доступа к полям. В нашем случае, мы обратимся к полю направления („Direction“) и установим соответствующие значения. Не забудьте установить флаги „Reuse Disabled“ (о том, зачем они, - чуть позже). Полная картина должна быть примерно такой:Delta Seconds
в глобальную переменную GlobalDelta
. Теперь нам необходимо интегрироваться по всем сущностям (Subject-ам) и для каждого проверять, какой набор деталей на нём есть. Для этого, пожалуйста, вытяните следующую ноду „Sequence“ и из её первого output-pin-а вытяните ноду „Mechanic“..
и !
. Используя эту технику и выбирая необходимые типы деталей в настройках ноды, вы определяете фильтр механики, задаёте множество сущностей, над которыми надо выполнить тот или иной код.Например, пожалуйста, добавьте две .
-опции и удалите остальные (правой кнопкой мыши по пункту и клик по „Remove Detail Pin“). Выберете соответствующие типы - D_Moveable
and D_Moving
. Преобразуйте выходное значение Moving
в переменную TempMoving
, чтобы блупринт-чертёж не стал походить на макароны. Из „Subjective“ выходного значения ноды „Mechanic“ вытянете „Get Actor“ pure-функцию („Subjective“ содержит ссылку на сущность, обрабатываемую в очередном вызове „Evaluation body“; а функция „Get Actor“, также предоставляемая плагином, по сущности возвращает ссылку на объект Actor-а). Из выхода „Get Actor“ вытащите, пожалуйста, „AddActorLocalOffset“ стандартную функцию UE, а из Moving
выхода ноды „Mechanic“ - „Direction“ переменную, которую мы добавили в этот класс ранее. При помощи „Select“-блока мы можем легко выбирать вектор смещения отвечающий входному направлению движения, полученному из поля детали. В блоке, пожалуйста, разбейте „Left“ & „Right“ вектора по компонентам и заполните Y-компоненту случая „Left“ значением, полученным умножением переменной „Speed“ из детали „Moveable“ и глобальной переменной „GlobalDelta“. Для „Right“-случая воспользуемся тем же значением, но взятым с обратным знаком. После ноды „AddActorLocalOffset“ нужно деактивировать деталь „TempMoving“, чтобы наш куб не двигался в сторону бесконечно. Для этого достаточно изменить значение „Enabled“ детали на false. Граф должен получиться таким:Попробуем разобраться, что же здесь происходит. Как вы помните, мы прежде описали, как нажатие клавиш игроком отражается на нашей игровой логике (добавлением деталей D_Moving
). Здесь мы просто проходимся по всем сущностям с вышеупомянутыми D_Moving
и D_Movable
(в число которых входит только наша пешка) и для каждой такой сущности выполняем простые действия. В зависимости от направления мы сдвигаем Actor“а по Y-оси (если смотреть со стороны камеры, это как раз и будет направление влево, если смещение положительное, и вправо, если отрицательное). После сдвига выполняется отключение детали D_Moving
, чтобы на следующем tick-е не обрабатывать пешку вновь. Когда игрок нажмёт клавишу D или A во второй раз, произойдёт следующее: помните checkbox-сы, которые мы устанавливали ранее? „Reuse Disabled“ на самом деле означает, что в случае, если сущность имеет выключенную деталь одноимённого типа, то выключенная деталь активируется и возвращается как выходное значение функции „Add detail“; вместо того, чтобы создавать и активировать новую, активируется и возвращается выключенная. Итак, вы можете запустить игру и убедиться в том, что всё работает. Используйте клавиши A или D, чтобы перемещать куб по сцене.BoxCollision
к „DefaultSceneRoot“. Используем следующие transform-вектора:(X=0.000000,Y=0.000000,Z=-13.5)
(X=0.400000,Y=0.400000,Z=0.025000)
. После этого в „Collision“ секции справа в панели деталей выберем „OverlappAll“ предустановку. Картина должна выглядеть так:D_Fallable
так, чтобы она ссылалась на добавленную коллизию:Здесь мы уверены, что сущность будет иметь данную деталь, но вы должны понимать ситуации, когда выходное значение „Find detail“ должно быть проверено перед использованием.D_Fallable
и одновременно деталь D_OnFloor
выключена и вместе с тем дно коробки пересекается с некоторым Actor-ом, то мы устанавливаем деталь D_OnFloor
, если же дно коробки не пересекается - значит, текущую сущность нужно сдвинуть вниз, как бы симулируя равномерное падение.D_OnFloor
, когда сущность прыгает. Можно это сделать так:Если направление - Вверх, то мы выключаем деталь, опять же используя встроенную функцию плагина. Теперь можно и прыгать и падать. На этом всё, результат проделанной работы должен выглядеть примерно так:
Apparatus - это очень удобный и многофункциональный плагин, даже больше чем плагин - это полноценный дата-ориентированный фреймворк. Он предоставляет набор новых принципов разработки и техник проектирования. Эти техники обычно называются data-driven, так как мы по большей части мыслим уже деталями, а не классами или наследованием. Вы можете использовать наш инновационный инструмент в своих собственных разработках игр и расширять свои возможности, реализуя собственные классы C++, имплементирующие необходимые интерфейсы Apparatus“а.
Все функциональное множество этого плагина не может быть продемонстрировано в столь коротком уроке, как этот. Основной же мотив туториала состоял именно в том, чтобы ввести новичка в мир ECS и Apparatus-а в частности. Не брезгайте проверить наши ссылки на другие ресурсы и смело задавайте возникшие вопросы в TurboTalk-форуме и/или в Discord-чате. Мы обеими руками за обратную связь, готовы давать своевременную поддержку и приветствуем заинтересованность любого характера!