Если вы уже знакомы с принципом прямой привязки события, то вам также не составит труда разобраться с принципом событий и функций, с которыми вы привыкли работать при использовании устройств творческого режима, уже в Verse. На языке Verse вы можете создать собственные функции и поведение, запускаемые при наступлении определённых событий!
В следующих разделах описаны различные способы работы с событиями устройств творческого режима в Verse и реализации собственной логики в коде.
Привязка функций к событиям устройств творческого режима
Вы можете подписаться на события, которые устройства творческого режима предоставляют в своих API. Например, класс button_device устройства «Кнопка» предоставляет событие InteractedWithEvent, которое возникает в любой момент, когда игрок взаимодействует с устройством «Кнопка». Для такого события можно вызвать Subscribe() и передать идентификатор функции в любой момент, когда поступает сигнал о событии.
Подписка позволяет вам указать вызываемую функцию при поступлении сигнала о событии, которая обозначается как привязка к событию. Привязанная функция называется обработчиком. В примере ниже обработчиком является OnButtonInteractedWith.
В зависимости от определения события сигнатура функции должна соответствовать ожидаемому вызову события. Например, подписка на событие InteractedWithEvent для button_device будет ожидать функцию с одним параметром типа agent. Поэтому функция OnButtonInteractedWith должна выглядеть так:
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
hello_world_device := class(creative_device):
@editable
MyButtonDevice:button_device = button_device{}
OnBegin<override>()<suspends>:void=
# Привязываем функцию OnButtonInteractedWith к InteractedWithEvent устройства «Кнопка»
MyButtonDevice.InteractedWithEvent.Subscribe(OnButtonInteractedWith)
OnButtonInteractedWith(InAgent:agent):void=
Print("Игрок нажал на кнопку!")
При вызове Subscribe() для события устройства функция возвращает результат типа cancelable. Вызов Cancel() для переменной типа cancelable отменяет подписку функции, обрабатывающей событие, что приведёт к тому, что функция больше не будет вызываться при поступлении сигнала о событии.
Если вы хотите сохранить один результат типа cancelable, можно использовать контейнер типа option. Вы не можете просто создать переменную cancelable, но вы можете задать переменную option, в которой хранится результат подписки.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
spawner_button := class(creative_device):
@editable
Button:button_device = button_device{}
# Контейнер для хранения подписки на события
var ButtonSubscription:?cancelable = false
OnBegin<override>()<suspends>:void=
ButtonSubscription := Button.InteractedWithEvent.Subscribe(OnButtonInteractedWith)
# Задайте результат cancelable в качестве значения в переменной option.
set ButtonSubscription = option{Subscription}
Print("Выполнена подписка на событие InteractedWithEvent кнопки и назначена подписка на ButtonSubscription!")
OnButtonInteractedWith(InPlayer:agent):void=
Print("Игрок нажал на кнопку!")
# Обращаемся к отменяемой переменной для подписки на InteractedWithEvent
if(CancelableResult := ButtonSubscription?):
CancelableResult.Cancel()
Print("Это событие InteractedWithEvent отменено")
Если у вашего устройства Verse несколько подписок на событие, для хранения всех результатов cancelable из каждой подписки на событие рекомендуется использовать контейнер типа массива, чтобы их можно было впоследствии отменить. Поскольку Subscribe() возвращает результат типа cancelable, можно задать значения массива cancelable при первой подписке на события.
Пример создания предмета при нажатии игроком на кнопку

