Платформы, которые исчезают при приземлении на них, являются основными элементами в играх жанра «платформер», таких как полосы препятствий. Они заставляют игрока действовать быстро и следить за каждым шагом, чтобы не упасть.
В этом уроке вы научитесь создавать платформу, которая будет исчезать, когда её коснётся игрок, и появляться через случайное количество секунд. В этом вам поможет язык Verse в Unreal Editor для Fortnite (UEFN). В данном примере показано, как создать область, в которой игрок перепрыгивает с одной платформы на другую, стараясь не упасть. В конце этого урока для вас приведён полный сценарий.

Используемая функция языка Verse
spawn
: выражениеspawn
используется для вызова асинхронной функции, которая заставляет платформу появиться вновь по истечении случайного количества секунд.
Используемые API Verse
-
Sleep()
: APISleep()
используется для реализации случайной задержки между исчезновением и появлением платформы. -
GetRandomFloat()
: APIGetRandomFloat()
используется для расчёта случайного времени до повторного появления платформы. -
Редактируемые свойства: в UEFN выведены четыре свойства — три значения с плавающей запятой для настройки времени задержки при исчезновении и появлении платформы и ссылка на саму платформу.
-
События устройства: вы будете использовать устройства Триггер с названием
TriggeredEvent
, чтобы знать, когда пользователь приземляется на платформу.
Подготовка уровня
В этом уроке в качестве отправной точки используется стартовый шаблон Verse. Для начала создайте новый проект на основе примера использования функции устройства Verse.

