Das Kernverhalten des Minispiels ist im Verse-Gerät verse_commander_minigame definiert. Dieses Gerät startet das Minispiel, regelt die Kommunikation zwischen UI und Charakter und führt den Spielplan aus, der im Spiel verwendet wird.
Dieses Gerät verfügt über die folgenden Felder, die du im Editor bearbeiten kannst:
HUDController: Ein HUD-Kontrollgerät-Gerät zum Entfernen aller Fortnite-Standard-HUD-Elemente.
PlayVerseCommanderButton: Das Schaltflächengerät, welches das Minispiel startet.
NPCSpawner: Das NPC-Spawner-Gerät, mit dem der Charakter für das Minispiel spawnen kann
Spielpläne: Die Liste der Pläne für das Spiel. Die Pläne werden in der Reihenfolge gespielt, in der sie in der Liste erscheinen.
UICommandLimit: Die maximale Anzahl an Befehlen, die auf dem Bildschirm unten in die Warteschlangenliste gesetzt werden können.
Das Gerät enthält außerdem benutzerdefinierte Events für die Kommunikation mit dem Charakter und das Übergeben von Informationen an den Charakter: die Liste der Befehle, die der Charakter ausführen soll, und die Transformation für den Charakter, zu der er teleportieren soll, wenn der Plan zurückgesetzt wird.
# 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{}
Starten des Minispiels
Das Verse-Kommandant-Minispielgerät wartet darauf, dass der Spieler mit dem Knopf-Gerät am Computer interagiert, bevor es das Minispiel für alle Spieler startet. Dieser Wartevorgang erfolgt in einer Schleife. Sobald du alle Level abgeschlossen hast, kannst du das Minispiel beliebig oft erneut spielen.
# 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)
Spiel-Loop
Die Spielschleife ruft als Erstes den aktuellen Plan ab. Wenn ein Spieler sich zum ersten Mal auf diesem Plan befindet, wird der Charakter zur Startposition des Plans teleportiert und der Plan wechselt zu seiner Kamera und gibt die Eröffnungsfilmsequenz wieder.
Dann wird ein Race-Ausdruck zwischen der Level-Schleife und dem Warten auf das Zurücksetzen-Event von der UI ausgeführt. Der Vorgang, der zuerst erfolgt, bricht den anderen ab. Die Anweisungen der Schleife werden dann wiederholt, rufen wieder den aktuellen Plan ab und starten den Race-Ausdruck erneut.
# 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:
Level-Schleife
Die Funktion LevelLoop() verwaltet die Logik für den Spielplan. Ein Race-Ausdruck wird zwischen der Befehlsschleife für den Charakter und dem Warten darauf ausgeführt, dass das Endziel des Plans erreicht wird. Sobald das Endziel erreicht ist, wird die Befehlsschleife abgebrochen und der nächste Plan in der Liste wird aufgerufen.
Die Befehlsschleife wartet darauf, dass der Spieler die Ausführen-Schaltfläche anklickt, um die Liste der auszuführenden Befehle zu erhalten. Dann werden die Schaltflächen mit Ausnahme der Zurücksetzen-Schaltfläche deaktiviert. Dem Charakter wird das Signal zur Ausführung der Befehle gegeben und das Verse-Gerät wartet auf den Empfang des Abgeschlossen-Signals, bevor es die Schleife erneut startet und auf weitere Befehle wartet.
Mit einem defer wird die UI in dieser Schleife bereinigt, wenn die Befehlsschleife oder die Funktion LevelLoop() aufgerufen wird. Der defer-Ausdruck ruft unmittelbar vor dem Verlassen des Bereichs ResetUIForAllPlayers() auf, um die Schaltflächeninteraktivität zurückzusetzen. Sie werden dann wieder aktiviert und die Befehlsliste im unteren Bereich wird geleert.
# 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.
Zurücksetzen des Spiels
Die Funktion AwaitReset() wartet darauf, dass der Spieler die Schaltfläche zum Zurücksetzen auswählt. Ist das der Fall, setzt sich der Plan zurück und weist den Charakter an, zum Startpunkt des Plans zu teleportieren.
# 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
Nächster Schritt
Das deckt die Hauptfunktionalität des Verse-Geräts für das Minispiel ab. Die vollständige Codeliste zum Erstellen des Verse-Kommandant-Minispiel-Geräts findest du im nächsten und letzten Schritt.