Ten samouczek jest dokumentem uzupełniającym do szablonu stand-upu w Verse i zaprezentowano w nim sposób wykorzystania urządzeń wzmacniających doświadczenia społeczno-kinowe w klubie komediowym:
Zastosowanie szczegółowych zasobów animatora MetaHumans z urządzeniami postaci
Wyzwalanie zdarzeń rozgrywki przy użyciu powiązanych sygnałów wysyłanych przez gracza poprzez sterowanie za pomocą urządzeń wyzwalania sterowaniem
Blokowanie gracza na miejscu, aby mógł obserwować przygodę, za pomocą urządzenia siedziska
Urządzenie Verse odpowiada za przebieg występu, a kluczowe zagadnienia związane z kodem Verse zostały objaśnione poniżej.
Sam szablon stand-upu w Verse można znaleźć w sekcji Wyróżnione przykłady w UEFN (Unreal Editor dla Fortnite).
Używane urządzenia:
Elementy Verse wykorzystywane w tym samouczku:
Subskrypcje
Instrukcje if
Tablice
Sekwencje filmowe
Interfejs API urządzenia siedziska
Interfejs API urządzenia wyzwalania sterowaniem
Pamiętaj, że większość zmodyfikowanych ustawień interakcji urządzenia wprowadza się przy użyciu kodu Verse, w związku z tym w przypadku większości urządzeń zmodyfikowane opcje użytkownika będą wyświetlane w okrojonym zakresie.
Ustawienia Wyspy
Poniżej zaprezentowano zmodyfikowane ustawienia wyspy dla szablonu stand-upu w Verse:
| Opcja | Wartość | Wyjaśnienie |
|---|---|---|
Maks. liczba graczy | 1 | Jest to przygoda dla jednego gracza. |
Liczebność drużyn | 1 | Wymagana jest tylko jedna drużyna. |
Dołączenie do trwającej gry | Obserwuj | Jeśli gracze dołączą do gry po jej rozpoczęciu, będą obserwatorami. |
Po ostatnim odrodzeniu udaj się do | Indeks drużyny: 1 | Gracze będą respawnować się w swojej drużynie. |
Czat głosowy | Wszystkie | Gracze mogą porozumiewać się między sobą za pomocą czatu głosowego. |
Rozpocznij grę z kilofem | False | Gracze rozpoczynają grę, nie mając kilofów. |
Zezwól na obserwację innych drużyn | Zabronione | Gracze nie mogą obserwować innej drużyny. |
Limit czasu | 120 | Limit czasu został ustawiony na dwie godziny. |
Ukryj plecak | True | Plecak nie będzie pojawiał się na tej wyspie. |
Zezwalaj na wspinanie/przeskakiwanie | False | Gracze nie będą mogli się wspinać ani przeskakiwać. |
Koszt energii sprintu na sekundę | 2,0 | Koszt energii zużywanej podczas sprintu. |
Niezniszczalność | True | Gracze są nieśmiertelni. |
Zezwól na budowanie | Brak | Gracze nie mogą budować. |
Budowanie może niszczyć elementy otoczenia | False | Budowanie nie może niszczyć elementów otoczenia. |
Uszkadzanie otoczenia | Wył. | Gracze nie mogą uszkadzać elementów otoczenia. |
Nieskończone materiały budowlane | False | W tej przygodzie budowanie jest wyłączone. |
Pora dnia | 0:00 | Sceneria nocna. |
Intensywność światła | 0 | Wszystkie źródła światła w tej przygodzie pochodzą od lamp. |
Gęstość mgły | 30% | Otoczenie jest lekko zamglone. |
Kolor mgły | Niebieski | Określa kolor mgły. |
Własny komunikat zwycięstwa | Dziękujemy za przybycie do Fabryki Śmiechu | Komunikat widoczny dla graczy po zakończeniu gry. |
Pokaż komunikaty o likwidacji | False | Likwidacje nie są wyświetlane. |
Pokaż liczbę zasobów drewna/kamienia/metalu | False | Zasoby nie są wyświetlane. |
Pokaż likwidacje ekipy | False | Likwidacje ekipy nie są wyświetlane. |
Debugowanie | True | Funkcje debugowania są włączone. |
Szybka zmiana trybów | True | Szybka zmiana między trybami edycji i odtwarzania jest włączona. |
Urządzenie siedziska
Gdy gracz wchodzi do klubu komediowego, widzi siedzisko przed podświetloną sceną. Pojawia się monit, aby gracz zajął miejsce na tym siedzisku. Gdy gracz usiądzie, siedzisko zablokuje go w stałej lokalizacji i uruchomi łańcuch zdarzeń, które przeprowadzą gracza przez pozostałą część przygody.
Poniżej zaprezentowano zmodyfikowane Opcje użytkownika dla urządzenia siedziska:
| Opcja | Wartość | Wyjaśnienie |
|---|---|---|
Model siedziska | Niestandardowe | Na potrzeby tej przygody siedzisko zostało skonfigurowane jako niewidoczne, a następnie zastąpiono je rekwizytem siedziska Fortnite, aby lepiej wpisywało się w otoczenie klubu. |
Kąt interakcji | 180 stopni | Określa liczony od przodu siedziska kąt w każdym kierunku pozwalający na interakcję z siedziskiem. |
Promień interakcji | 1,2 m | Określa odległość, z jakiej gracze mogą usiąść na siedzisku. |
Urządzenia wyzwalania sterowaniem
Urządzenie wyzwalania sterowaniem dodawane jest razem z urządzeniem siedziska. Umożliwia ono powiązanie sygnałów wejściowych gracza z różnymi czynnościami wyzwalanymi za każdym razem, gdy gracz naciśnie przypisany przycisk. Urządzenia wyzwalania sterowaniem zostały skonfigurowane tak, aby umożliwić graczowi zmienianie kamer w trakcie występu.
Urządzenie posiada dwanaście dostępnych wejść do wyboru. Po wybraniu wejścia można dodać opis wyświetlany na HUD, aby wyjaśnić, jaka jest funkcja tego wejścia.
Poniżej zaprezentowano zmodyfikowane Opcje użytkownika dla tego urządzenia. Każde z urządzeń będzie miało inne powiązanie oraz inny opis HUD, ponieważ są one powiązane z różnymi urządzeniami sekwencji filmowej.
| Opcja | Wartość | Wyjaśnienie |
|---|---|---|
Sterowanie kreatywne | Własne 5 (Sprint) | Określa, czego nasłuchuje to urządzenie. |
Opis HUD | "Poprzednia kamera" | Umożliwia objaśnienie graczowi nowego sygnału wejściowego. |
Zachowanie zarejestrowanych graczy | Wymagaj rejestracji |
|
Urządzenia postaci
Urządzenia postaci umożliwiają bezpośrednią interakcję z graczem lub z innymi postaciami w scenie. Ten szablon wykorzystuje cztery postacie, które na zmianę będą realizować program na scenie.
Poniżej zaprezentowano zmodyfikowane Opcje użytkownika dla urządzenia postaci:
| Opcja | Wartość | Wyjaśnienie |
|---|---|---|
Postać | Wybierz postać | Określa, która postać będzie wyświetlana. |
Własna bezczynność | Siedzenie | Pozwala wybrać własną pozycję bezczynności dla postaci. |
Losowy start bezczynności | True | Określa, czy animacja bezczynności powinna zaczynać się w losowej pozycji. |
Postać główna siedzi na schodach za kulisami, a pozostałe postacie oczekują w niewielkim pomieszczeniu na tyłach.
Wypróbuj różne skórki postaci z menu rozwijanego Postać i sprawdź, jak będą się prezentować na scenie!
W tym szablonie wykorzystano zaimportowane animacje MetaHuman. Aby dowiedzieć się więcej na temat sposobów przechwytywania i importowania tych animacji, patrz strona Importowanie animacji MetaHuman.
Urządzenia sekwencji filmowej
Za pomocą sześciu urządzeń sekwencji filmowej gracz może wyświetlać występy pod różnymi kątami, nie wstając z urządzenia siedziska.
Ta strona nie zawiera szczegółowego omówienia sposobu tworzenia sekwencji filmowych. Więcej informacji można znaleźć na stronie Sequencer i Control Rig, a szczegółowe instrukcje zawiera dokument Jak tworzyć filmy w Unreal Engine.
Jedyną modyfikacją w przypadku tego urządzenia jest załadowana sekwencja filmowa.
Jak Verse realizuje występ
W tym szablonie wykorzystano Verse do uruchomienia występu, w trakcie którego gracz siedzi na urządzeniu siedziska i może zmienić ustawienie swojej kamery na widok filmowy nazywany trybem telewizyjnym. Umożliwia również graczowi przełączanie między wieloma kamerami, a także powrót do Trybu telewizyjnego lub Swobodnego rozglądania się, aby zmienić sposób obserwacji.
Za pomocą Eksploratora Verse utwórz nowe urządzenie Verse o nazwie show_template_device.verse w swoim projekcie i przeciągnij je do szablonu. Kliknij dwukrotnie swój plik Verse, aby otworzyć go w Visual Studio Code.
Skonfigurowaliśmy już w twoim szablonie urządzenia, które pomocą zrealizować występ stand-upowy, a teraz utworzysz do nich odwołania w swoim kodzie.
Dodaj do pliku show_template_device następujące pola:
Najpierw nad definicją klasy
show_template_devicedodajlog_channelo nazwielog_show_template_device.Verse# Create a custom log channel for the show_template_device. This helps with log filtering in complex games with lots of log sources. log_show_template_device := class(log_channel){} # A Verse-authored creative device that can be placed in a level show_template_device := class(creative_device):Teraz w górnej części definicji klasy
show_template_devicedodaj rejestrator korzystający z kanałulog_show_template_device, aby móc stwierdzić, które instrukcjePrint()napływają z tego urządzenia.Verse# A Verse-authored creative device that can be placed in a level show_template_device := class(creative_device): # Logger that uses custom log channel. Logger:log = log{Channel := log_show_template_device}Edytowalne urządzenie siedziska o nazwie
TheChair. Jest to siedzisko, na którym gracze będą zasiadali, aby rozpocząć występ stand-upowy.Verse# The chair device the player should sit in. @editable TheChair:chair_device = chair_device{}Dwa edytowalne urządzenia sekwencji filmowej o nazwie
MainSequenceiTVModeSequence.MainSequencejest sekwencją filmową odpowiedzialną za realizację występu stand-upowego poprzez sterowanie animacją i dźwiękiem urządzenia postaci w poziomie.TVModeSequenceprzełącza kamerę gracza na tryb oglądania, który śledzi sekwencjęMainSquence, przełączając widok między różnymi kątami.Verse# The sequence that drives animation and audio on the character device in the level. @editable MainSequence:cinematic_sequence_device = cinematic_sequence_device{} # The sequence that drives the TV mode sequence for viewing in the level. @editable TVModeSequence:cinematic_sequence_device = cinematic_sequence_device{}Edytowalna tablica
cinematic_sequence_deviceo nazwieCameraSwitches. Tablica ta zawiera odwołania do każdej z kamer, między którymi gracze mogą przełączać się w trakcie występu.Verse# A list of alternative camera sequences that are provided to view from during the main sequence. @editable CameraSwitches:[]cinematic_sequence_device = array{}Cztery edytowalne urządzenia
input_trigger_device. Każde z tych urządzeń reaguje na sygnały wejściowe gracza, przełączając między różnymi trybami kamer. WyzwalaczReturnToFreeLookpozwala graczowi wrócić do kamery domyślnej, natomiastReturnToTVModeumożliwia powrót do sekwencjiTVModeSequence. Przełączniki kamerNextCameraiPreviousModeumożliwiają graczowi przełączanie między różnymi sekwencjami filmowymi z tablicyCameraSwitches.Verse# An input trigger that will return us to free look while in the chair. @editable ReturnToFreeLook:input_trigger_device = input_trigger_device{} # An input trigger that will return us to TV mode when appropriate in the chair. @editable ReturnToTVMode:input_trigger_device = input_trigger_device{} # An input trigger that will choose the next camera while in the chair. @editableOpcjonalna zmienna urządzenia sekwencji filmowej o nazwie
CurrentSequence. W trakcie odtwarzania sekwencji filmowej, takiej jakTVModeSequence, w tej opcji przechowywane jest odwołanie do tej sekwencji. Odtwarzanie wielu sekwencji filmowych dla postaci równocześnie nie jest pożądane, dlatego za pomocą tej opcji wyłączyć bieżącą sekwencję po przełączeniu na nową.Verse# The alternative camera sequence that is playing if valid. var CurrentSequence:?cinematic_sequence_device = falseDwie zmienne logiczne o nazwie
MainSequencePlayingiInTvMode. Umożliwiają śledzenie, kiedy odtwarzana jest sekwencjaMainSequencelubTVModeSequence.Verse# Helps us track when the main sequence on the character device is playing. var MainSequencePlaying:logic = false # When we are in TV mode. var InTVMode:logic = falseZmienna typu liczba całkowita (int) o nazwie
CurrentCameraIndex. Pozwala ona śledzić indeks sekwencji filmowej w aktualnie odtwarzanej tablicyCameraSwitches.Verse# Keeps track of what camera we are viewing when using other cameras besides TV Mode. var CurrentCameraIndex:int = -1Pięć opcjonalnych zmiennych
cancelable, które śledzą subskrypcje wszystkich zdarzeń, do których istnieją odwołania w tym szablonie. Konieczne jest uruchamianie różnych funkcji, gdy gracz przełącza się między kamerami, wraca do trybu swobodnego rozglądania się lub trybu telewizyjnego bądź opuszcza urządzenie siedziska. W dalszej części tego samouczka zasubskrybujesz dla funkcji zdarzenia, które je wyzwalają, a następnie zapiszesz odwołanie do każdej subskrypcji, aby móc je anulować, gdy przestaną być potrzebne.Verse# Subscriptions to all the events we listen for while running. var ReturnToFreeLookSubscription:?cancelable = false var NextCameraSubscription:?cancelable = false var PrevCameraSubscription:?cancelable = false var ReturnToTVModeSubscription:?cancelable = false var ChairExitSubscription:?cancelable = falseZapisz skrypt w Visual Studio Code i skompiluj go, aby zaktualizować swoje urządzenie utworzone w Verse w poziomie.
Wybierz
show_template_devicew swoim szablonie. W panelu Szczegóły przypisz odwołanie do każdego urządzenia w swoim skrypcie do powiązanego z nim urządzenia w poziomie, uwzględniając każde z urządzeń wyzwalania sterowaniem i każdą z sekwencji filmowych.
Aktywowanie sekwencji
Występ zaczyna się, gdy gracz zasiada na urządzeniu siedziska, więc sekwencja filmowa powinna się rozpoczynać, gdy gracz usiądzie. Wykonaj poniższe kroki, aby wyzwolić sekwencję główną, gdy gracz zajmie miejsce na siedzisku, a także uruchomić tryb telewizyjny, aby gracz mógł oglądać występ.
Dodaj nową funkcję
RunSequence()do klasyshow_template_device. Ta funkcja pobiera agenta, który rozpoczął występ i uruchamia sekwencje MainSequence orazTVModeSequence. Dodaj modyfikator do funkcjiRunSequence(), aby umożliwić jej wykonywanie asynchroniczne. Funkcja ta musi być asynchroniczna, aby można było współbieżnie z nią uruchomić inny kod, umożliwiając graczowi przełączanie między widokami kamer bez przerywania koduRunSequence().Verse# Handles running the main sequence which runs the character and TV mode sequences for viewing and then calls a function to await finishing. RunSequence(Agent:agent)<suspends>:void =W funkcji
RunSequence(), wywołajSleep()na sekundę, aby umożliwić zakończenie animacji gracza zajmującego siedzisko przed uruchomieniem występu. Następnie wywołajPlay()dla sekwencjiMainSequence, a dlaMainSequencePlayingustaw wartość true.Verse# Sleep for a second because we just entered the chair and the animation to sit takes a moment. Sleep(1.0) # Run the Main sequence on the character device and the TV mode viewing sequence. Logger.Print("Main Sequence Playing") set MainSequencePlaying = true MainSequence.Play()Wywołaj
Play()dlaTVModeSequence, przekazując agenta, który rozpoczął występ w celu zmiany jego kamery na widok filmowy. Ustaw dlaInTVModewartość true, a następnie wywołaj nową funkcję o nazwieAwaitMainSequenceEnding()oczekującą na zakończenie sekwencjiMainSequence, przekazując agenta. Skonfigurujesz tę funkcję w kolejnym kroku. Gotowy kod funkcjiRunSequence()powinien wyglądać następująco:Verse# Handles running the main sequence which runs the character and TV mode sequences for viewing and then calls a function to await finishing. RunSequence(Agent:agent)<suspends>:void = # Sleep for a second because we just entered the chair and the animation to sit takes a moment. Sleep(1.0) # Run the Main sequence on the character device and the TV mode viewing sequence. Logger.Print("Main Sequence Playing") set MainSequencePlaying = true MainSequence.Play()Dodaj do klasy
show_template_devicenową funkcjęAwaitMainSequecingEnding(), która pobiera elementagentz funkcjiRunSequence(). Funkcja ta również wymaga zastosowania modyfikatora<suspends>, ponieważ ma być wykonywana w tle i wyzwalana, gdy zakończy się sekwencjaMainSequence.Verse# When the main sequence finishes, we clear the flag so that if the player sits back down, it will play again. AwaitMainSequencingEnding(Agent:agent)<suspends>:void =W funkcji
AwaitMainSequencingEnding()wywołajAwait()dlaMainSequence.StoppedEvent(). GdyMainSequencesię zakończy, ustaw dlaMainSequencePlayingwartośćfalsei wymuś na graczu powstanie z siedziska za pomocą funkcjiEject(). Gotowa funkcjaAwaitMainSequencingEnding()powinna wyglądać następująco:Verse# When the main sequence finishes, we clear the flag so that if the player sits back down, it will play again. AwaitMainSequencingEnding(Agent:agent)<suspends>:void = MainSequence.StoppedEvent.Await() Logger.Print("Main Sequence Ended") set MainSequencePlaying = false # Kick the player out of the chair after the performance TheChair.Eject(Agent)Dodaj dwie nowe funkcje
DoReturnToTVMode()iDoReturnToFreeLook()do klasyshow_template_device. Funkcje te obsługują logikę sytuacji, w których gracz powraca odpowiednio do trybu telewizyjnego lub trybu swobodnego rozglądania się, jednak na ten moment pozostaną one puste i uzupełnisz je na dalszym etapie.Verse# Returns us to our TV viewing mode sequence by checking where the main sequence is and aligning our playback to that point. DoReturnToTVMode(Agent:agent):void = Logger.Print("Return to TV Mode") # Determine if we are in TV mode or another camera sequence and return control to the main player camera. DoReturnToFreeLook(Agent: agent):void = Logger.Print("Return to Free Look")Dodaj do klasy
show_template_devicenową funkcjęOnSeated(), która pobiera agenta zajmującegoTheChair.Verse# This function handles the player sitting down and starting up the performance if it isn't already running and setting up the input triggers. OnSeated(Agent:agent):void = Logger.Print("Player sat down")Jeśli sekwencja
MainSequencenie jest jeszcze odtwarzana, wygeneruj wOnSeated()funkcjęRunSequence(), przekazując agenta, który usiadł w urządzeniu siedziska. W przeciwnym razie wywołajDoReturnToTVMode(), uwzględniając tego samego agenta.Verse# This function handles the player sitting down and starting up the performance if it isn't already running and setting up the input triggers. OnSeated(Agent:agent):void = Logger.Print("Player sat down") # If the main sequence is not playing on the character device in the level, run it, otherwise if it is running then just return to the TV mode viewing experience. if (MainSequencePlaying = false): spawn{RunSequence(Agent)} else: DoReturnToTVMode(Agent)Dodaj do klasy
show_template_devicenową funkcjęOnChairExited()pobierającą gracza, który wstał z siedziska. Logikę tej funkcji uzupełnisz na dalszym etapie.Verse# Handles the player leaving the chair and removing access to the input triggers that are available while in the chair. OnChairExited(Agent:agent):void = Logger.Print("Player got up")W funkcji
OnBegin()zasubskrybuj zdarzenieTheChair.SeatedEventdo funkcjiOnSeated(). Teraz za każdym razem, gdy gracz usiądzie na siedziskuTheChair, występ będzie uruchamiany.Verse# Runs when the device is started in a running game. OnBegin<override>()<suspends>:void = Logger.Print("Standup Template device started") TheChair.SeatedEvent.Subscribe(OnSeated)
Zapisz skrypt w Visual Studio Code, skompiluj go, a następnie na pasku narzędzi UEFN kliknij opcję Uruchom sesję, aby przetestować szablon w grze. Po uruchomieniu gry zajęcie miejsca na urządzeniu siedziska powinno spowodować rozpoczęcie występu i ustawienie dla kamery gracza trybu filmowego. Po zakończeniu występu program powinien wymusić powstanie gracza z siedziska.
Przełączanie kamer
W trakcie występu gracz zajmujący siedzisko TheChair może przełączać między różnymi widokami kamery obsługiwanymi przez różne sekwencje filmowe. Wykonaj poniższą procedurę, aby skonfigurować logikę przełączania między tymi różnymi sekwencjami.
Dodaj nową funkcję
DoCameraSwitch()do klasyshow_template_device. Funkcja ta pobiera agenta, którego kamera będzie przełączana, a także ciągintodpowiadający indeksowi sekwencji filmowej w tablicyCameraSwitches.Verse# Switches us between camera sequences that have been specified by stopping any current ones and moving to the next appropriate one on the list. DoCameraSwitch(Agent:agent, Value:int):void =W wyrażeniu
ifwDoCameraSwitch()pobierz sekwencję filmową pod indeksem Value w tablicyCameraSwitches. Następnie zatrzymaj wszelkie odtwarzane aktualnie sekwencje filmowe, sprawdzając, czy parametrCurrentSequencezawiera sekwencję filmową i wywołując dla niegoStop().Verse# Switches us between camera sequences that have been specified by stopping any current ones and moving to the next appropriate one on the list. DoCameraSwitch(Agent:agent, Value:int):void = if (CameraSwitch := CameraSwitches[Value]): Logger.Print("Switching Cameras to {Value}") # Stop any currently playing other camera sequence. if (PlayingSequence := CurrentSequence?): PlayingSequence.Stop(Agent)Rozpocznij odtwarzanie nowej sekwencji filmowej, wywołując
Play()dlaCameraSwitch. Następnie ustawCurrentSequencetak, aby wskazywana była aktualnie odtwarzana sekwencja. Na końcu wywołajRegister()dla agentaagent, którego kamera jest przełączana, wykorzystując urządzenia wyzwalania sterowaniemReturnToTVModeiReturnToFreeLook, aby umożliwić powrót do tych trybów podczas wyświetlania innych kamer. Gotowa funkcjaDoCameraSwitch()powinna wyglądać następująco:Verse# Switches us between camera sequences that have been specified by stopping any current ones and moving to the next appropriate one on the list. DoCameraSwitch(Agent:agent, Value:int):void = if (CameraSwitch := CameraSwitches[Value]): Logger.Print("Switching Cameras to {Value}") # Stop any currently playing other camera sequence. if (PlayingSequence := CurrentSequence?): PlayingSequence.Stop(Agent) # Start up the new camera viewing sequence.Do przełączania między kolejną a poprzednią kamerą skonfigurujesz dwie bardzo podobne funkcje
DoNextCamera()iDoPreviousCamera(). Najpierw uzupełnisz logikę funkcji wyboru kolejnej kamery, więc dodaj nową funkcjęDoNextCamera()do klasyshow_template_device. Funkcja ta pobiera agentaagent, którego kamera będzie przełączana.Verse# Switches to the next camera on our list, or the first if we are in TV mode. DoNextCamera(Agent:agent):void = Logger.Print("Next Camera")W
DoNextCamera()sprawdź, czy gracz korzysta obecnie z trybu telewizyjnego. Jeśli tak, wykonajStop()dlaTVModeSequence, ustaw dlaInTVModewartość false, a dlaCurrentCameraIndexustaw wartość-1. Konieczna jest tutaj wartość-1, ponieważ chcesz przejść w indeksie do kolejnej sekwencji filmowej z tablicyCameraSwitches, która miałaby wartość0.Verse# If we are currently viewing from TV Mode, end that sequence and clear associated values. if (InTVMode?): TVModeSequence.Stop(Agent) set InTVMode = false set CurrentCameraIndex = -1Następnie musisz ustalić, która kamera będzie kolejną na liście przełączania, biorąc pod uwagę indeks bieżącej kamery. W tym celu ustaw dla nowej zmiennej
NextCameraValuewartośćModzmiennychCurrentCameraIndex + 1orazCameraSwitches.Length. Dzięki temu ograniczysz wartośćNextCameraValuedo wartości z przedziału od0do wartości długościCameraSwitchesi uniemożliwisz uzyskanie wartościNextCameraValuewykraczającej poza tablicęCameraSwitches. Po ustawieniu wartościNextCameraValue, ustaw dla zmiennejCurrentCameraValuewartośćNextCameraValuei wywołajDoCameraSwitch(), przekazując elementagentorazCurrentCameraIndex. Gotowa funkcjaDoNextCamera()powinna wyglądać następująco:Verse# Switches to the next camera on our list, or the first if we are in TV mode. DoNextCamera(Agent:agent):void = Logger.Print("Next Camera") # If we are currently viewing from TV Mode, end that sequence and clear associated values. if (InTVMode?): TVModeSequence.Stop(Agent) set InTVMode = false set CurrentCameraIndex = -1Aby umożliwić przełączanie na poprzednią kamerę, dodaj nową funkcję o nazwie
DoPreviousCamera()do klasyshow_template_device. Skopiuj do tej funkcji kod z funkcjiDoNextCamera(). Podczas sprawdzania, czy gracz korzysta z trybu telewizyjnego, ustaw dlaCurrentCameraIndexwartość0zamiast-1. Zmień również wartośćNextCameraValuenaModzmiennychCurrentCameraIndex - 1iCameraSwitches.Length. Gotowa funkcjaDoPreviousCamera()powinna wyglądać następująco:Verse# Switches us to the previous camera on the list or last camera if we are leaving TV mode. DoPreviousCamera(Agent:agent):void = Logger.Print("Prev Camera") # If we are currently viewing from TV Mode, end that sequence and clear associated values. if (InTVMode?): TVModeSequence.Stop(Agent) set InTVMode = false set CurrentCameraIndex = 0
Gracz siedzący na siedzisku TheChair i oglądający występ z innej kamery w CameraSwitches może powrócić do trybu telewizyjnego lub swobodnego rozglądania się. Wcześniej skonfigurowaliśmy funkcje DoReturnToFreeLook() oraz DoReturnToTVMode(), a teraz je uzupełnimy.
W funkcji
DoReturnToFreeLook()sprawdź, czy gracz jest obecnie w trybie telewizyjnym. Jeśli tak, wykonajStop()dlaTVModeSequencei ustaw dlaInTVModewartość false. Zrób to samo zCurrentSequence, sprawdzając, czyCurrentSequencezawiera sekwencję filmową, wywołującStop()i ustawiając wartość false w przypadku pozytywnego wyniku weryfikacji.Verse# If TV Mode is active, stop it. if (InTVMode?): TVModeSequence.Stop(Agent) set InTVMode = false # If we are playing another viewing experience, stop it. if (TempSeq := CurrentSequence?): TempSeq.Stop(Agent) set CurrentSequence = falseTeraz wykonaj
Register()dla agenta, wykorzystując urządzenie wyzwalania sterowaniemReturnToTVMode, a następnie wykonaj dla niegoUnregister()z użyciem wyzwalaczaReturnToFreeLook, aby gracz nie powracał do trybu swobodnego rozglądania się, jeśli już znajduje się w tym trybie. Gotowa funkcjaDoReturnToFreeLook()powinna wyglądać następująco:Verse# Determine if we are in TV mode or another camera sequence and return control to the main player camera. DoReturnToFreeLook(Agent: agent):void = Logger.Print("Return to Free Look") # If TV Mode is active, stop it. if (InTVMode?): TVModeSequence.Stop(Agent) set InTVMode = false # If we are playing another viewing experience, stop it.Funkcja
DoReturnToTVMode()wymaga dodatkowej logiki, ponieważ przy powracaniu do trybu telewizyjnego trzeba uruchomićTVModeSequencew czasie bieżącym sekwencjiMainSequence. Najpierw sprawdź, czy gracz jest już w trybie telewizyjnym w momencie wywołania tej funkcji. Jeśli tak, wykonajreturn, ponieważ nie trzeba nic robić. Następnie sprawdź, czyCurrentSequencezawiera sekwencję filmową, wywołującStop(), a w przypadku pozytywnego wyniku weryfikacji ustawiając wartośćfalse.Verse# If we are already in TV mode no need to return to it. if (InTVMode?): return # If we have another camera sequence playing, stop it and clear associated values. if (TempSeq := CurrentSequence?): TempSeq.Stop(Agent) set CurrentSequence = falseTeraz musisz ustalić, na jakim etapie odtwarzania jest
MainSequencei rozpocząć odtwarzanieTVModeSequenceod tego miejsca. Pobierz czas odtwarzaniaMainSequence, wywołującGetPlayBackTime(), i zapisz wartość w zmiennejCurrentSeekTime. Ustaw czas odtwarzaniaTVModeSequencenaCurrentSeekTime, wykorzystującSetPlaybackTime(), a następnie wykonajPlay()dla sekwencji, przekazując agenta. Następnie ustaw dlaInTVModewartośćtrue.Verse# Figure out where the main sequence is in its playback and start up the TV mode sequence at the same spot to provide the proper viewing experience. CurrentSeekTime := MainSequence.GetPlaybackTime() TVModeSequence.SetPlaybackTime(CurrentSeekTime) TVModeSequence.Play(Agent) set InTVMode = trueNa końcu wykonaj
Unregister(), aby wyrejestrować agenta z urządzenia wyzwalania sterowaniemReturnToTVMode, po czym wykonajRegister()dla agenta z użyciem wyzwalaczaReturnToFreeLook. Gotowa funkcjaDoReturnToTVMode()powinna wyglądać następująco:Verse# Returns us to our TV viewing mode sequence by checking where the main sequence is and aligning our playback to that point. DoReturnToTVMode(Agent:agent):void = Logger.Print("Return to TV Mode") # If we are already in TV mode no need to return to it. if (InTVMode?): return # If we have another camera sequence playing, stop it and clear associated values. if (TempSeq := CurrentSequence?):
Łączenie wszystkiego razem
W poprzedniej części tego samouczka skonfigurowaliśmy mnóstwo funkcji. Teraz czas połączyć je wszystkie z różnymi urządzeniami aktywacji sterowaniem, które je wywołują.
W
OnSeated()wykonajRegister()dla agenta z użyciem urządzeń wyzwalania sterowaniemReturnToFreeLook,NextCameraorazPreviousCamera, ponieważ są to wyzwalacze, do których gracz będzie miał początkowo dostęp, gdy zajmie miejsce na siedzisku. Następnie ustawReturnToFreeLookSubscription,NextCameraSubscriptioniPreviousCameraSubscription, subskrybując dla każdego urządzenia wyzwalania sterowaniem powiązaną z nim funkcję. W ten sam sposób ustawReturnToTVModeSubscriptioniChairExitSubscription.Verse# Register for the input trigger for free look and subscribe to the pressed event when sitting. ReturnToFreeLook.Register(Agent) set ReturnToFreeLookSubscription = option{ReturnToFreeLook.PressedEvent.Subscribe(DoReturnToFreeLook)} # Register for the input trigger for the next camera and subscribe to the pressed event when sitting. NextCamera.Register(Agent) set NextCameraSubscription = option{NextCamera.PressedEvent.Subscribe(DoNextCamera)} # Register for the input trigger for the previous camera and subscribe to the pressed event when sitting. PreviousCamera.Register(Agent)Dodaj do klasy
show_template_devicenową funkcjęCancelSubscription(), która przyjmuje opcjonalną wartość, którą można anulować. WCancelSubscription()sprawdź, czySubscriptionzawiera wartość. Jeśli tak, wykonajCancel()dla tej subskrypcji. Gotowa funkcjaCancelSubscription()powinna wyglądać następująco:Verse# Cancel a subscription if it is valid. CancelSubscription(Subscription:?cancelable):void = if (SubscriptionToCancel := Subscription?): SubscriptionToCancel.Cancel()Gdy gracz opuszcza siedzisko, musisz zatrzymać wszelkie sekwencje odtwarzane w danej chwili na odtwarzaczu, a także anulować wszelkie subskrypcje urządzeń aktywacji sterowaniem, w których gracz był zarejestrowany. W funkcji
OnChairExited(), podobnie jak wDoReturnToFreeLook(), sprawdź, czy gracz jest w trybie telewizyjnym, a także czyCurrentSequencezawiera sekwencję filmową. Jeśli tak, wywołajStop()dla każdej sekwencji, a jeśli gracz jest w trybie telewizyjnym, ustaw dlaInTVModewartośćfalse. Następnie ustaw dlaCurrentSequencewartośćfalse.Verse# Stop the TV camera view when we leave the chair if it is active. if (InTVMode = true): TVModeSequence.Stop(Agent) set InTVMode = false # Stop the camera sequence we were using if it is active when we leave the chair. if (TempSeq := CurrentSequence?): TempSeq.Stop(Agent) # Clear whatever the current sequence was when we leave the chair.Teraz anuluj wszystkie subskrypcje gracza, przekazując każdą subskrypcję do funkcji
CancelSubscription(). Ponadto wykonajUnregister(), aby wyrejestrować gracza z każdego urządzenia wyzwalania sterowaniem, ponieważ po opuszczeniu siedziska nie powinien mieć dostępu do tych przycisków. Gotowa funkcjaOnChairExited()powinna wyglądać następująco:Verse# Handles the player leaving the chair and removing access to the input triggers that are available while in the chair. OnChairExited(Agent:agent):void = Logger.Print("Player got up") # Stop the TV camera view when we leave the chair if it is active. if (InTVMode = true): TVModeSequence.Stop(Agent) set InTVMode = false # Stop the camera sequence we were using if it is active when we leave the chair.
Zapisz skrypt w Visual Studio Code, skompiluj go, a następnie na pasku narzędzi UEFN kliknij opcję Uruchom sesję, aby przetestować szablon w grze. W trakcie testu gry zajęcie przez gracza miejsca w urządzeniu siedziska powinno spowodować rozpoczęcie występu. W trakcie występu gracz powinien mieć możliwość przełączania między trybem telewizyjnym, trybem swobodnego rozglądania się oraz wieloma innymi kątami ustawienia kamer. Powrót do trybu telewizyjnego powinien powodować zsynchronizowanie sekwencji trybu telewizyjnego z sekwencją główną. Po zakończeniu występu powinien nastąpić powrót do trybu swobodnego rozglądania się, a program powinien wymusić powstanie gracza z siedziska.