В этом разделе вы узнаете, как создать генератор предметов, который создаёт определённый предмет, когда игрок взаимодействует с кнопкой.
- Сначала разместите устройства «Генератор предметов» и «Кнопка» на уровне. Чтобы узнать, как размещать устройства на уровне, обратитесь к разделу «Размещение объектов» на стр. Элементы управления UEFN для пользователей в творческом режиме.
- Установите тип создаваемого предмета для устройства «Генератор предметов». Подробности см. в разделе Генератор предметов.
- Создайте устройство Verse с редактируемыми свойствами для устройства «Кнопка» и «Генератор предметов». См. Добавление ссылки в Verse на устройство творческого режима на своём уровне.
- Добавьте в устройство переменную option типа
cancelableдля отслеживания всех его подписок. - Выполните подписку на событие
InteractedWithEvent, результат которой передаётся вoption, и назначьте его переменнойButtonSubscription. - В обработчике событий для
InteractedWithEventвызовитеItemSpawner.SpawnItem(). Затем отмените подписку, обратившись к значению в переменной типа optionButtonSubscriptionи вызвавCancel(). - Ниже приведён полный код Verse для создания предмета при взаимодействии игрока с устройством «Кнопка». При повторном взаимодействии с устройством «Кнопка» ещё один предмет не будет создаваться.
using { /Fortnite.com/Devices } using { /Verse.org/Simulation } spawner_button := class(creative_device): @editable Button:button_device = button_device{} @editable ItemSpawner:item_spawner_device = item_spawner_device{} # Контейнер для хранения подписки на события var ButtonSubscription:?cancelable = false OnBegin<override>()<suspends>:void= Subscription := Button.InteractedWithEvent.Subscribe(OnButtonInteractedWith) # Добавляем отменяемый результат в массив подписок. set ButtonSubscription = option{Subscription} Print("Выполнена подписка на событие InteractedWithEvent кнопки и назначена подписка на ButtonSubscription!") OnButtonInteractedWith(InPlayer:agent):void= ItemSpawner.SpawnItem() # Обращаемся к отменяемой переменной для подписки на InteractedWithEvent if(CancelableResult := ButtonSubscription?): CancelableResult.Cancel() Print("Это событие InteractedWithEvent отменено")Запустите игру и нажмите на кнопку, чтобы создать предмет. Поскольку вы отменили событие
InteractedWithEvent, предмет должен появляться только после первого нажатия кнопки.
Ознакомьтесь с приведённым в инструкции примером игры «Головоломка из лампочек с тегами», где используется подписка на устройства и соответствующая отмена!
Ожидаем событие устройства в творческом режиме
На события можно подписаться, но существует и другой способ ожидания срабатывания события. Можно вызвать Await() для события устройства в творческом режиме, которое представляет собой вызов функции async, требующий некоторого времени на выполнение. Другими словами, использовать это нужно в асинхронном контексте. Это может быть выражение с одновременным выполнением или функция со спецификатором suspends. Подробнее об одновременном выполнении читайте в разделе Контроль времени и одновременное выполнение.
В следующем примере Verse-устройство ожидает взаимодействия игрока с устройством «Триггер» перед тем, как выполнить какие-либо последующие действия. Если игрок нажмёт на одну «Кнопок» до взаимодействия с устройством «Триггер», ничего не произойдёт. После взаимодействия с устройством «Триггер» игроку нужно выбрать одну из двух кнопок. Чтобы что-нибудь произошло, он может взаимодействовать только с одной из кнопок, и только один раз, потому что код использует выражение race для конкурентного выполнения двух событий нажатия кнопки. Подробнее о том, как действует выражение конкурентного выполнения, читайте в разделе Гонки.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
make_a_choice_device:= class(creative_device):
@editable
MakeChoice:trigger_device = trigger_device{}
@editable
RedButton:button_device = button_device{}
@editable
BlueButton:button_device = button_device{}
OnBegin<override>()<suspends>:void=
# Здесь мы ожидаем, когда игрок наступит на триггер, предотвращая выполнение здесь любого другого кода, пока не произойдёт это событие.
# Другими словами, если игрок будет взаимодействовать с двумя устройствами «Кнопка», ничего не произойдёт, пока не произойдёт это событие.
MakeChoice.TriggeredEvent.Await()
Print("Выбирай: жмёшь на красную кнопку — и остаёшься в Стране чудес, жмёшь на синюю кнопку — и просыпаешься в своей постели.")
# Оба блочных выражения выполняются в этом выражении race одновременно.
# В момент, когда игрок нажимает на одну из кнопок, ожидание взаимодействия с другой кнопкой отменяется.
# Иными словами, игрок может взаимодействовать только с одним из устройств «Кнопка».
race:
block:
RedButton.InteractedWithEvent.Await()
Print("Твоё решение — остаться в Стране чудес.")
block:
BlueButton.InteractedWithEvent.Await()
Print("Твоё решение — проснуться в своей постели.")
# Если в этот момент игрок взаимодействует с любым из устройств, ничего не произойдёт, потому что мы ожидали всего лишь однократного возникновения событий.
Эти события ожидаются только один раз. Если вы хотите возобновить ожидание этих событий, можно использовать цикл loop для повторения этой логики столько раз, сколько нужно.
Что дальше: модуль устройств
Здесь мы разобрали, как работать с генераторами предметов и кнопками, но есть и другие устройства творческого режима, которые можно использовать и на которые можно подписаться со своего устройства. Эта информация доступна в Справочнике по API Verse. См. модуль «Устройства», где рассмотрены все устройства творческого режима, с которыми можно работать в Verse.