Иногда в платформерах встречаются препятствия, которые меняют свои размеры. Это могут быть платформы, которые увеличиваются и уменьшаются либо становятся выше или ниже по какой-то оси. Когда размеры объекта меняются таким образом, это называется изменением его масштаба.
Масштаб объекта — это набор коэффициентов, на которые умножаются его исходные размеры по каждой оси. Обычно объекты имеют масштаб вида {X := 1.0, Y := 1.0, Z := 1.0}. Если удвоить значение Z масштаба объекта, последний станет в два раза выше. Если его уменьшить в два раза, объект станет вдвое ниже.
Масштабирование — это заключительная часть процесса преобразования. В этом разделе вы узнаете, как создавать увеличивающиеся и уменьшающиеся объекты, управляя их масштабом.
Создание масштабируемых объектов окружения
Чтобы создать код, масштабирующий объекты окружения, выполните следующие шаги:
Создайте новый класс Verse, наследующийся от
movable_prop, с помощью проводника Verse и назовите егоscaling_prop. Добавьте спецификатор<concrete>в этот класс, чтобы вывести его свойства в интерфейс UEFN.Verse# A prop that scales toward either a given scale or a Creative prop's scale. scaling_prop<public> := class<concrete>(movable_prop):Добавьте выражения
using { /Fortnite.com/Devices/CreativeAnimation }иusing { /UnrealEngine.com/Temporary/SpatialMath }в начало файла, чтобы импортировать эти модули. Они потребуются для анимирования вашего объекта окружения. Также ниже приведены подсказки, используемые в данном разделе.Verseusing { /Fortnite.com/Devices } using { /Fortnite.com/Devices/CreativeAnimation } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/SpatialMath } MatchScaleTargetTip<localizes>:message = "The optional position to move to World Space. Use this if you do not want to set a MoveTarget." # A prop that scales toward either a given scale or a Creative prop's scale. scaling_prop<public> := class<concrete>(movable_prop):В начале определения класса
scaling_propдобавьте следующие поля:Редактируемый массив элементов типа
vector3с названиемScaleTargets. Это значения масштаба, в соответствии с которыми объект окружения будет увеличиваться или уменьшаться. После выполнения функцииMove()масштаб объекта окружения будет умножен на это значение.Verse# The array of vector3 targets for the RootProp to scale to. @editable {ToolTip := MoveTargetsTip} var ScaleTargets:[]vector3= array{}Редактируемая переменная
creative_propтипа option с названиемMatchScaleTarget. Если ваш объект окружения должен масштабироваться до масштаба другого объекта, вы можете установить это значение вместо использованияScaleTargets. Например, это может быть удобно, если нужно создать ряд платформ, которые увеличиваются до одинакового размера перед возвратом в исходное положение.Verse# The optional Creative prop for the RootProp to match scale to. @editable {ToolTip := MatchScaleTargetTip} var MatchScaleTarget:?creative_prop = falseПеременная типа
rotationс названиемTargetScale. Это значение масштаба, до которого в настоящее время масштабируется объект окружения.Verse# The scale the prop is currently targeting. var TargetScale:vector3 = vector3{}
Окончательное определение класса должно выглядеть следующим образом:
Verseusing { /Fortnite.com/Devices } using { /Fortnite.com/Devices/CreativeAnimation } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/SpatialMath } MatchScaleTargetTip<localizes>:message = "The optional position to move to World Space. Use this if you do not want to set a MoveTarget." # A prop that scales towards either a given scale or a creative prop's scale. scaling_prop<public> := class<concrete>(movable_prop):Поскольку мы уже определили функцию
Move(), которая перемещает объект окружения вmovable_prop, её можно переопределить в этом классе. Переопределите функциюMove()в классеscaling_prop. В функцииMove()сначала нужно проверить, задана ли цельMatchScaleTarget, и сохранить её в переменнойScaleToMatch. Если да, то устанавливаемTargetScaleравнымScaleToMatch, после чего вызываем функциюMoveToEase(), передав в неё параметрыTargetScale,MoveDuration,MoveEaseTypeиanimation_mode.OneShot. Это функцияMoveToEase(), перегруженная ранее, которая изменяет только масштаб.Verse# Scale the RootProp toward the ScaleTarget, or MatchScaleTarget if one is set. Move<override>()<suspends>:void= # Set the TargetScale to the MatchScaleTarget if it is set. if: ScaleToMatch := MatchScaleTarget?.GetTransform().Scale then: set TargetScale = ScaleToMatch # Call MoveToEase to start scaling the prop. The OneShot animation mode will play the animation once. RootProp.MoveToEase(MoveDuration, TargetScale, MoveEaseType, animation_mode.OneShot)Если масштаб
MatchScaleTargetне задан, нужно будет перебрать элементы массиваScaleTargets. В выраженииforпереберём все элементыScaleTargetв массивеScaleTargets, установив масштабTargetScaleравнымScaleTarget. Затем вызовемMoveToEase(), передав те же значения, что и раньше. Готовая функцияMove()должна выглядеть следующим образом:Verse# Scale the RootProp toward the ScaleTarget, or MatchScaleTarget if one is set. Move<override>()<suspends>:void= # Set the TargetScale to the MatchScaleTarget if it is set. if: ScaleToMatch := MatchScaleTarget?.GetTransform().Scale then: set TargetScale = ScaleToMatch # Call MoveToEase to start scaling the prop. The OneShot animation mode will play the animation once.В классе устройства
prop_animatorдобавим новый редактируемый массив элементовscaling_propс названиемScalingProps. Добавим вOnBegin()ещё одно выражениеfor, в котором будут перебираться все вращаемые объекты окружения и для них будет вызываться функцияSetup(). Обновлённый классprop_animatorдолжен выглядеть следующим образом:Verseusing { /Fortnite.com/Devices } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/Diagnostics } TranslatingPropsTip<localizes>:message = "The props that translate (move) using animation." RotatingPropsTip<localizes>:message = "The props that rotate using animation." ScalingPropsTip<localizes>:message = "The props that scale using animation." # Coordinates moving props through animation by calling each prop's Setup() method. prop_animator := class(creative_device):Сохраните свой код и скомпилируйте его.
Привязка объектов окружения к устройствам
Вернувшись в редактор, удалите некоторые объекты окружения после участка вращающихся объектов, но перед поднятыми блоками, чтобы создать ещё одну пропасть. Добавьте на уровень Боксёрскую перчатку FG01. Назовите перчатку ScalingGlove. Разместите перчатку посередине пропасти и поверните её так, чтобы она была обращена вверх.
Настройка боксёрской перчатки. Перчатка увеличивается, образуя лифт, на котором могут подниматься игроки.
На панели Структура выберите свой prop_animator и добавьте в массив ScalingProps элемент, соответствующий перчатке. Задайте следующие параметры объекта окружения:
| option | Значение | Пояснение |
|---|---|---|
ScaleTargets | {1.0, 2.0, 1.0}, {1.0, 1.0, 1.0} | Этот объект окружения будет увеличиваться в два раза по оси Y, а затем восстанавливать первоначальные размеры. Обратите внимание, что, поскольку объект окружения повернут, теперь ось Y направлена вверх в локальном пространстве этого объекта. |
RootProp | Укажите объект окружения, который нужно анимировать. | Это анимируемый объект окружения. |
Примените изменения и посмотрите, как поведут себя объекты окружения! Поэкспериментируйте со значениями масштаба, чтобы получить разные размеры, а также попробуйте масштабировать другие объекты окружения, чтобы создать другие сценарии!
Далее
В следующем разделе мы объединим перемещение, вращение и масштабирование, чтобы создать объекты окружения, способные выполнять все три операции преобразования!
Полный код
Ниже приведён полный код, написанный в этом разделе:
scaling_prop.verse
using { /Fortnite.com/Devices }
using { /Fortnite.com/Devices/CreativeAnimation }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/SpatialMath }
MatchScaleTargetTip<localizes>:message = "The optional position to move to World Space. Use this if you do not want to set a MoveTarget."
# A prop that scales towards either a given scale or a creative prop's scale.
scaling_prop<public> := class<concrete>(movable_prop):
prop_animator.verse
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
TranslatingPropsTip<localizes>:message = "The props that translate (move) using animation."
RotatingPropsTip<localizes>:message = "The props that rotate using animation."
ScalingPropsTip<localizes>:message = "The props that scale using animation."
# Coordinates moving props through animation by calling each prop's Setup() method.
prop_animator := class(creative_device):