Ten samouczek wykorzystuje Verse, aby można było skorzystać z niektórych funkcji. Dzięki wykorzystaniu Verse w tym samouczku, możesz:
Co pewien czas aktywuj i odtwarzaj animacje, aby utworzyć mechanikę rozgrywki.
Aktualizuj informacje o wyniku gracza dla wszystkich graczy w minigrze.
Twórz opóźnienia spawnu gracza i losowe czasy spawnu przedmiotów.
Możesz ponownie wykorzystać kod, aby wykonać następujące zadania:
Przełączaj urządzenia, które są włączone i wyłączone w momencie, gdy gra przechodzi z HUB-u do rozgrywki i z powrotem do HUB-u.
Sprawdzaj wyniki graczy, aby wyszukać najlepszy wynik i wyświetlić go w HUB-ie.
Zakończ grę i teleportuj graczy z powrotem do HUB-u po zakończeniu minigry.
Konfiguracja urządzenia Verse i edytowalnych obiektów
Postępuj zgodnie z poniższą instrukcją, aby skonfigurować urządzenie Verse i edytowalne obiekty:
Utwórz nowe urządzenie Verse o nazwie
tiltnboomi dodaj je do poziomu. Aby uzyskać informacje na ten temat, patrz: Tworzenie własnego urządzenia przy użyciu Verse.Na początku pliku dodaj następujące moduły:
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 }Dodaj następujące pola do definicji klasy
tiltnboom:Dwa edytowalne urządzenia
trigger; ActivateGameTrigger i EndGameTrigger.ActivateGameTriggersłuży do aktywacji gry. Ten aktywator może zostać aktywowany przez cokolwiek, np. przez teleporter do gry lub po filmiku otwierającym.EndGameTriggersłuży do zakończenia minigry i usunięcia wszystkich kamer i urządzeń sterujących z graczy, gdy gra się skończy.
Verse@editable ActivateGameTrigger:trigger_device = trigger_device{} @editable EndGameTrigger:trigger_device = trigger_device{}Edytowalne urządzenie licznika czasu o nazwie GameTimer. Kończy grę po upływie określonego czasu.
Tablica
arrayurządzeń sekwencji filmowej o nazwieCannonballSequences, każde urządzenie w tablicy odtwarza inną pozycję lądowania kuli armatniej.Tablica przestrzeni obrażeń o nazwie DamageVolumes, które są włączane i wyłączane na podstawie stanu gry.
Tablica generatorów przedmiotów o nazwie ItemSpawners, która losowo spawnuje losową liczbę przedmiotów w trakcie gry.
Urządzenie strefy punktowanej o nazwie CaptureArea. Przyznaje graczom punkty za przebywanie na tratwie, jest włączane i wyłączane na podstawie stanu gry.
Urządzenie menedżera wyników o nazwie
ScoreManager, które resetuje wyniki graczy, gdy gra się rozpoczyna, a w momencie zakończenia gry określa, który gracz wygrał.Teleporter o nazwie
HUBTeleporter, który po zakończeniu gry przenosi wszystkich z powrotem do HUB-u.Urządzenie odwołania do gracza o nazwie PlayerReference, które wyświetla zwycięskiego gracza w HUB-ie między grami.
Verse@editable GameTimer:timer_device = timer_device{} @editable CannonballSequences:[]cinematic_sequence_device = array{} @editable DamageVolumes:[]damage_volume_device = array{} @editable
Dwie edytowalne tablice paneli startowych gracza o nazwach
PlayerSpawnersiHUBSpawners. Wyłączają spawnowanie, gdy minigra się zakończy, i zabierają graczy z powrotem do HUB-u po minigrze.Verse@editable PlayerSpawners:[]player_spawner_device = array{} @editable HUBSpawners:[]player_spawner_device = array{}Dwie edytowalne wartości
floato nazwachMinimumItemSpawnTimeiMaximumItemSpawnTime. Są to minimalne i maksymalne czasy oczekiwania na spawnowanie kolejnych przedmiotów na tratwie.Verse@editable MinimumItemSpawnTime:float = 5.0 @editable MaximumItemSpawnTime:float = 10.0Edytowalna wartość
floato nazwieDelayAfterGame. Opóźnienie teleportowania graczy z powrotem do HUB-u po zakończeniu gry.Verse@editable DelayAfterGame:float = 5.0Wartość
floato nazwieDelayBetweenCannonballSequences. Opóźnienie spawnowania kul armatnich między sekwencjami przez cały czas trwania minigry.VerseDelayBetweenCannonballSequences:float = 8.0Logiczna zmienna o nazwie
GameActivesłużąca do określania, czy gra jest aktywna.Versevar GameActive:logic = false
Rozpoczynanie gry
Gdy minigra się rozpoczyna, zostaje uruchomionych kilka urządzeń, a wynik gracza resetuje się do 0.
Nad definicją klasy
tiltnboomdodaj kanał dziennika, aby zapisywać komunikaty charakterystyczne dla minigry. Następnie do definicji klasy dodaj rejestrator, który będzie używany z kanałem dziennika.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}Dodaj nową metodę
OnTriggereddo definicji klasytiltnboom, która przyjmujeInitiatingAgenti uruchamia grę. Do metody dodaj wyrażenie if, które zwraca, czy gra jest już aktywna, aby uniknąć rozpoczęcia gry, gdy inna gra jest już uruchomiona.VerseOnTriggered(InitiatingAgent:?agent):void= if (GameActive?): return spawn{StartGame()}W
OnBegin()zasubskrybujTriggeredEventaktywatora ActivateGameTrigger do funkcjiOnTriggered,aby rozpocząć grę. Każde urządzenie, które musi zostać włączone na początku minigry, zasubskrybuje to zdarzenie i włączy się po aktywowaniu zdarzenia OnTrigger.VerseOnBegin<override>()<suspends>:void= ActivateGameTrigger.TriggeredEvent.Subscribe(OnTriggered)Dodaj nową metodę
StartGame(), która obsługuje logikę, aby rozpocząć grę. Dodaj modyfikator<suspends>do tej funkcji, aby mogła działać asynchronicznie.Najpierw ustaw
GameActivenatrue, aby zasygnalizować, że gra jest aktywna. Następnie włączCaptureAreai każdą przestrzeń obrażeńDamageVolumew tablicyDamageVolumes.Dla każdego gracza, jeśli jego wynik jest większy niż 0, zresetuj wynik, przyznając graczowi odwrotność bieżącego wyniku, co ustawi jego wynik na 0.
Następnie w wyrażeniu race ustaw wyścig między zakończeniem licznika czasu, wykonaniem sekwencji kuli armatniej i spawnowaniem losowych przedmiotów. Sekwencja kuli armatniej i spawnowanie losowych przedmiotów to pętle nieskończone, ale są anulowane natychmiast po zakończeniu licznika czasu.
Gdy gra się skończy, wywołaj funkcję
OnGameFinished(), aby obsłużyć czyszczenie na koniec gry.VerseStartGame()<suspends>:void= Logger.Print("Starting game.") set GameActive = true CaptureArea.Enable() for (DamageVolume : DamageVolumes): DamageVolume.Enable() for:
Tworzenie pętli kuli armatniej
W tej sekcji opisano dodawanie funkcji, która odtwarza sekwencje filmowe kuli armatniej.
Dodaj nową metodę
StartCannonSequence()do definicji klasytiltnboom, która odtwarza sekwencje poziomu kuli armatniej i używa pętli, aby odtwarzać wyrażenie opóźnienia i wstawiać opóźnienie między kulami armatnimi. Dodaj modyfikator<suspends>do tej funkcji, aby mogła działać asynchronicznie.W pętli wybierz losową sekwencję w tablicy
CannonballSequences, indeksując ją przy użyciuGetRandomInt(). Odtwórz sekwencję, a następnie uśpij na czasDelayBetweenCannonballSequencesprzed odtworzeniem kolejnej sekwencji.VerseStartCannonSequence()<suspends>:void= loop: RandomCannonballSequence:int = GetRandomInt(0, CannonballSequences.Length - 1) if (CannonballSequence := CannonballSequences[RandomCannonballSequence]): Logger.Print("Set CannonballSequence to {RandomCannonballSequence}") CannonballSequence.Play()
Tworzenie pętli losowego spawnowania przedmiotów
W tej sekcji opisano tworzenie funkcji, która zapętla spawnowanie losowych przedmiotów w losowych lokalizacjach na tratwie, co może zarówno pomóc, jak i przeszkodzić graczom w wygraniu minigry.
Dodaj nową metodę o nazwie
SpawnRandomItemsdo definicji klasytiltnboom. Ta metoda kontroluje przedmioty, które spawnują się na tratwie.Pobierz liczbę przedmiotów w tablicy
ItemSpawners, a następnie zapętl przejście przez tablicę. Użyj losowej wartościint, aby pobrać losowy generator przedmiotów z tablicy, następnie go aktywuj. Uśpij na losowy czas między spawnowaniem przedmiotów.Pętla losowo decyduje, ile przedmiotów zespawnować, i losowo wybiera przedmiot do zespawnowania, tyle razy, ile wynosi
NumberOfItemsToSpawn.DelayBetweenItemSpawnsgeneruje nieustaloną z góry długość czasu oczekiwania między spawnami.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
Kończenie gry
Na koniec minigry musisz wysłać wynik zwycięzcy do HUB-u, wyłączyć urządzenia i teleportować graczy z powrotem do HUB-u.
Dodaj nową metodę
OnGameFinisheddo definicji klasytiltnboom. Gdy gra się skończy, ta funkcja ustawi grę na nieaktywną i wyłączy odnośne urządzenia.~~~(verse) OnGameFinished()<suspends>:void= Logger.Print("Koniec gry.") set GameActive = false
CaptureArea.Disable()
for (PlayerSpawner : PlayerSpawners): PlayerSpawner.Disable()
for (DamageVolume : DamageVolumes): DamageVolume.Disable() ~~~
Dodaj zmienną
into nazwieHighestScore, aby śledzić gracza z najwyższym wynikiem, a także odwołanie do zmiennej opcji do tego graczaWinningPlayer.Versevar HighestScore:int = -1 var WinningPlayer:?agent = falseW wyrażeniu for/do pobierz wszystkich graczy w przestrzeni gry, następnie dla każdego z nich pobierz
FortCharacter. Unieruchom postać w miejscu za pomocąPutInStasis(), przekazując nowy zestawstasis_args, aby umożliwić wstawianie emotek i obracanie się, dzięki czemu gracze będą mogli świętować zakończenie gry.Versefor: Player : GetPlayspace().GetPlayers() FortCharacter := Player.GetFortCharacter[] do: FortCharacter.PutInStasis(stasis_args{AllowTurning := true, AllowEmotes := true})W instrukcji
ifsprawdź wynik każdego gracza, aby wyszukać i przechować zwycięski wynik w urządzeniu odwołania do gracza w HUB-ie.Verseif (ScoreManager.GetCurrentScore(Player) > HighestScore): set HighestScore = ScoreManager.GetCurrentScore(Player) set WinningPlayer = option{Player}Na koniec, w innej instrukcji if, wywołaj
TeleportPlayersToHUB(), aby po wyszukaniu zwycięskiego wyniku teleportować wszystkich z powrotem do HUB-u.Verseif(Winner := WinningPlayer?): PlayerReference.Register(Winner) TeleportPlayersToHUB()
Teleportowanie graczy z powrotem do HUB-u
Po obliczeniu wyników i ogłoszeniu zwycięzcy wszyscy gracze powinni się teleportować z powrotem do HUB-u.
Dodaj nową metodę
TeleportPlayersToHUB()do definicji klasy tiltnboom. Ta metoda włącza wszystkie punkty spawnu gracza w HUB-ie, następnie odczekuje kilka sekund, zanim przeteleportuje wszystkich z powrotem do HUB-u. Ta metoda powinna też aktywowaćEndGameTrigger, aby usunąć kamerę i urządzenia sterujące z graczy.VerseTeleportPlayersToHUB()<suspends>:void= for (HUBSpawner : HUBSpawners): HUBSpawner.Enable() Sleep(DelayAfterGame) EndGameTrigger.Trigger()W wyrażeniu
forteleportuj każdego gracza z powrotem doHUBTeleporteri zwolnij go z trybu bezruchu.Versefor: Player : GetPlayspace().GetPlayers() FortCharacter := Player.GetFortCharacter[] do: HUBTeleporter.Teleport(Player) Sleep(1.0) FortCharacter.ReleaseFromStasis()
Praca własna
Zmodyfikuj kod, aby utworzyć różne zadania do wykonania przez urządzenie licznika czasu. Zamiast określania czasu trwania minigry, możesz użyć urządzenia licznika czasu, aby odmierzyć czas wyścigu.
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