Основное поведение мини-игры определяется в Verse-устройстве verse_commander_minigame. Это устройство запускает мини-игру, обрабатывает обмен данными между интерфейсом и персонажем и управляет досками, используемыми в игре.
В этом устройстве имеются следующие поля, которые вы можете изменять в редакторе:
HUDController: устройство управления интерфейсом для удаления всех элементов интерфейса Fortnite по умолчанию.
PlayVerseCommanderButton: устройство «Кнопка», с помощью которого запускается мини-игра.
NPCSpawner: устройство Генератор неигровых персонажей для возможности создания персонажа для мини-игры.
Игровые доски: список игровых досок. Доски вводятся в игру в порядке, в котором они расположены в списке.
UICommandLimit: максимальное количество команд, которые можно поставить в очередь в списке в нижней части экрана.
Это устройство также содержит пользовательские события связи с персонажем и передачи ему информации: список выполняемых команд для персонажа и преобразование, в которое должен телепортироваться персонаж при сбросе доски.
# A Verse-authored creative device that can be placed in a level
verse_commander_minigame := class(creative_device):
# The HUD Controller device for the minigame.
@editable
HUDController<private>:hud_controller_device = hud_controller_device{}
# The button that starts the minigame.
@editable
PlayVerseCommanderButton:button_device = button_device{}
Запуск мини-игры
Перед запуском мини-игры для всех игроков устройство Verse Commander Minigame ожидает взаимодействия игрока с устройством «Кнопка» на компьютере. Это ожидание зациклено. После прохождения всех уровней можно повторять мини-игру сколько угодно.
# Runs when the device is started in a running game.
OnBegin<override>()<suspends>:void=
spawn{Cinematic.EnterCinematicModeForAll(GetPlayspace().GetPlayers())}
loop:
PlayVerseCommanderButton.InteractedWithEvent.Await()
Setup()
# Wait for all Gameboards to be set up.
Sleep(2.0)
Цикл игры
Игровой цикл начинается с получения текущей доски. Если игрок на этой доске появился впервые, персонаж телепортируется в начальное положение на доске и доска переключается на камеру этого положения. В этот момент воспроизводится начальное внутриигровое видео.
Затем запускается конкурентное выполнение цикла уровня и ожидания события сброса из интерфейса. Завершение одного из них приводит к отмене другого. Затем выражения в цикле повторяются и возвращаются к получению текущей доски и повторному запуску конкурентного выполнения.
# Loops over the current gameboard and resets them.
GameLoop<private>()<suspends>:void=
# For the current board, swap to that gameboard's camera and reset the character to the gameboard's starting position.
loop:
if:
Gameboard := Gameboards[CurrentBoard]
then:
# If first time on this board, set up the board
# and move character to starting position.
if:
Цикл уровня
Функция LevelLoop() управляет логикой игровой доски. Она конкурентно запускает цикл команд для персонажа и ожидание достижения конечной цели на доске. При достижении конечной цели цикл команд отменяется и вызывается следующая доска из списка.
Цикл команд ожидает нажатия игроком кнопки «Выполнить», чтобы получить список выполняемых команд. Кроме кнопки сброса все кнопки отключены. Персонажу даётся сигнал выполнять команды, а Verse-устройство ожидает получения сигнала завершения перед тем, как вновь запустить цикл и ждать новых команд.
Выражение defer в этом цикле используется для очистки интерфейса при отмене цикла команд или функции LevelLoop(). Выражение defer вызывает ResetUIForAllPlayers() непосредственно перед выходом из области видимости для сброса возможности взаимодействия с кнопкой, чтобы её можно было опять активировать и очистить список команд в нижней части экрана.
# Handles command logic for the current gameboard.
LevelLoop<private>(Gameboard:gameboard)<suspends>:void=
# On the current board, race between completing the board and looping player commands.
# The race expression will cancel whichever action doesn't finish first.
race:
loop:
defer:
# If the loop is canceled because the character reached the end goal of the level,
# Or the character finished performing their commands,
# reset the UI for all the players so they can interact with it and have no commands in the queue.
Сброс игры
Функция AwaitReset() ожидает выбора игроком кнопки сброса. Как только он это сделает, для доски выполняется сброс и персонаж получает указание телепортироваться в начальное положение на доске.
# Waits for the Reset button to be selected, then resets the current gameboard
# and NPC.
AwaitReset<private>(Gameboard:gameboard)<suspends>:void=
ResetButtonSelected.Await()
# Reset the current gameboard, returning the game character to the starting position and
# resetting any barriers or triggers on the board.
BoardResetEvent.Signal(Gameboard.GetStartingCharacterPosition())
# Reset Gameboard
Следующий шаг
Здесь описываются основные возможности Verse-устройства для этой мини-игры. Полный код для создания устройства Verse Commander Minigame приведён в следующем, последнем, шаге.