Dieses Tutorial verwendet Verse, um bestimmte Funktionen zu ermöglichen. Durch die Verwendung von Verse in diesem Tutorial hast du die folgenden Möglichkeiten:
Triggern und Abspielen von Animationen in Abständen, um eine Gameplay-Mechanik zu erstellen.
Aktualisiert die Score-Informationen des Spielers für alle Spieler in einem Minispiel.
Erstelle Verzögerungen beim Spawnen von Spielern und unterbrochene Spawn-Zeiten für Gegenstände.
Du kannst diesen Code für die folgenden Aufgaben wiederverwenden:
Schalte die Geräte ein und aus, während das Spiel vom HUB zum Gameplay und zurück zum HUB wechselt.
Überprüfe die Scores der Spieler, um den Gewinner zu ermitteln, und zeige ihn im HUB an.
Beende das Spiel und teleportiere die Spieler am Ende des Minispiels zurück zum HUB.
Einrichten des Verse-Geräts und bearbeitbarer Objekte
Befolge diese Schritte, um dein Verse-Gerät und bearbeitbare Objekte einzurichten:
Erstelle ein neues Verse-Gerät mit dem Namen
tiltnboomund füge es zum Level hinzu. Weitere Informationen findest du unter Erstelle dein eigenes Gerät mit Verse.Füge die folgenden Module am Anfang der Datei hinzu:
Verseusing { /Fortnite.com/Characters } using { /Fortnite.com/Devices } using { /Fortnite.com/Game } using { /UnrealEngine.com/Temporary/Diagnostics } using { /Verse.org/Random } using { /Verse.org/Simulation }Füge die folgenden Felder zur Klassendefinition von
tiltnboomhinzu:Zwei bearbeitbare
trigger-Geräte: ActivateGameTrigger und EndGameTrigger.ActivateGameTriggerwird verwendet, um dieses Spiel zu aktivieren. Der Auslöser kann durch alles Mögliche ausgelöst werden, z. B. durch einen Teleporter im Spiel oder nach einer Intro-Filmsequenz.Der
EndGameTriggerwird verwendet, um das Minispiel zu beenden und alle Kamera- und Steuerung-Geräte von den Spielern zu entfernen, nachdem das Spiel vorbei ist.
Verse@editable ActivateGameTrigger:trigger_device = trigger_device{} @editable EndGameTrigger:trigger_device = trigger_device{}Ein bearbeitbares Timer-Gerät mit dem Namen GameTimer. Damit wird das Spiel nach einer bestimmten Zeit beendet.
Ein
arrayvon Filmsequenz-Geräten mit dem NamenCannonballSequences. Jedes Gerät in diesem Array spielt eine andere Landeposition der Kanonenkugel ab.Ein Array von Schadensbereichen mit dem Namen DamageVolumes, die je nach Spielzustand aktiviert/deaktiviert werden.
Ein Array von Gegenstands-Spawnpunkten mit dem Namen ItemSpawners, die während des Spiels zufällig eine beliebige Anzahl von Gegenständen spawnen.
Ein Eroberungsgebiet-Gerät mit dem Namen CaptureArea. Dies gibt Spielern Punkte dafür, dass sie sich auf dem Floß befinden, und wird je nach Spielzustand aktiviert oder deaktiviert.
Ein Punkteanpassung-Gerät mit dem Namen
ScoreManager, das den Score der Spieler zu Beginn eines Spiels zurücksetzt und am Ende des Spiels den Gewinner ermittelt.Ein Teleporter mit dem Namen
HUBTeleporter, der alle nach Spielende zurück zum HUB bringt.Ein Gerät mit dem Namen PlayerReference, das zwischen den Spielen den Namen des siegreichen Spielers im Zentrum anzeigt.
Verse@editable GameTimer:timer_device = timer_device{} @editable CannonballSequences:[]cinematic_sequence_device = array{} @editable DamageVolumes:[]damage_volume_device = array{} @editable
Zwei bearbeitbare Arrays von Spieler-Spawnflächen mit dem Namen
PlayerSpawnersundHUBSpawners. Diese deaktivieren das Spawnen, wenn das Minispiel vorbei ist, und bringen die Spieler nach dem Minispiel zum Zentrum zurück.Verse@editable PlayerSpawners:[]player_spawner_device = array{} @editable HUBSpawners:[]player_spawner_device = array{}Zwei bearbeitbare
floatsmit den NamenMinimumItemSpawnTimeundMaximumItemSpawnTime. Dies sind die minimalen und maximalen Zeiten, die zwischen dem Spawnen von Gegenständen auf dem Floß gewartet werden müssen.Verse@editable MinimumItemSpawnTime:float = 5.0 @editable MaximumItemSpawnTime:float = 10.0Ein bearbeitbarer
floatmit dem NamenDelayAfterGame. Dies ist die Verzögerung, mit der Spieler nach dem Spiel zurück zum Zentrum teleportiert werden.Verse@editable DelayAfterGame:float = 5.0Ein
floatmit dem NamenDelayBetweenCannonballSequences. Dies ist die Verzögerung für das Spawnen von Kanonenkugeln zwischen den Sequenzen während der Dauer des Minispiels.VerseDelayBetweenCannonballSequences:float = 8.0Eine Logik Variable mit dem Namen
GameActive, um festzustellen, ob das Spiel aktiv ist oder nicht.Versevar GameActive:logic = false
Starten des Spiels
Wenn das Minispiel startet, werden mehrere Geräte aktiviert und der Score des Spielers wird auf 0 zurückgesetzt.
Füge oberhalb der Klassendefinition von
tiltnboomeinen Log-Kanal hinzu, um spezifische Nachrichten für das Minispiel auszugeben. Füge dann einen Logger zur Klassendefinition hinzu, der mit dem Log-Kanal verwendet werden soll.Versetiltnboom_log_channel := class(log_channel){} # A Verse-authored creative device that can be placed in a level tiltnboom := class(creative_device): Logger:log = log{Channel := tiltnboom_log_channel}Füge eine neue Methode
OnTriggeredzur Klassendefinition vontitnboomhinzu, die einenInitiatingAgentannimmt und das Spiel startet. Füge einen if-Ausdruck zu der Methode hinzu, die zurückgibt, ob das Spiel bereits aktiv ist, da du das Spiel nicht starten möchtest, wenn bereits eines läuft.VerseOnTriggered(InitiatingAgent:?agent):void= if (GameActive?): return spawn{StartGame()}In
OnBegin()abonniere ActivateGameTrigger’sTriggeredEventfür dieOnTriggered,-Funktion, um das Spiel zu starten. Jedes Gerät, das zu Beginn des Minispiels aktiviert werden muss, abonniert diesen Event und wird aktiviert, wenn der OnTrigger -Event ausgelöst wird.VerseOnBegin<override>()<suspends>:void= ActivateGameTrigger.TriggeredEvent.Subscribe(OnTriggered)Füge eine neue Methode
StartGame()hinzu, die die Logik zum Starten des Spiels handhabt. Füge den<suspends>-Modifikator zu dieser Funktion hinzu, damit sie asynchron ausgeführt werden kann.Setze zuerst
GameActiveaufTrue, um zu signalisieren, dass das Spiel aktiv ist. Aktiviere dann dieCaptureAreaund jedesDamageVolumeimDamageVolumes-Array.Für jeden Spieler, wenndieser Spieler einen Score größer als 0 hat, setze den Score zurück, indem du dem Spieler den Invers seines aktuellen Score zuweist, wodurch sein Score auf 0 gesetzt wird.
In einem Race-Ausdruck musst du dann zwischen dem Ende des Timers, der Kanonenkugelsequenz und dem Spawnen von zufälligen Gegenständen hin- und herspringen. Die Kanonenkugelsequenz und das Spawnen von zufälligen Gegenständen sind Endlosschleifen, werden aber abgebrochen, sobald der Timer endet.
Wenn das Spiel endet, rufe die Funktion
OnGameFinished()auf, um die Bereinigung am Spielende zu handhaben.VerseStartGame()<suspends>:void= Logger.Print("Starting game.") set GameActive = true CaptureArea.Enable() for (DamageVolume : DamageVolumes): DamageVolume.Enable() for:
Erstellen einer Kanonenkugel-Schleife
Dieser Abschnitt behandelt das Hinzufügen einer Funktion, die die Kanonenkugel-Filmsequenzen abspielt.
Füge eine neue Methode
StartCannonSequence()zur Klassendefinition vontiltnboomhinzu, die die Levelsequenzen der Kanonenkugeln abspielt und eine Schleife verwendet, um den Verzögerungsausdruck abzuspielen und eine Verzögerung zwischen den Kanonenkugeln einzufügen. Füge den<suspends>-Modifikator zu dieser Funktion hinzu, damit sie asynchron ausgeführt werden kann.Wähle in einer Schleife eine zufällige Sequenz aus dem Array
CannonballSequencesaus, indem du es mitGetRandomInt()indizierst. Spiele die Sequenz ab und mache dann eine Pause die durchDelayBetweenCannonballSequencesfestgelegt ist, bevor du eine weitere Sequenz abspielst.VerseStartCannonSequence()<suspends>:void= loop: RandomCannonballSequence:int = GetRandomInt(0, CannonballSequences.Length - 1) if (CannonballSequence := CannonballSequences[RandomCannonballSequence]): Logger.Print("Set CannonballSequence to {RandomCannonballSequence}") CannonballSequence.Play()
Erstellen von Schleifen für zufällig spawnende Gegenstände
Dieser Abschnitt behandelt das Erstellen einer Funktion, die in einer Schleife zufällige Gegenstände an zufälligen Positionen auf dem Floß spawnen lässt, was den Spielern entweder dabei helfen oder sie daran hindern kann, das Minispiel zu gewinnen.
Füge eine neue Methode namens
SpawnRandomItemszur Klassendefinition vontiltnboomhinzu. Diese Methode steuert die Gegenstände, die auf dem Floß spawnen.Rufe die Anzahl der Gegenstände im Array
ItemSpawnersab und durchlaufe dann das Array in einer Schleife. Verwende einen zufälligenint, um einen zufälligen Gegenstands-Spawnpunkt aus dem Array abzurufenn, und aktiviere ihn dann. Schlafe für eine zufällige Zeit zwischen dem Spawnen von Gegenständen.Die Schleife entscheidet zufällig, wie viele Gegenstände gespawnt werden sollen, und wählt zufällig einen Gegenstand aus, der gespawnt werden soll, und zwar so oft wie
NumberOfItemsToSpawn. DerDelayBetweenItemSpawnsgeneriert eine unbestimmte Zeit, um zwischen den Spawns zu warten.VerseSpawnRandomItems()<suspends>:void= ItemSpawnerCount:int = ItemSpawners.Length - 1 loop: NumberOfItemsToSpawn:int = GetRandomInt(0, ItemSpawnerCount) # Spawn a randomly selected item, as many times as NumberOfItemsToSpawn. for: CurrentItemSpawnNumber := 0..NumberOfItemsToSpawn
Beenden des Spiels
Am Ende des Minispiels musst du den Score des Gewinners an das Zentrum senden, Geräte deaktivieren und Spieler zurück zum Zentrum teleportieren.
Füge eine neue Methode
OnGameFinishedzur Klassendefinition vontiltnboomhinzu. Wenn das Spiel beendet ist, macht diese Funktion das Spiel inaktiv und deaktiviert die relevanten Geräte.~~~(Verse) OnGameFinished()<suspends>:void= Logger.Print("Spiel ist beendet.") set GameActive = false
CaptureArea.Disable()
for (PlayerSpawner : PlayerSpawners): PlayerSpawner.Disable()
for (DamageVolume : DamageVolumes): DamageVolume.Disable() ~~~
Füge
variable intHighestScorehinzu, um den Spieler mit dem höchsten Score zu verfolgen, sowie eine Optionsvariable, die auf den Spieler verweistWinningPlayer.Versevar HighestScore:int = -1 var WinningPlayer:?agent = falseIn einem for/do-Ausdruck holst du alle Spieler in den Spielbereich und dann den
FortCharacterfür jeden von ihnen. Friere den Charakter an Ort und Stelle ein, indem duPutInStasis()verwendest und einen neuen Satz vonstasis_argsübergibst, um Emoting und Drehungen zu erlauben, damit die Spieler das Spiel feiern können.Versefor: Player : GetPlayspace().GetPlayers() FortCharacter := Player.GetFortCharacter[] do: FortCharacter.PutInStasis(stasis_args{AllowTurning := true, AllowEmotes := true})Prüfe in einer
if-Anweisung den Score jedes Spielers und speichere den Sieger-Score im Spielerreferenz-Gerät im HUB.Verseif (ScoreManager.GetCurrentScore(Player) > HighestScore): set HighestScore = ScoreManager.GetCurrentScore(Player) set WinningPlayer = option{Player}Zuletzt rufst du in einer weiteren if-Anweisung
TeleportPlayersToHUB()auf, um alle Spieler zurück zum HUB zu teleportieren, sobald ein siegreicher Score erzielt wurde.Verseif(Winner := WinningPlayer?): PlayerReference.Register(Winner) TeleportPlayersToHUB()
Spieler zurück zum HUB teleportieren
Wenn die Scores berechnet wurden und ein Gewinner feststeht, sollten alle Spieler zurück zum Zentrum teleportiert werden.
Füge eine neue Methode
TeleportPlayersToHUB()zur Klassendefinition von tiltnboom hinzu. Diese Methode aktiviert alle Spawner der Spieler im Zentrum und wartet dann ein paar Sekunden, bevor sie alle zurück zum Zentrum teleportiert werden. Diese Methode sollte auch denEndGameTriggerauslösen, um Kamera- und Steuerungs-Geräte von Spielern zu entfernen.VerseTeleportPlayersToHUB()<suspends>:void= for (HUBSpawner : HUBSpawners): HUBSpawner.Enable() Sleep(DelayAfterGame) EndGameTrigger.Trigger()Teleportiere jeden Spieler in einem
for-Ausdruck zurück zumHUBTeleporterund gib ihn aus der Stasis frei.Versefor: Player : GetPlayspace().GetPlayers() FortCharacter := Player.GetFortCharacter[] do: HUBTeleporter.Teleport(Player) Sleep(1.0) FortCharacter.ReleaseFromStasis()
Du bist am Zug
Modifiziere diesen Code, um verschiedene Aufgaben für das Timer-Gerät zu erstellen. Anstatt zu bestimmen, wie lange ein Minispiel dauert, kannst du das Timer-Gerät verwenden, um die Zeit eines Rennens (Race) zu bestimmen.
using { /Fortnite.com/Characters }
using { /Fortnite.com/Devices }
using { /Fortnite.com/Game }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Verse.org/Random }
using { /Verse.org/Simulation }
tiltnboom_log_channel := class(log_channel){}
# A Verse-authored creative device that can be placed in a level