Ещё одним препятствием, характерным для жанра «платформер», являются вращающиеся объекты, такие как поворачивающаяся платформа, по которой нужно постоянно бежать, или планка, перемещающаяся вперёд и назад, через которую требуется перепрыгивать.
Вторым компонентом преобразования объекта является его вращение, и объектом можно манипулировать, поворачивая его вокруг оси. Существует несколько различных способов создавать уникальные препятствия в стиле платформера, используя вращение, и в этом разделе вы освоите их программирование.
Создание вращающихся объектов окружения
Чтобы создать код, обеспечивающий вращение объектов окружения, выполните следующие шаги:
Создайте новый класс Verse, наследующийся от
movable_prop, с помощью проводника Verse и назовите егоrotating_prop. Добавьте спецификатор<concrete>в этот класс, чтобы вывести его свойства в интерфейс UEFN.Verse# A prop that rotates by an additional rotation or rotates to match # a Creative prop's rotation. rotating_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 } AdditionalRotationTip<localizes>:message = "The rotation to apply to the RootProp." ShouldRotateForeverTip<localizes>:message = "Whether the RootProp should rotate forever." MatchRotationTargetTip<localizes>:message = "The optional prop whose rotation the RootProp should rotate to. Use this if you do not want to set an Additional Rotation." # A prop that rotates by an additional rotation or rotates to matchВ начале определения класса
rotating_propдобавьте следующие поля:Редактируемое
вращениес названиемAdditionalRotation. Это вращение, применяемое к объекту окружения. После выполнения функцииMove()вращение объекта окружения будет смещено на это значение.Verse# The additional rotation to apply to the RootProp. @editable {ToolTip := AdditionalRotationTip} AdditionalRotation:rotation = rotation{}Редактируемая переменная типа
logicс названиемShouldRotateForever. Определяет, должен ли объект окружения продолжать вращаться, не возвращаясь в исходное состояние.Verse# Whether the RootProp should rotate forever. @editable {ToolTip := ShouldRotateForeverTip} ShouldRotateForever:logic = trueРедактируемая переменная
creative_propтипа option с названиемMatchRotationTarget. Если ваш объект окружения должен поворачиваться в положение вращения другого объекта, вы можете установить это значение вместо использованияAdditionalRotation.Verse# The optional prop whose rotation RootProp should rotate to match. Use this if you # do not want to set an additional rotation. @editable {ToolTip := MatchRotationTargetTip} MatchRotationTarget:?creative_prop = falseПеременная типа
rotationс названиемTargetRotation. Это значение вращения, до которого в настоящее время поворачивается объект окружения.Verse# The rotation the prop is currently rotating toward. var TargetRotation:rotation = rotation{}
Окончательное определение класса должно выглядеть следующим образом:
Verseusing { /Fortnite.com/Devices } using { /Fortnite.com/Devices/CreativeAnimation } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/SpatialMath } AdditionalRotationTip<localizes>:message = "The rotation to apply to the RootProp." ShouldRotateForeverTip<localizes>:message = "Whether the RootProp should rotate forever." MatchRotationTargetTip<localizes>:message = "The optional prop whose rotation the RootProp should rotate to. Use this if you do not want to set an Additional Rotation." # A prop that rotates by an additional rotation or rotates to matchПоскольку мы уже определили функцию
Move(), которая перемещает объект окружения вmovable_prop, её можно переопределить в этом классе. Переопределите функциюMove()в классеrotating_prop. В функцииMove()сначала нужно проверить, задана ли цельMatchRotationTarget, и сохранить её в переменнойRotationToMatch. Если да, установим вращениеTargetRotationравнымRotationToMatch. В противном случае установим его равнымAdditionalRotation.Verse# Rotate the RootProp by applying the TargetRotation, or toward the MoveTarget if one is set. Move<override>()<suspends>:void= # Set the TargetRotation to the MoveTarget's rotation if the MoveTarget is set. if: RotationToMatch := MatchRotationTarget?.GetTransform().Rotation then: set TargetRotation = RotationToMatch else: set TargetRotation = AdditionalRotationКак и в случае с
translating_prop, зададим режим воспроизведения анимации. Инициализируем новую переменнуюanimation_mode, назовём еёAnimationModeи присвоим ей значениеanimation_mode.OneShot. Это означает, что анимация остановится, как только объект достигнет цели. Если объект окружения не должен вращаться бесконечно либо перемещаться один раз и останавливаться, задайте режим анимации «пинг-понг». С помощью режима «пинг-понг» можно создавать объекты, которые циклически перемещаются туда и обратно, такие как стрелка метронома или мост, который постоянно поднимается и опускается.Verse# Set the default animation mode to play. # The OneShot animation mode will play the animation once. var AnimationMode:animation_mode := animation_mode.OneShot # If the RootProp should not reset and not stop when it finishes rotating, # set the animation mode to PingPong. if: not ShouldRotateForever? and not MoveOnceAndStop? then: set AnimationMode = animation_mode.PingPongЕсли для
ShouldResetзадано значение false, а дляShouldRotateForever— true, то объект окружения будет сохранять положение после каждой анимации, продолжая перемещаться при каждом выполненииMove()в цикле.Получим целевое вращение объекта окружения и сохраним его в новой переменной
RotateByMoveRotation, вызвавRotateBy()дляStartingTransformи передавTargetRotation. Затем вызовемMoveToEase(). Готовая функцияMove()должна выглядеть следующим образом:Verse# Rotate the RootProp by applying the TargetRotation, or toward the MoveTarget if one is set. Move<override>()<suspends>:void= # Set the TargetRotation to the MoveTarget's rotation if the MoveTarget is set. if: RotationToMatch := MatchRotationTarget?.GetTransform().Rotation then: set TargetRotation = RotationToMatch else: set TargetRotation = AdditionalRotationВ классе устройства
prop_animatorдобавьте новый редактируемый массив элементовrotating_propс названиемRotatingProps. Добавим в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." # Coordinates moving props through animation by calling each prop's Setup() method. prop_animator := class(creative_device):Сохраните свой код и скомпилируйте его.
Привязка объектов окружения к устройствам
Вернувшись в редактор, удалите некоторые объекты окружения после участка переносимых объектов, чтобы создать ещё одну пропасть. Добавьте на уровень Основание поворотного стола FG01 и Двойную вращающуюся планку (малую) FG01. Назовите основание RotatingBase, а планку — Spinning Bar. Установите планку над основанием и разместите оба объекта окружения над пропастью.
Настройка вращающихся объектов окружения. Вращающаяся планка и вращающееся основание поворачиваются в одном направлении с разной скоростью.
На панели Структура выберите свой prop_animator и добавьте в массив RotatingProps элементы, соответствующие всем вращающимся объектам окружения. Задайте следующие параметры для каждого объекта окружения:
| option | Значение | Пояснение |
|---|---|---|
Дополнительное вращение | Z, 90,0 | Этот объект окружения всякий раз будет поворачиваться на 90 градусов относительно оси Z. |
RootProp | Укажите объект окружения, который нужно анимировать | Это анимируемый объект окружения. |
Продолжительность перемещения | 2,0, 3,0 | Задайте для одного из объектов окружения меньшую длительность, чтобы объекты вращались с разной скоростью. |
Тип замедления перемещения | Линейный | При такой настройке объекты окружения анимируются с постоянной скоростью. |
Примените изменения и посмотрите, как поведут себя объекты окружения! Поэкспериментируйте со значениями параметров, чтобы получить различные варианты вращения, а также попробуйте задавать вращение во всех прочих измерениях, чтобы создать препятствия разных типов.
Далее
В следующем разделе мы объединим перемещение и вращение, чтобы создать объекты окружения, способные выполнять и то, и другое!
Полный код
Ниже приведён полный код, написанный в этом разделе:
rotating_prop.verse
using { /Fortnite.com/Devices }
using { /Fortnite.com/Devices/CreativeAnimation }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/SpatialMath }
AdditionalRotationTip<localizes>:message = "The rotation to apply to the RootProp."
ShouldRotateForeverTip<localizes>:message = "Whether the RootProp should rotate forever."
MatchRotationTargetTip<localizes>:message = "The optional prop whose rotation the RootProp should rotate to. Use this if you do not want to set an Additional Rotation."
# A prop that rotates by an additional rotation or rotates to match
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."
# Coordinates moving props through animation by calling each prop's Setup() method.
prop_animator := class(creative_device):