В следующих разделах показано, как добавлять и удалять виджеты в интерфейсе игрока.
Для примера используется виджет текстового блока, но можно использовать виджет любого типа. Все доступные типы виджетов описаны в разделе «Типы виджетов݁».
Добавление виджета
В этом примере показано, как добавить виджет, когда игрок взаимодействует с устройством «Кнопка» на уровне:
Создайте новое устройство Verse и добавьте его на уровень. Чтобы узнать, как создать новое устройство в Verse, обратитесь к разделу Создание собственного устройства в Verse.
Откройте файл Verse в Visual Studio Code с помощью проводника Verse.
Добавьте редактируемое свойство устройства «Кнопка» к своему устройству Verse и настройте ссылку на устройство «Кнопка» на уровне. Чтобы узнать, как создавать редактируемые свойства, перейдите в раздел «Настройка свойств устройства».
# Настройка устройства «Кнопка» в редакторе так, чтобы оно ссылалось на устройство на уровне @editable MyButton : button_device = button_device{}В начале файла Verse добавьте следующие строки, чтобы использовать API интерфейса Verse:
using { /UnrealEngine.com/Temporary/UI } using { /Fortnite.com/UI } using { /UnrealEngine.com/Temporary/SpatialMath}Этот интерфейс доступен лишь конкретному игроку, поэтому вам понадобится ссылка на игрока, чтобы обратиться к его интерфейсу. В этом примере показано, как отобразить настраиваемый интерфейс, когда игрок взаимодействует с кнопкой, поскольку события для устройств включают ссылку на игрока, взаимодействующего с устройством. Чтобы узнать, как настроить подписки на события, перейдите в раздел «Реализация взаимодействия с устройствами».
# Выполняется при запуске устройства в работающей игре OnBegin<override>()<suspends> : void = MyButton.InteractedWithEvent.Subscribe(HandleButtonInteraction) # Настраиваемый интерфейс может быть связан только с определённым игроком, и только этот игрок может его видеть HandleButtonInteraction(Agent : agent) : void = # Отображение интерфейсаТеперь для получения ссылки на интерфейс игрока можно вызвать функцию с неоднозначным результатом
GetPlayerUI[]в выражении if.Verse# A custom UI can only be associated with a specific player, and only that player can see it HandleButtonInteraction(Agent : agent) : void = # Agents can be a player or AI, but you can only get the UI of a player # so you must cast the Agent, who interacted with the Button device, to the player type if (InPlayer := player[Agent], PlayerUI := GetPlayerUI[InPlayer]): # Display UIИспользуя ссылку на интерфейс игрока, можно вызвать
AddWidget()и добавить свой виджет.Создайте сообщение со спецификатором
localizes, назовите его TextForMyUI и инициализируйте его строкой"Привет, мир!".hello_world_device := class(creative_device): # Настройте устройство «Кнопка» в Редакторе так, чтобы оно ссылалось на устройство на уровне @editable MyButton : button_device = button_device{} # Локализуемое сообщение для отображения в виде текста в интерфейсе TextForMyUI<localizes> : message = "Привет, мир!"
Тип
messageозначает, что текст может быть локализован, а строка, которая используется для инициализации переменнойmessage, определяет текст и язык сообщения по умолчанию. Чтобы узнать больше о типеmessage, перейдите в раздел «Краткий справочник по Verse».Затем создайте текстовый виджет с
TextForMyUIв качестве текста по умолчанию и добавьте его в интерфейс игрока.Verse# A custom UI can only be associated with a specific player, and only that player can see it HandleButtonInteraction(Agent : agent) : void = # Agents can be a player or AI, but you can only get the UI of a player # so you must cast the Agent, who interacted with the Button device, to the player type if (InPlayer := player[Agent], PlayerUI := GetPlayerUI[InPlayer]): MyUI : text_block = text_block{DefaultText := TextFOrMyUI} PlayerUI.AddWidget(MyUI)
Ниже приведён полный код:
Verseusing { /Fortnite.com/Devices } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/UI } using { /Fortnite.com/UI } using { /UnrealEngine.com/Temporary/SpatialMath} hello_world_device := class(creative_device): # Set the Button device in the Editor to reference the device in the level @editableСохраните файл Verse и выберите Verse > Собрать код Verse в главном меню UEFN, чтобы обновить устройство Verse.
При игровом тесте уровня с этим устройством Verse текст "Привет, мир!" будет появляться в верхнем левом углу экрана, когда игрок взаимодействует с устройством «Кнопка».
Удаление виджета
В этом примере показано, как удалить интерфейс с экрана игрока, когда он снова будет взаимодействовать с устройством «Кнопка»:
Откройте файл Verse, созданный по указаниям в разделе «Добавление виджета».
Чтобы удалить виджет в момент, когда игрок снова будет взаимодействовать с устройством «Кнопка», нужно сохранить его в переменной, чтобы обратиться к нему позднее. Поскольку виджеты отображаются отдельно для каждого игрока, необходимо сохранить каждый виджет и связать его с игроком, для которого он отображается, чтобы вы могли выбрать нужный виджет для соответствующего игрока.
Создайте ассоциативный массив с названием
MaybeMyUIPerPlayer, который будет использоватьplayerв качестве ключа, а также текстовый блок типа option как значение виджета в ассоциативном массиве. (Обратите внимание, что в этом примере используется виджет текстового блока, но можно использовать виджет любого типа.)var MaybeMyUIPerPlayer : [player]?text_block = map{}При добавлении виджета в интерфейс игрока сохраните его в переменной
MaybeMyUIPerPlayer, чтобы позже можно было удалить его с экрана. Поскольку обращение к элементу ассоциативного массива является выражением с неоднозначным результатом, установка значения виджета для определённого игрока должна выполняться в контексте, допускающем неоднозначность (к примеру, в выраженииif).Verse# A custom UI can only be associated with a specific player, and only that player can see it HandleButtonInteraction(Agent : agent) : void = # Agents can be a player or AI, but you can only get the UI of a player # so you must cast the Agent, who interacted with the Button device, to the player type if (InPlayer := player[Agent], PlayerUI := GetPlayerUI[InPlayer]): NewUI := text_block{DefaultText := TextForMyUI} PlayerUI.AddWidget(NewUI) if (set MaybeMyUIPerPlayer[InPlayer] = option{NewUI}) {}Теперь обновите функцию, чтобы проверить, есть ли у игрока виджет, отображаемый для него в
MaybeMyUIPerPlayer. Если да, то удалите виджет. Если нет, то создайте новый виджет, чтобы он мог его увидеть.Verse# A custom UI can only be associated with a specific player, and only that player can see it HandleButtonInteraction(Agent : agent) : void = # Agents can be a player or AI, but you can only get the UI of a player # so you must cast the Agent, who interacted with the Button device, to the player type if (InPlayer := player[Agent], PlayerUI := GetPlayerUI[InPlayer]): if (MyUI := MaybeMyUIPerPlayer[InPlayer]?): PlayerUI.RemoveWidget(MyUI) if (set MaybeMyUIPerPlayer[InPlayer] = false) {} else: NewUI := text_block{DefaultText := TextForMyUI}Ниже приведён полный код:
Verseusing { /Fortnite.com/Devices } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/UI } using { /Fortnite.com/UI } using { /UnrealEngine.com/Temporary/SpatialMath} hello_world_device := class(creative_device): # Set the Button device in the Editor to reference the device in the level @editableСохраните файл Verse и выберите Verse > Собрать код Verse в главном меню UEFN, чтобы обновить устройство Verse.
При игровом тесте уровня с этим устройством Verse текст "Привет, мир!" появляется в верхнем левом углу экрана, когда игрок в первый раз взаимодействует с устройством «Кнопка». Текст исчезает, когда игрок снова взаимодействует с устройством «Кнопка».