Некоторые простейшие препятствия просто перемещаются туда и обратно. Подобные препятствия, когда нужно вовремя прыгать и осторожно перемещаться, чтобы не упасть, часто встречаются в играх в жанре «платформер».
Такое перемещение платформы называется переносом, или изменением положения в преобразовании объекта. В этом разделе вы узнаете, как создавать платформы, которые не только перемещаются туда и обратно, но также могут перемещаться в несколько точек в мире, а затем используете их, чтобы создать своё первое препятствие!
Создание переносимых объектов окружения
Следуйте указаниям ниже, чтобы написать код, который переносит платформы:
С помощью проводника Verse создайте новый класс Verse, наследующийся от
movable_prop, и назовите егоtranslating_prop. Добавьте спецификатор<concrete>в этот класс, чтобы вывести его свойства в интерфейс UEFN.Verse# A prop that moves (translates) toward either a Creative prop target # or a position in world space. translating_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 } MovePositionTip<localizes>:message = "The optional position to move to World Space. Use this if you do not want to set a MoveTarget." # A prop that moves (translates) toward either a Creative prop target # or a position in world space. translating_prop<public> := class<concrete>(movable_prop):В начале определения класса
translating_propдобавьте следующие поля:Редактируемый массив элементов
creative_propс названиемMoveTargets. Это объекты окружения творческого режима, к которым ваш объектRootPropбудет перемещаться во время игры. В качестве цели перемещения можно использовать не преобразование, а некоторый другой объект окружения. Это позволяет наглядней представлять, куда движутся объекты. Позже в редакторе мы сделаем так, чтобы целевые объекты были невидимы во время игры.Verse# The Creative prop targets for the RootProp to move toward. @editable {ToolTip := MoveTargetsTip} var MoveTargets:[]creative_prop = array{}Редактируемая переменная
vector3типа option с названиемMovePosition. Если объектMoveTargetне присвоен, то наш корневой объект окружения будет перемещаться в точку, определяемую этой переменной.Verse# The position for the RootProp to move toward. Use this if you # do not want to set a MoveTarget. @editable {ToolTip := MovePositionTip} var MovePosition:?vector3 = falseПеременная типа
vector3с названиемTargetPosition. Это положение, в которое фактически будет перемещаться наш объект окружения, и оно определяется либо как положение цели перемещения, либо какMovePosition.Verse# The position the prop is currently targeting. var TargetPosition:vector3 = vector3{}Определение класса должно выглядеть следующим образом:
Verse# A prop that moves (translates) toward either a Creative prop target # or a position in world space. translating_prop<public> := class<concrete>(movable_prop): # The Creative prop targets for the RootProp to move toward. @editable {ToolTip := MoveTargetsTip} var MoveTargets:[]creative_prop = array{} # The optional position for the RootProp to move toward. Use this if you # do not want to set a MoveTarget.
Поскольку мы уже определили функцию
Move(), которая перемещает объект окружения вmovable_prop, её можно переопределить в этом классе. Переопределите функциюMove()в классеtranslating_prop.Verse# Translate toward the MovePosition, or MoveTarget if one is set. Move<override>()<suspends>:void=В функции
Move(), в выраженииifпроверим, задано ли положениеMovePositionи сохранено ли оно в видеNewPosition. Если да, установим положениеTargetPositionравнымNewPosition.Verse# Translate the RootProp toward the MoveTarget, or MovePosition if one is set. Move<override>()<suspends>:void= # Set the TargetPosition to the MovePosition if it is set. if: NewPosition := MovePosition? then: set TargetPosition = NewPositionВ функцию
MoveToEase()необходимо передаватьanimation_mode. Анимация воспроизводится один раз при каждом вызовеMove(), а параметрanimation_modeопределяет, что происходит после завершения воспроизведения анимации. Вызовем функциюMoveToEase(), передав в неёTargetPosition,MoveDuration,MoveEaseTypeиanimation_mode.OneShot. Использование этого режима анимации означает, что анимация остановится, как только объект достигнет цели. Это перегруженная функцияMoveToEase(), которую мы определили ранее, в которую не требуется передавать вращение и масштаб.Verse# Set the TargetPosition to the MovePosition if it is set. if: NewPosition := MovePosition? then: set TargetPosition = NewPosition # Call MoveToEase to start moving the prop. The OneShot animation mode will play the animation once. RootProp.MoveToEase(TargetPosition, MoveDuration, MoveEaseType, animation_mode.OneShot)Режим однократного воспроизведения анимации пригодится, если требуется вернуть объект в исходное положение или продолжить его перемещение, но что делать, если нужно переместить объект в обратном порядке? В этом случае можно использовать режим анимации
PingPong. В данном режиме анимация воспроизводится сначала в прямом, а затем в обратном порядке, и объект окружения возвращается в исходное положение. Также есть режим анимацииLoop, который обеспечивает воспроизведение анимации в цикле, при этом она завершается в том же месте, в котором началась. Выбирайте режим анимации в соответствии с требованиями вашей игры.Если при настройке объектов окружения вы не задали
MovePositionв редакторе, нужно будет установить одну или несколько целейMoveTargetsдля перемещения корневого объекта окружения. Чтобы обработатьMoveTargetsв выраженииfor, нужно перебрать все цели в массивеMoveTargets. Проверим, установлена ли цельMoveTarget, вызвавIsValid[]. Если да, установим положениеTargetPositionравным переносуMoveTarget.Verse# Set the TargetPosition to the MovePosition if it is set. if: NewPosition := MovePosition? then: set TargetPosition = NewPosition else: for: MoveTarget:MoveTargets do: # Set the TargetPosition to the MoveTarget's position if theНаконец, вызовем
MoveToEase(), снова передав режим анимацииanimation_mode.OneShot. Выполнение этой процедуры в выраженииforобеспечит последовательное перемещение объекта окружения к каждой из целей, при этом в зависимости от установленных параметров в конце объект вернётся в исходное положение или продолжит перемещение. Готовая функцияMove()должна выглядеть следующим образом:Verse# Translate the RootProp toward the MoveTarget, or MovePosition if one is set. Move<override>()<suspends>:void= # Set the TargetPosition to the MovePosition if it is set. if: NewPosition := MovePosition? then: set TargetPosition = NewPosition # Call MoveToEase to start moving the prop. The OneShot animation mode will play the animation once.
Создание устройства Verse
Теперь, когда код Verse готов, нужен способ, чтобы вызывать этот код на уровне. Используем ещё одно устройство Verse для координации объектов окружения и их настройки в начале игры. Выполните следующие действия, чтобы координировать препятствия и перемещать платформы!
Создайте новое устройство Verse с названием
prop_animatorс помощью проводника Verse. Это устройство будет координировать перемещение объектов окружения.В
prop_animatorдобавьте редактируемый массив элементовtranslating_propс названиемTranslatingProps. Затем в функции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." # Coordinates moving props through animation by calling each moveable_prop's Setup() method. prop_animator := class(creative_device): # Array of moveable_props that translate using animation.Сохраните свой код и скомпилируйте его.
Перетащите своё устройство
prop_animatorна уровень.
Привязка объектов окружения к устройствам
Вернувшись в редактор, удалите некоторые объекты окружения в начале уровня, чтобы создать пропасть. Добавьте на уровень два объекта окружения Аэроплатформа (средняя) FG01. Так как это платформы, которые мы будем анимировать, назовите их TranslatingPlatform. После этого добавьте несколько объектов Кнопка-луковица FG01, которые будут целями, к которым будет перемещаться каждая платформа. Назовите их PlatformTarget. Поместите платформы над пропастью и убедитесь, что цели размещены там, куда должны перемещаться платформы. Вы можете установить для каждой платформы несколько целей.
Настройка переносимых объектов окружения. Каждая платформа перемещается вперёд и назад между двумя целями перемещения, как обозначено стрелками.
Если вы хотите скрыть целевые объекты окружения во время игры, не забудьте установить значение True для параметра каждой цели Актор, скрытый во время игры в разделе Отрисовка.
Перетащите своё устройство prop_animator на уровень и выберите его. На панели Структура добавьте в массив TranslatingProps элемент, соответствующий каждой платформе. Задайте следующие параметры для каждого объекта окружения:
| Настройка | Значение | Пояснение |
|---|---|---|
Цели перемещения | Укажите цели для перемещения объекта окружения. | Это цели, к которым объект окружения творческого режима будет перемещаться в указанном порядке. |
RootProp | Укажите объект окружения, который нужно анимировать. | Это анимируемый объект окружения. |
Нажмите Запуск сеанса, и ваши платформы начнут анимироваться! Попробуйте менять MoveDuration, MoveEaseType, а также начальную и конечную задержки, чтобы создавать различные сценарии.
Перенос готов, и в следующем разделе мы создадим объекты окружения, вращающиеся в разных направлениях!
Далее
Полный код
Ниже приведён полный код, написанный в этом разделе:
translating_prop.verse
using { /Fortnite.com/Devices }
using { /Fortnite.com/Devices/CreativeAnimation }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/SpatialMath }
MovePositionTip<localizes>:message = "The optional position to move to World Space. Use this if you do not want to set a MoveTarget."
# A prop that moves (translates) toward either a Creative prop target
# or a position in world space.
translating_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."
# Coordinates moving props through animation by calling each moveable_prop's Setup() method.
prop_animator := class(creative_device):
# Array of moveable_props that translate using animation.