В этом примере используются следующие объекты окружения и устройства.
-
1 устройство Точка появления игрока: определяет, где должен появляться игрок в начале игры.
-
4 объекта окружения творческого режима: они имеют несколько вариантов поведения, которые можно вызвать с помощью Verse, такие как
Hide()
иShow()
, чтобы переключать видимость и столкновение платформ. В этом уроке используется Аэроплатформа A в качестве платформы, с которой взаимодействует пользователь, но вы легко можете заменить её на что-то другое, более соответствующее вашему острову. -
4 устройства Триггер: вы будете использовать их, чтобы знать, когда пользователь приземляется на платформу.
Выполните следующие действия, чтобы подготовить уровень:
-
Добавьте одну Аэроплатформу A в свою сцену. Разместите её над полом, чтобы игрок падал, если он не успеет спрыгнуть с исчезающей платформы. Задайте этому устройству название RecyclePlatform на панели Структура.
-
Добавьте в сцену устройство Триггер и сделайте его дочерним для RecyclePlatform. Разместите его сверху платформы и измените его размер, чтобы он соответствовал размеру платформы. Установите на панели Структура значение для Отображать в игре как False, а для Количество срабатываний — 1.
-
Разместите устройство Точка появления игрока на платформе. Здесь игрок появится в начале игры. Отключите функцию Отображение в игре на панели Структура устройства, чтобы игрок не мог стоять на точке появления после того, как он появится в игре. Полностью настройки должны выглядеть следующим образом:
Создание устройства
В данном примере для определения поведения, которое заставляет платформу исчезать, когда его касается игрок, и появляться вновь через случайное количество секунд, используется Verse-устройство. Ниже пошагово описан процесс создания этого устройства на языке Verse.
-
Создайте новое устройство Verse и назовите его disappear_on_touch_platform с помощью проводника Verse. Чтобы узнать, как создать новое устройство в Verse, см. Создание собственного устройства с помощью Verse.
-
Перетащите устройство disappear_on_touch_platform из Каталога ресурсов на уровень.
Редактирование свойств устройства в UEFN
В данном разделе показано, как раскрыть четыре свойства устройства в UEFN, чтобы их можно было изменять в редакторе:
-
Ссылка на объект творческого режима, который вы разместили на уровне.
-
Константа типа
float
с названиемDisappearDelay
, которая задаёт время ожидания с момента касания платформы игроком до её исчезновения. -
Две константы типа
float
DelayMin
иDelayMax
, которые задают минимальное и максимальное время ожидания до повторного появления платформы. Эти два значения определяют допустимый диапазон, из которого выбирается случайное время.
Следуйте дальнейшим инструкциям, чтобы сделать открытыми эти свойства устройства disappear_on_touch_platform, которое вы создали в предыдущем разделе.
-
Откройте проводник Verse и дважды нажмите на disappear_on_touch_platform.verse, чтобы открыть сценарий в Visual Studio Code.
-
Добавьте следующие поля в определение класса
disappear_on_touch_platform
:-
Редактируемая переменная типа
float
с названиемDisappearDelay
. Это время ожидания после касания платформы игроком до момента её исчезновения. Инициализируйте её со значением1.0
, что означает одна секунда.# Это время ожидания после касания платформы игроком до момента её исчезновения. @editable DisappearDelay:float = 1.0
-
Редактируемая переменная типа
float
с названиемDelayMin
. Это минимальное время ожидания до повторного появления платформы. Инициализируйте её со значением3.0
, или три секунды.# Минимальное время ожидания до повторного появления платформы. @editable DelayMin:float = 3.0
-
Редактируемая переменная типа
float
с названиемDelayMax
. Это максимальное время ожидания до повторного появления платформы. Инициализируйте её со значением4.0
, или четыре секунды.# Максимальное время ожидания до повторного появления платформы. @editable DelayMax:float = 4.0
-
Редактируемое поле класса
creative_prop
с названиемDisappearingPlatform
. Оно относится к платформе, которая периодически исчезает и появляется. Так как в вашем коде ещё нет ссылки на этот объект на уровне, вам нужно создать его экземпляр с пустым архетипомcreative_prop{}
. Ссылку на свою парящую платформу вы назначите позже.# Ссылка на платформу на уровне. @editable DisappearingPlatform:creative_prop = creative_prop{}
-
Редактируемое поле класса
trigger_device
с названиемPlatformTrigger
. Для этого устройства необходимо событие с названиемTriggeredEvent
, чтобы знать, когда пользователь приземляется на платформу.# Зона, в которую входит игрок, когда приземляется на платформу. @editable PlatformTrigger:trigger_device = trigger_device{}
-
-
Поля класса
disappear_on_touch_platform
должны выглядеть следующим образом:# Это Verse-устройство творческого режима, которое можно разместить на уровне disappear_on_touch_platform := class(creative_device): # Это время ожидания после касания платформы игроком до момента её исчезновения. @editable DisappearDelay:float = 1.0 # Минимальное время ожидания до повторного появления платформы. @editable DelayMin:float = 3.0 # Максимальное время ожидания до повторного появления платформы. @editable DelayMax:float = 4.0 # Ссылка на платформу на уровне. @editable DisappearingPlatform:creative_prop = creative_prop{} # Зона, в которую входит игрок, когда приземляется на платформу. @editable PlatformTrigger:trigger_device = trigger_device{}
Полезно добавить атрибут
@editable
, чтобы вывести из своего сценария в редактор такие значения какToggleDelay
. Это позволит вам настраивать их в UEFN, не пересобирая каждый раз код Verse, чтобы вы могли быстро перебирать и находить значения, которые соответствуют вашему игровому процессу. -
Сохраните сценарий в Visual Studio Code.
-
Нажмите на панели инструментов Verse –> Собрать код Verse, чтобы обновить устройство disappear_on_touch_platform на уровне.
-
Чтобы открыть панель Сведения устройства, выберите устройство disappear_on_touch_platform в окне Структура в UEFN.
-
На панели Сведения в разделе Платформа, исчезающая при касании установите в качестве Платформы устройство RecyclePlatform (объект окружения творческого режима, добавляемый на уровень), нажав на инструмент выбора объекта и выбрав устройство Платформа в окне просмотра.
-
Объект окружения ссылается на устройство Verse, и теперь вам нужно выбрать оба устройства и продублировать их на уровне несколько раз, чтобы создать ряд платформ, по которым будет прыгать игрок. Каждое устройство Verse, которое вы создаёте, должно ссылаться на собственную платформу.
Управление появлением и исчезновением платформы
После настройки уровня и устройств можно добавить функции появления и исчезновения платформы, когда игрок приземляется на неё. Выполните следующие действия, чтобы задать это поведение для класса disappear_on_touch_platform
:
-
В классе
creative_prop
реализованы два метода переключения видимости:Show()
иHide()
. Вернитесь в Visual Studio Code, вOnBegin()
задайте вызовHide()
, а затемShow()
для своейDisappearingPlatform
.# Выполняется при запуске устройства в работающей игре OnBegin<override>()<suspends>:void= # Сделать платформу невидимой. DisappearingPlatform.Hide() # Сделать платформу видимой. DisappearingPlatform.Show()
Если вы запустите этот код, то не увидите, как платформа исчезает и появляется, потому что методы
Hide()
иShow()
срабатывают один за другим. -
Чтобы платформа дольше оставалась видимой/невидимой, добавьте задержку с помощью
Sleep()
при вызове методаHide()
илиShow()
. ФункцияSleep()
приостанавливает программу — вы можете задать определённое время (в секундах), чтобы приостановить выполнение, передав в функцию аргумент типаfloat
. Задайте вызовSleep()
перед каждым вызовомHide()
иShow()
, чтобы передать задержкуDisappearDelay
, которую вы определили до этого.# Выполняется при запуске устройства в работающей игре OnBegin<override>()<suspends>:void= # Ожидание DisappearDelay в секундах. Sleep(DisappearDelay) # Сделать платформу невидимой. DisappearingPlatform.Hide() # Ожидание DisappearDelay в секундах. Sleep(DisappearDelay) # Сделать платформу видимой. DisappearingPlatform.Show()
Если вы запустите этот код, платформа будет невидимой в течение одной секунды (значение, определённое в
DisappearDelay
), после чего вновь станет видимой до конца игры.Функция
Sleep()
может быть вызвана только в асинхронном контексте. Поскольку методOnBegin()
уже поддерживает асинхронный контекст, то есть содержит спецификаторsuspends
, вам больше не нужно ничего делать. Для получения подробной информации о спецификатореsuspends
см. Спецификаторы и атрибуты. -
Если разнообразить время до повторного появления платформы, то можно сделать игру более увлекательной. Вместо того чтобы задавать в методе
Sleep()
одно и то же значение, можно получить случайное число секунд с помощью функцииGetRandomFloat()
и передавать это значение в методSleep()
.-
В начале файла добавьте
using { /Verse.org/Random }
, чтобы использовать функциюGetRandomFloat()
.using { /Fortnite.com/Devices } using { /Verse.org/Random } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/Diagnostics } # См. https://dev.epicgames.com/documentation/en-us/uefn/create-your-own-device-in-verse, чтобы узнать, как создать устройство Verse. # Это Verse-устройство творческого режима, которое можно разместить на уровне disappear_on_touch_platform := class(creative_device):
-
Используйте функцию
GetRandomFloat()
в качестве аргумента для методаSleep()
при определении времени ожидания до повторного появления платформы и задайте допустимый диапазон секунд с помощью константDelayMin
иDelayMax
.# Выполняется при запуске устройства в работающей игре OnBegin<override>()<suspends>:void= # Ожидание DisappearDelay в секундах. Sleep(DisappearDelay) # Сделать платформу невидимой. DisappearingPlatform.Hide() # Ожидание в секундах от DelayMin до DelayMax. Sleep(GetRandomFloat(DelayMin, DelayMax)) # Сделать платформу видимой. DisappearingPlatform.Show()
Теперь платформа будет ждать
1,0
секунду, прежде чем исчезнуть, а затем снова появится через интервал от3,0
до4,0
секунд. -
Отслеживание момента приземления игрока на платформу
Чтобы отследить момент приземления игрока на платформу, вы можете подписаться на событие TriggeredEvent
, которое выводится классом trigger_device
. Триггер отправляет событие TriggeredEvent
, только когда игрок проходит через него. Так как для Количества срабатываний задано значение 1, необходимо вызвать функцию Reset()
на триггере, чтобы сбросить его состояние и он мог вновь отправить событие TriggeredEvent
.
Выполните следующие действия для обнаружения момента касания платформы игроком и используйте код, написанный вами в предыдущем разделе, чтобы платформа исчезала и появлялась в ответ на действия игрока.
-
Для события
TriggeredEvent
необходима сигнатура функции с параметромplayer
типаoption
и типом возвращаемого значения функцииvoid
. Агент в этой функции необязателен, так как устройства Триггер можно активировать и с помощью кода, поэтому необходимо проверить, был ли игрок тем, кто его активировал. Добавьте следующий новый метод в классdisappear_on_touch_platform
:OnPlayerTouch()
.OnPlayerTouch(ActivatingPlayer:?agent):void=
-
В выражении
if
функцииOnPlayerTouch()
попробуем получить игрока из опциональной переменнойActivatingPlayer
. Если этот вызов проходит успешно, вы знаете, что триггер активировал игрок, а не код.OnPlayerTouch(ActivatingPlayer:?agent):void= if: Player := ActivatingPlayer? then: Print("Игрок коснулся платформы!")
-
Подпишем
OnBegin()
наPlatformTrigger.TriggeredEvent
, используяOnPlayerTouch
как дескриптор события. Теперь, когда игрок приземляется на платформу, активируетсяTriggeredEvent
и запускаетсяOnPlayerTouch()
.OnBegin<override>()<suspends>:void= # Подписка на событие TriggeredEvent триггера PlatformTrigger, # чтобы знать, когда пользователь приземляется на платформу. PlatformTrigger.TriggeredEvent.Subscribe(OnPlayerTouch)
-
Когда платформа скрыта, игроки не должны иметь возможности активировать триггер, так как они должны проходить прямо через платформу. Для этого в
OnBegin()
добавим вызовPlatformTrigger.Disable()
иEnable()
послеHide()
иShow()
соответственно. Теперь ваш триггер будет недоступен для взаимодействия, пока платформа скрыта.OnBegin<override>()<suspends>:void= # Подписка на событие TriggeredEvent триггера PlatformTrigger, # чтобы знать, когда пользователь приземляется на платформу. PlatformTrigger.TriggeredEvent.Subscribe(OnPlayerTouch) # Ожидание DisappearDelay в секундах. Sleep(DisappearDelay) # Скрыть платформу и отключить триггер. DisappearingPlatform.Hide() PlatformTrigger.Disable() # Ожидание в секундах от DelayMin до DelayMax. Sleep(GetRandomFloat(DelayMin, DelayMax)) # Показать платформу и включить триггер. DisappearingPlatform.Show() PlatformTrigger.Enable()
Хотя вам нужно скрыть платформу, когда игрок приземляется на неё, вы не можете добавить код, скрывающий и показывающий её, непосредственно в метод OnPlayerTouch()
. Функция Sleep()
может быть вызвана только в асинхронном контексте, и вы не можете добавить спецификатор suspends
в метод OnPlayerTouch()
, потому что событие TriggeredEvent
не поддерживает асинхронные функции, в отличие от обработчика события. Однако для вызова асинхронной функции можно использовать spawn
из OnPlayerTouch()
. Чтобы добавить свою асинхронную функцию, выполните следующее.
-
Добавьте новый метод
RecyclePlatform()
в определение классаdisappear_on_touch_platform
. Добавьте модификатор<suspends>
, чтобы этот код выполнялся асинхронно, и переместите код для скрытия и показа платформы и триггера изOnBegin
в блок кодаRecyclePlatform()
.# Скрыть платформу и сбросить PlatformTrigger. Затем подождите случайное количество времени и снова сделайте платформу видимой. RecyclePlatform()<suspends> : void = # Ожидание DisappearDelay в секундах. Sleep(DisappearDelay) # Скрыть платформу и отключить триггер. DisappearingPlatform.Hide() PlatformTrigger.Disable() # Ожидание в секундах от DelayMin до DelayMax. Sleep(GetRandomFloat(DelayMin, DelayMax)) # Показать платформу и включить триггер. DisappearingPlatform.Show() PlatformTrigger.Enable()
-
В
OnPlayerTouch()
создайте вызовspawn{}
вRecyclePlatform()
, чтобы запустить код асинхронно. Готовая функцияRecyclePlatform()
должна выглядеть следующим образом:# Запускается, когда пользователь приземляется на платформу. Вызывает RecyclePlatform(), чтобы скрыть платформу # и сбросить состояние триггера. OnPlayerTouch(ActivatingPlayer:?agent):void= if: Player := ActivatingPlayer? then: Print("Игрок коснулся платформы!") spawn{ RecyclePlatform() }
Если вы запустите этот код, при первом касании платформы игроком платформа исчезнет, а затем появится.
Асинхронный означает, что фрагменту кода может потребоваться некоторое время для выполнения. В данном примере для изменения состояния платформы требуется несколько секунд из-за вызовов метода
Sleep()
. Асинхронные функции позволяют выполнять операции без блокирования выполнения кода, который вызывает такие функции. Для получения более подробной информации об асинхронных контекстах и выраженииspawn
ознакомьтесь с разделом Одновременная обработка. -
Сейчас
TriggeredEvent
отправляется только в первый раз, когда игрок приземляется на платформу. Чтобы событие запускалось снова, можно вызвать сброс триггера. ВRecyclePlatform()
вызовитеReset()
вPlatformTrigger
после вызоваEnable()
.# Скрыть платформу и сбросить PlatformTrigger. Затем подождите случайное количество времени и снова сделайте платформу видимой. RecyclePlatform()<suspends> : void = # Ожидание DisappearDelay в секундах. Sleep(DisappearDelay) # Скрыть платформу и отключить триггер. DisappearingPlatform.Hide() PlatformTrigger.Disable() # Ожидание в секундах от DelayMin до DelayMax. Sleep(GetRandomFloat(DelayMin, DelayMax)) # Показать платформу и включить триггер. DisappearingPlatform.Show() PlatformTrigger.Enable() # Сбросить количество раз, которое может сработать PlatformTrigger. PlatformTrigger.Reset()
-
Сохраните сценарий и нажмите Verse —> Собрать код Verse, чтобы скомпилировать код.
-
Нажмите Запустить сеанс на панели инструментов UEFN, чтобы выполнить игровой тест уровня.
-
В игровом тесте уровня каждая платформа должна исчезать, когда вы приземляетесь на неё, а затем появляться через случайное количество секунд.
Полный сценарий
Следующий код представляет собой полный сценарий для создания платформы, которая исчезает при приземлении на неё игрока, а затем появляется вновь через случайное количество секунд.
using { /Fortnite.com/Devices }
using { /Verse.org/Random }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
# См. https://dev.epicgames.com/documentation/en-us/uefn/create-your-own-device-in-verse, чтобы узнать, как создать устройство Verse.
# Это Verse-устройство творческого режима, которое можно разместить на уровне
disappear_on_touch_platform := class(creative_device):
# Это время ожидания после касания платформы игроком до момента её исчезновения.
@editable
DisappearDelay:float = 1.0
# Минимальное время ожидания до повторного появления платформы.
@editable
DelayMin:float = 3.0
# Максимальное время ожидания до повторного появления платформы.
@editable
DelayMax:float = 4.0
# Ссылка на платформу на уровне.
@editable
DisappearingPlatform:creative_prop = creative_prop{}
# Зона, в которую входит игрок, когда приземляется на платформу.
@editable
PlatformTrigger:trigger_device = trigger_device{}
# Выполняется при запуске устройства в работающей игре
OnBegin<override>()<suspends>:void=
# Подписка на событие TriggeredEvent триггера PlatformTrigger,
# чтобы знать, когда пользователь приземляется на платформу.
PlatformTrigger.TriggeredEvent.Subscribe(OnPlayerTouch)
# Запускается, когда пользователь приземляется на платформу. Вызывает RecyclePlatform(), чтобы скрыть платформу
# и сбросить состояние триггера.
OnPlayerTouch(ActivatingPlayer:?agent):void=
if:
Player := ActivatingPlayer?
then:
Print("Игрок коснулся платформы!")
spawn{ RecyclePlatform() }
# Скрыть платформу и сбросить PlatformTrigger. Затем подождите случайное количество времени и снова сделайте платформу видимой.
RecyclePlatform()<suspends> : void =
# Ожидание DisappearDelay в секундах.
Sleep(DisappearDelay)
# Скрыть платформу и отключить триггер.
DisappearingPlatform.Hide()
PlatformTrigger.Disable()
# Ожидание в секундах от DelayMin до DelayMax.
Sleep(GetRandomFloat(DelayMin, DelayMax))
# Показать платформу и включить триггер.
DisappearingPlatform.Show()
PlatformTrigger.Enable()
# Сбросить количество раз, которое может сработать PlatformTrigger.
PlatformTrigger.Reset()
Самостоятельная работа
В этом уроке вы научились разрабатывать устройство на языке Verse, создающее платформу, которая исчезает, когда её касается игрок, и появляется через случайное количество секунд.
Используя полученные знания, попробуйте выполнить следующее:
-
Поэкспериментируйте с размерами и местами расположения платформ, чтобы сделать игру более увлекательной.
-
В данном примере игрок не зарабатывает очки и в случае его падения ничего не происходит. Сможете ли вы придумать, как реализовать систему начисления очков и условие проигрыша?