Dieses Tutorial ist ein Begleitdokument zur Verse Stand-Up-Vorlage, die zeigt, wie Geräte eingesetzt werden, die ein soziales und kinematografisches Erlebnis in einem Comedyclub bieten:
Verwendung detaillierter MetaHuman-Animator-Assets mit den Charaktergeräten
Auslösen von Gameplay-Events bei Spieler-Input-Bindungen mit Input-Trigger -Geräten
Sperren eines Spielers an einer Position zum Ansehen der Erfahrung mit dem Stuhl-Gerät
Ein Verse-Gerät leitet die Show. Die Hauptkonzepte des Verse-Codes werden unten erläutert.
Die Verse-Stand-Up-Vorlage selbst findest du im Abschnitt **Funktionsbeispiele von UEFN (Unreal Editor für Fortnite).
Verwendete Geräte:
1 x Stuhl
4 x Input-Trigger
4 x Charakter
6 x Filmsequenz
Folgende Verse-Konzepte werden in diesem Tutorial verwendet:
Abonnements
If-Anweisungen
Arrays
Filmsequenzen
Stuhlgerät-API
Eingabeauslöser-Gerät-API
Sei dir bewusst, dass die meisten geänderten Einstellungen für Gerätinteraktionen mit Verse-Code erfolgen. Daher werden die geänderten Benutzeroptionen für die meisten Geräte sehr abgespeckt wirken.
Inseleinstellungen
Dies sind die geänderten Inseleinstellungen für die Verse-Stand-Up-Vorlage:
| Option | Value | Erklärung |
|---|---|---|
Spielerlimit | 1 | Dies ist ein Einzelspieler-Erlebnis. |
Teamgröße | 1 | Es ist nur ein Team erforderlich. |
Beitritt von laufendem Spiel | Beobachten | Spieler sehen zu, wenn sie einem Spiel beitreten, das bereits gestartet wurde. |
Team nach letztem Respawn | Team-Index: 1 | Spieler respawnen in ihrem Team. |
Sprach-Chat | Alle | Sprachchat ist zwischen Spielern erlaubt. |
Mit Spitzhacke starten | False | Spieler starten das Spiel nicht mit einer Spitzhacke. |
Beobachten anderer Teams möglich | Nicht zugelassen | Spieler können kein anderes Team beobachten. |
Zeitlimit | 120 | Das Zeitlimit beträgt zwei Stunden. |
Rücken-Accessoire verbergen | True | Auf dieser Insel werden Rücken-Accessoires nicht angezeigt. |
Klettern/Überspringen erlauben | False | Spieler können nicht klettern und der Hindernislauf ist auch nicht möglich. |
Sprint-Energiekosten pro Sekunde | 2,0 | Der durch den Sprint verbrauchte Energieaufwand. |
Unverwundbarkeit | True | Spieler sind unbesiegbar. |
Bauen zulassen | Keiner | Spieler können nicht bauen. |
Umgebungsobjekte können durch Bauen zerstört werden | False | Bauen kann die Umgebung nicht zerstören. |
Schaden an Umgebung | Aus | Die Spieler können der Umgebung keinen Schaden zufügen. |
Unendliche Baumaterialien | False | Das Bauen ist in dieser Erfahrung deaktiviert. |
Tageszeit | 00:00 Uhr | Nachtzeit-Einstellung. |
Lichthelligkeit | 0 | Alle Lichtquellen in diesem Erlebnis gehen von Lampen aus. |
Nebeldichte | 30 % | Umgebung ist leicht neblig. |
Nebelfarbe | Blau | Bestimmt die Nebelfarbe. |
Individueller Text bei Sieg | Vielen Dank für Ihren Besuch in der Käsekonservenfabrik | Was Spieler nach Beendigung des Spiels sehen. |
Eliminierungsnachrichten anzeigen | False | Eliminierungen werden nicht angezeigt. |
Holz-/Stein-/Metallmenge anzeigen | False | Ressourcen werden nicht angezeigt. |
Gruppeneliminierungen anzeigen | False | Teamausscheidungen werden nicht angezeigt. |
Debuggen | True | Debugging-Funktionen sind aktiviert. |
Schnelliteration erlauben | True | Schnelliteration zwischen Bearbeiten- und Spielen-Modus ist aktiviert. |
Stuhlgerät
Wenn der Spieler den Comedyclub betritt, sieht er einen Stuhl vor einer beleuchteten Bühne. Er wird aufgefordert, sich auf diesen Stuhl zu setzen. Durch das Sitzen auf dem Stuhl bleibt der Spieler an einer festen Position und setzt die Ereigniskette in Bewegung, die ihn durch den Rest der Erfahrung führt.
Dies sind die geänderten Benutzeroptionen für das Stuhlgerät:
| Option | Value | Erklärung |
|---|---|---|
Stuhlmodell | Benutzerdefiniert | Für dieses Erlebnis wird der Stuhl unsichtbar gemacht und dann durch ein Fortnite-Stuhlobjekt ersetzt, damit er besser in die Club-Atmosphäre passt. |
Interaktionswinkel | 180 Grad | Bestimmt den Winkel in jeder Richtung von der Vorderseite des Stuhls aus gesehen, der für eine Interaktion erforderlich ist. |
Interaktionsradius | 1,2 m | Bestimmt die Distanz, von der aus der Spieler sich auf den Stuhl setzen kann. |
Eingabeauslöser-Geräte
Ein
Das Gerät umfasst zwölf verfügbare Eingaben, unter denen gewählt werden kann. Wenn du eine Eingabe gewählt hast, kannst du eine HUD-Beschreibung hinzufügen, um zu verdeutlichen, was die neue Eingabe macht.
Dies sind die geänderten Benutzeroptionen für dieses Gerät. Jedes der Geräte hat eine andere Bindung und HUD-Beschreibung, da sie an bestimmte Filmsequenz-Geräte gebunden sind.
| Option | Value | Erklärung |
|---|---|---|
Kreativmodus-Eingabe | Benutzerdef. 5 (Sprinten) | Bestimmt die Eingabe, auf die das Gerät achtet. |
HUD-Beschreibung | „Vorherige Kamera“ | Eine Möglichkeit, dem Spieler den neuen Input zu erläutern. |
Verhalten registrierter Spieler | Registrierung erforderlich |
|
Charaktergeräte
Die Charaktergeräte stellen eine Möglichkeit für dich dar, direkt mit dem Spieler oder mit anderen Charakteren in einer Szene zu interagieren. Diese Vorlage verwendet vier Charaktere, die sich während des Auftritts auf der Bühne abwechseln.
Dies sind die geänderten Benutzeroptionen für das Charaktergerät:
| Option | Value | Erklärung |
|---|---|---|
Charakter | Wähle einen Charakter | Bestimmt, welcher Charakter angezeigt wird. |
Untätig (Angepasst) | Setzen | Wählt eine benutzerdefinierte Leerlaufposition für den Charakter. |
Animation bei Untätigkeit – zufälliger Startpunkt | True | Bestimmt, ob die Animation bei Untätigkeit an einer zufälligen Position beginnen soll. |
Der Hauptcharakter sitzt hinter der Bühne auf einer Treppe, die übrigen Charaktere warten in einem kleinen Raum im hinteren Bereich.
Experimentiere mit anderen Charakter-Skins aus dem Charakter-Dropdown-Menü und sieh dir an, wie sie auf der Bühne aussehen.
Diese Vorlage verwendet importierte MetaHuman-Animationen. Auf der Seite Importieren von MetaHuman-Animationen erfährst du mehr darüber, wie diese Animationen erfasst und importiert wurden.
Filmsequenz-Geräte
Mit den sechs Filmsequenz-Geräten kann der Spieler sich die Vorstellung aus verschiedenen Winkeln ansehen, während er auf dem Stuhlgerät sitzt.
Diese Seite geht nicht detaillierter darauf ein, wie Filmsequenzen erstellt werden. Weitere Informationen findest du auf der Seite Sequencer und Control-Rig und eine ausführlichere Erläuterung findest unter So werden Filme in der Unreal Engine erstellt.
Die einzige Änderung für dieses Gerät ist die geladene Filmsequenz.
So regelt Verse alles
Diese Vorlage nutzt Verse, um die Vorstellung zu starten, wenn sich der Spieler auf das Stuhlgerät setzt, und seine Kamera zu der Filmansicht mit der Bezeichnung TV-Modus zu ändern. Der Spieler kann zwischen mehreren Kameras wechseln und für andere Betrachtungserfahrungen zum TV mode oder zu Free Look zurückkehren.
Erstelle in deinem Projekt ein neues Verse-Gerät mit der Bezeichnung show_template_device.verse und nutze dazu den [Verse-Explorer. Ziehe das Gerät in die Vorlage. Doppelklicke auf deine Verse-Datei, um sie in Visual Studio Code zu öffnen.
Du hast in deiner Vorlage Geräte eingerichtet, die den Ablauf der Stand-Up-Show unterstützen. Jetzt referenzierst du diese Gerät in deinem Code.
Füge die folgenden Felder zur Datei show_template_device hinzu:
Füge zunächst über der Definition der
show_template_device-Klasse einenlog_channelmit der Bezeichnunglog_show_template_devicehinzu.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):Füge jetzt oben in der Klassendefinition
show_template_deviceeinen Logger hinzu, der den Kanallog_show_template_devicenutzt, damit du erkennst, welchePrint()-Anweisungen von diesem Gerät kommen.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}Ein editierbares Stuhlgerät namens
TheChair. Dies ist der Stuhl, auf den Spieler sich setzen, um die Stand-Up-Show zu starten.Verse# The chair device the player should sit in. @editable TheChair:chair_device = chair_device{}Zwei bearbeitbare Filmsequenz-Geräte mit der Bezeichnung
MainSequenceundTVModeSequence.MainSequenceist die Filmsequenz, die die Stand-Up-Show zeigt sowie die Animation und den Ton für das Charaktergerät im Level steuert.TVModeSequenceschaltet die Kamera des Spielers zu einem Betrachtungsmodus um, der derMainSquence-Umschaltung zwischen verschiedenen Winkeln folgt.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{}Ein editierbares Array von
cinematic_sequence_devicenamensCameraSwitches. Dieses Array enthält Referenzen auf jede der Kameras, zu der die Spieler während der Show umschalten können.Verse# A list of alternative camera sequences that are provided to view from during the main sequence. @editable CameraSwitches:[]cinematic_sequence_device = array{}Vier bearbeitbare
input_trigger_device. Jedes dieser Geräte nimmt Spielereingabe an, um zwischen verschiedenen Kameramodi zu wechseln. Der TriggerReturnToFreeLookbringt den Spieler zur Standardkamera zurück, währendReturnToTVModeden Spieler zurTVModeSequencezurückbringt. Die KameraNextCameraundPreviousModeschaltet den Spieler zwischen den verschiedenen Sequenzen im ArrayCameraSwitchesum.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. @editableEine optionales Filmsequenz-Gerät-Variable mit dem Namen
CurrentSequence. Wenn eine Filmsequenz wieTVModeSequencewiedergegeben wird, speichert diese Option eine Referenz darauf. Du möchtest für den Charakter nicht mehrere Filmsequenzen gleichzeitig wiedergeben. Daher kannst du mit dieser Option die aktuelle Sequenz ausschalten, wenn du zu einer neuen wechselst.Verse# The alternative camera sequence that is playing if valid. var CurrentSequence:?cinematic_sequence_device = falseZwei logische Variablen namens
MainSequencePlayingundInTvMode. Mit diesen kannst du nachverfolgen, wannMainSequenceoderTVModeSequencewiedergegeben wird.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 = falseEine Variable vom Typ int namens
CurrentCameraIndex. Diese verfolgt den Index der Filmsequenz im ArrayCameraSwitchesnach, die aktuell wiedergegeben wird.Verse# Keeps track of what camera we are viewing when using other cameras besides TV Mode. var CurrentCameraIndex:int = -1Fünf optionale
cancelable-Variablen, die Abonnements für alle Events verfolgen, die in dieser Vorlage referenziert werden. Wenn der Spieler zwischen Kameras umschaltet, zum freien Umschauen oder zum TV-Modus zurückkehrt oder das Stuhlgerät verlässt, müssen verschiedene Funktionen ausgeführt werden. In einem späteren Teil dieses Tutorials wirst du die Events, die sie auslösen, mit den Funktionen abonnieren und eine Referenz zu jedem Abonnement speichern, damit du sie abbrechen kannst, wenn sie nicht mehr benötigt werden.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 = falseSpeichere das Script in Visual Studio Code und kompiliere es, um dein in Verse erstelltes Gerät im Level zu aktualisieren.
Wähle das
show_template_devicein deiner Vorlage. Weise im Details-Panel jede Gerätreferenz in deinem Script dem zugeordneten Gerät im Level zu, einschließlich aller Eingabeauslöser und Filmsequenzen.
Auslösen der Sequenz
Die Show beginnt, wenn sich ein Spieler auf das Stuhlgerät setzt. Die Filmsequenz soll starten, sobald sich der Spieler hingesetzt hat. Befolge die unten aufgeführten Schritte, um die Hauptsequenz auszulösen, wenn sich ein Spieler auf den Stuhl setzt, und den TV-Modus zu starten, damit der Spieler zusehen kann.
Füge eine neue Funktion
RunSequence()zur Klasseshow_template_devicehinzu. Diese Funktion nimmt den Agent entgegen, der die Show gestartet hat, und startet sowohl MainSequence als auchTVModeSequence. Füge den -Modifikator zuRunSequence()hinzu, damit es asynchron ausgeführt werden kann. Diese Funktion muss asynchron sein, damit du den übrigen Code gleichzeitig damit ausführen kannst, sodass der Spieler zwischen den Kameraansichten wechseln kann, ohne denRunSequence()-Code zu unterbrechen.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 =Rufe in
RunSequence()für eine SekundeSleep()auf, damit die Animation des Spielers, der auf dem Stuhl sitzt, abgeschlossen wird, bevor die Show beginnt. Rufe dannPlay()aufMainSequenceauf und setzeMainSequencePlayingauf 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()Rufe
Play()aufTVModeSequenceauf und übergib den Agent, der die Show gestartet hat, um die Kamera zur Filmansicht zu ändern. SetzeInTVModeauf True und rufe eine neue Funktion, die auf das Ende vonMainSequencewartet, mit der BezeichnungAwaitMainSequenceEnding()auf und übergib ihr den Agent. Du wirst diese Funktion im nächsten Schritt einrichten. Dein fertigerRunSequence()-Code sollte wie folgt aussehen: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()Füge eine neue Funktion
AwaitMainSequecingEnding()zur Klasseshow_template_devicehinzu, die denagentvonRunSequence()übernimmt. Diese Funktion benötigt ebenfalls den Modifikator<suspends>, da du möchtest, dass sie im Hintergrund läuft und ausgelöst wird, wennMainSequenceendet.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 =Rufe in
AwaitMainSequencingEnding()die FunktionAwait()für das EreignisMainSequence.StoppedEvent()auf. WennMainSequenceendet, setzeMainSequencePlayingauffalseund wirf den Spieler mit der FunktionEject()des Stuhls aus dem Stuhl. Deine fertige FunktionAwaitMainSequencingEnding()sollte wie folgt aussehen: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)Füge zwei neue Funktionen,
DoReturnToTVMode()undDoReturnToFreeLook(),zur Klasseshow_template_devicehinzu. Diese Funktionen verarbeiten die Logik, wenn ein Spieler zum TV-Modus oder zum freien Umsehen zurückkehrt. Vorerst lässt du sie aber leer und füllst sie erst in einem späteren Schritt.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")Füge die neue Funktion
OnSeated()zur Klasseshow_template_devicehinzu, die den Agent nimmt, der inTheChairgesessen hat.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")Wenn in
OnSeated()dieMainSequencenicht bereits wiedergegeben wird, spawne eineRunSequence()-Funktion, die den Agent übergibt, der im Stuhlgerät gesessen hat. Andernfalls wirdDoReturnToTVMode()mit dem gleichen Agent aufgerufen.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)Füge eine neue Funktion
OnChairExited()zur Klasseshow_template_devicehinzu, die den Spieler entgegennimmt, der den Stuhl verlassen hat. Du wirst die Logik für diese Funktion in einem späteren Schritt ausfüllen.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")Abonniere in
OnBegin()das EreignisTheChair.SeatedEventfür die FunktionOnSeated(). Immer, wenn ein Spieler sich inTheChairsetzt, wird die Show ausgeführt.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)
Speichere das Script in Visual Studio Code, kompiliere es und klicke in der UEFN-Werkzeugleiste auf Sitzung starten, um einen Spieltest der Vorlage auszuführen. Wenn du dein Spiel laufen lässt, sollte das Sitzen auf dem Stuhlgerät die Show starten und die Kamera des Spielers sollte auf den Filmsequenzmodus gesetzt werden. Wenn die Show endet, sollte der Spieler aus dem Stuhl hinausgeworfen werden.
Umschalten der Kameras
Während der Show kann der in TheChair sitzende Spieler zwischen mehreren verschiedenen Kameraansichten umschalten, die von den verschiedenen Filmsequenzen verarbeitet werden. Befolge die folgenden Schritte, um die Logik für das Umschalten zwischen den verschiedenen Sequenzen einzurichten.
Füge eine neue Funktion
DoCameraSwitch()zur Klasseshow_template_devicehinzu. Diese Funktion nimmt den Agent, dessen Kamera du umschaltest, sowie einenintentgegen, der dem Filmsequenzindex inCameraSwitchesentspricht.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 =Wenn du dich in
DoCameraSwitch()in einerif-Anweisung befindest, soll die Filmsequenz an dem Werteindex imCameraSwitches-Array abgerufen werden. Dann soll die Wiedergabe aller laufenden Sequenzen gestoppt werden, indem geprüft wird, obCurrentSequenceeine Filmsequenz enthält und dannStop()auf ihr aufgerufen wird.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)Starte die Wiedergabe einer neuen Filmsequenz, indem du
Play()aufCameraSwitchaufrufst. Lege dannCurrentSequenceso fest, dass es angibt, welche Sequenz derzeit wiedergegeben wird. Führe zum SchlussRegister()auf denagentaus, dessen Kamera du mit den Input-TriggernReturnToTVModeundReturnToFreeLookumschaltest, damit sie zu diesen Modi zurückkehren können, wenn andere Kameras angezeigt werden. Deine fertige FunktionDoCameraSwitch()sollte wie folgt aussehen: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.Um zwischen der nächsten und vorherigen Kamera umzuschalten, richtest du zwei ganz ähnliche Funktionen ein,
DoNextCamera()undDoPreviousCamera(). Du füllst zuerst die Logik für die nächste Kamera aus. Füge als eine neue FunktionDoNextCamera()zur Klasseshow_template_devicehinzu. Diese Funktion nimmt denagent, dessen Kamera du umschaltest.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")Prüfe in
DoNextCamera(), ob sich der Spieler aktuell im TV-Modus befindet. Ist dies der Fall, wendeStop()aufTVModeSequencean, setzeInTVModeauf False und setzeCurrentCameraIndexauf-1. Du verwendest hier-1, weil du den Index in der nächsten Filmsequenz desCameraSwitches-Array nutzen willst, was der Index0wäre.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 = -1Dann musst du basierend auf dem Index der aktuellen Kamera herausfinden, welches die nächste Kamera ist, zu der gewechselt werden soll. Dazu setzt du die neue Variable
NextCameraValueauf denModvonCurrentCameraIndex + 1undCameraSwitches.Length. Damit kannst duNextCameraValuean einen Wert anhängen, der zwischen0und der Länge vonCameraSwitchesliegt und verhindern, dass du einenNextCameraValueabrufst, der außerhalb desCameraSwitches-Arrays liegt. Sobald duNextCameraValuehast, setzeCurrentCameraValueaufNextCameraValueund rufeDoCameraSwitch()auf, wobei du denagentundCurrentCameraIndexübergibst. Deine fertige FunktionDoNextCamera()sollte wie folgt aussehen: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 = -1Um zur vorherigen Kamera umzuschalten, fügst du die neue Funktion
DoPreviousCamera()zur Klasseshow_template_devicehinzu. Kopiere den Code vonDoNextCamera()in diese Funktion. Wenn du prüfst, ob sich der Spieler im TV-Modus befindet, setzeCurrentCameraIndexauf0statt auf-1. Ändere außerdemNextCameraValuezumModvonCurrentCameraIndex – 1undCameraSwitches.Length. Deine fertige FunktionDoPreviousCamera()sollte wie folgt aussehen: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
Wenn ein Spieler in TheChair sitzt und die Show über eine andere Kamera in CameraSwitches ansieht, kann er zum TV-Modus oder zu „Frei umschauen“ zurückkehren. Du hast die Funktionen DoReturnToFreeLook() und DoReturnToTVMode() bereits zuvor eingerichtet und füllst sie jetzt aus.
Prüfe in der Funktion
DoReturnToFreeLook(), ob sich der Spieler aktuell im TV-Modus befindet. Ist dies der Fall, wendeStop()aufTVModeSequencean und setzeInTVModeauf False. Mache das Gleiche mitCurrentSequenceund prüfe, obCurrentSequenceeine Filmsequenz enthält. RufeStop()auf und setze es auf False, wenn dies der Fall ist.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 = falseRegistriere jetzt den
Agentmit dem Input-TriggerReturnToTVModeund führeUnregister()auf sie mit dem TriggerReturnToFreeLookaus, da du keinen Spieler zum freien Umschauen zurückführen möchtest, wenn er sich bereits dort befindet. Deine fertige FunktionDoReturnToFreeLook()sollte wie folgt aussehen: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.Die Funktion
DoReturnToTVMode()erfordert mehr Logik, da duTVModeSequencezum aktuellen Zeitpunkt derMainSequencestarten musst, wenn du zum TV-Modus zurückkehrst. Prüfe zuerst, ob sich der Spieler bereits im TV-Modus befindet, wenn diese Funktion aufgerufen wird. Ist dies der Fall, führe einfachreturnaus, da du nichts machen musst. Prüfe dann, obCurrentSequenceeine Filmsequenz enthält. RufeStop()auf und setze es aufFalse, wenn dies der Fall ist.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 = falseNun musst du herausfinden, wo sich
MainSequencebei der Wiedergabe befindet und an der gleichen StelleTVModeSequencestarten. Rufe die Wiedergabezeit vonMainSequenceab, indem duGetPlayBackTime()aufrufst, und speichere sie in der VariableCurrentSeekTime. Setze die Wiedergabezeit vonTVModeSequencemitSetPlaybackTime()aufCurrentSeekTimeund führePlay()für die Sequenz aus, wobei du den Agent übergibst. Setze dannInTVModeauftrue.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 = trueFühre schließlich
Unregister()auf den Agent über den Input-TriggerReturnToTVModeaus und führeRegister()für sie mit dem AuslöserReturnToFreeLookaus. Deine fertige FunktionDoReturnToTVMode()sollte wie folgt aussehen: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?):
Alles miteinander verknüpfen
Du hast in den bisherigen Teilen des Tutorials sehr viele Funktionen eingerichtet. Jetzt ist es an der Zeit, alle miteinander mit den verschiedenen Eingabeauslösern zu verbinden, die sie aufrufen.
Führe in
OnSeated()Register()für den Agent mit den Input-TriggernReturnToFreeLook,NextCameraundPreviousCameraaus, da dies die Trigger sind, auf die ein Spieler anfänglich Zugriff hat, wenn er sich zum ersten Mal auf den Stuhl setzt. Lege dannReturnToFreeLookSubscription,NextCameraSubscriptionundPreviousCameraSubscriptionfest, indem du jeden Input-Trigger mit seiner zugeordneten Funktion abonnierst. LegeReturnToTVModeSubscriptionundChairExitSubscriptionauf die gleiche Art fest.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)Füge eine neue Funktion
CancelSubscription()zur Klasseshow_template_devicehinzu, die einen optional abbrechbaren Wert nimmt. Prüfe inCancelSubscription(), obSubscriptioneinen Wert enthält. Falls zutreffend, führeCancel()aus. Deine fertige FunktionCancelSubscription()sollte wie folgt aussehen:Verse# Cancel a subscription if it is valid. CancelSubscription(Subscription:?cancelable):void = if (SubscriptionToCancel := Subscription?): SubscriptionToCancel.Cancel()Wenn ein Spieler den Stuhl verlässt, musst du alle aktuell laufenden Sequenzen für den Spieler stoppen sowie alle Abonnements für Eingabeauslöser abbrechen, die der Spieler registriert hatte. Prüfe für die Funktion
OnChairExited()wie inDoReturnToFreeLook(), ob sich der Spieler im TV-Modus befindet, sowie obCurrentSequenceeine Filmsequenz enthält. Rufe in diesem FallStop()auf jede Sequenz auf und setzeInTVModeauffalse, wenn sich der Spieler im TV-Modus befindet. Setze dannCurrentSequenceauffalse.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.Hebe nun alle Spielerabonnements auf, indem du jedes Abonnement an die Funktion
CancelSubscription()übergibst. Führe außerdemUnregister()für den Spieler für jeden Input-Trigger aus, da er nicht in der Lage sein sollte, diese Schaltflächen aufzurufen, wenn er den Stuhl verlassen hat. Deine fertige FunktionOnChairExited()sollte wie folgt aussehen: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.
Speichere das Script in Visual Studio Code, kompiliere es und klicke in der UEFN-Werkzeugleiste auf Sitzung starten, um einen Spieltest der Vorlage auszuführen. Wenn du einen Spieltest ausführst, sollte die Show starten, wenn du dich auf das Stuhlgerät setzt. Während der Show solltest du zwischen TV-Modus, freiem Umschauen und verschiedenen anderen Kamerawinkeln wechseln können. Bei der Rückkehr zum TV-Modus sollte die TV-Modussequenz mit der Hauptsequenz abgeglichen werden. Wenn die Show endet, solltest du zum freien Umsehen zurückgeführt werden und den Stuhl verlassen.