Ce tutoriel accompagne le modèle Verse de stand-up, qui explique comment utiliser les appareils permettant de créer une expérience cinématique et de réseaux sociaux au sein d'un comedy club :
Comment utiliser des ressources détaillées de MetaHuman Animator à l'aide des appareils de personnage
Comment déclencher des événements de jeu lorsqu'un joueur appuie sur une commande à l'aide d'appareils Déclencheur de commande
Comment asseoir un joueur de manière à lui faire vivre l'expérience à l'aide de l'appareil Siège
Un appareil Verse gère le spectacle, et les principaux concepts du code Verse sont expliqués ci-dessous.
Le modèle Verse de stand-up se trouve dans la section Exemples de fonctionnalités de l'UEFN (Unreal Editor pour Fortnite).
Appareils utilisés :
Voici les concepts Verse utilisés dans ce tutoriel :
Abonnements
Instructions If
Matrices
Séquences cinématiques
API d'appareil Siège
API de déclencheur de commande
La plupart des paramètres modifiés pour les interactions avec les appareils utilisant le code Verse, c'est une version simplifiée des options utilisateur modifiées qui apparaîtra pour la plupart des appareils.
Paramètres de l'île
Voici les paramètres de l'île modifiés pour le modèle Verse Stand-Up :
| Option | Value | Explication |
|---|---|---|
Nombre max de joueurs | 1 | Il s'agit d'une expérience pour un seul joueur. |
Taille d'équipe | 1 | Seule une équipe est nécessaire. |
Rejoindre un jeu en cours | Spectateur | Les joueurs qui rejoignent un jeu qui a déjà commencé le feront en tant que spectateurs. |
Destination après dernière apparition | Index d'équipe : 1 | Les joueurs réapparaîtront dans leur équipe. |
Discussion vocale | Toutes | La discussion vocale entre joueurs est autorisée. |
Commencer avec une pioche | False | Les joueurs ne commencent pas le jeu avec une pioche. |
Observer les autres équipes en spectateur | Interdit | Les joueurs ne peuvent pas observer une autre équipe en spectateurs. |
Limite de temps | 120 | La limite de temps est fixée à deux heures. |
Masquer l'accessoire de dos | True | L'accessoire de dos n'apparaît pas sur cette île. |
Permettre l'escalade/l'enjambement | False | Les joueurs ne peuvent pas enjamber ni escalader. |
Énergie dépensée par seconde en sprintant | 2,0 | Le coût d'énergie occasionné par le sprint. |
Invincibilité | True | Les joueurs sont invincibles. |
Permettre la construction | Aucun | Les joueurs ne peuvent pas construire. |
Construire détruit le décor | False | Construire ne peut pas détruire le décor. |
Dégâts sur le décor | Désactivé | Les joueurs ne peuvent pas infliger de dégâts au décor. |
Matériaux de construction infinis | False | La construction est désactivée dans cette expérience. |
Moment de la journée | 00h00 | Contexte nocturne. |
Luminosité | 0 | Toutes les sources de lumière de cette expérience proviennent de lampes. |
Épaisseur de la brume | 30% | Le décor est légèrement brumeux. |
Couleur de la brume | Bleu | Détermine la couleur de la brume. |
Message de victoire personnalisé | Thank you for coming to The Cheese Cannery | Ce que voient les joueurs à la fin du jeu. |
Journal des éliminations | False | Les éliminations ne s'affichent pas. |
Affichage de la quantité de ressources en bois/pierre/métal | False | Les ressources ne s'affichent pas. |
Afficher les éliminations du groupe | False | Les éliminations du groupe ne s'affichent pas. |
Débogage | True | Les fonctionnalités de débogage sont activées. |
Mode itération rapide | True | L'itération rapide entre les modes jeu et modification est activée. |
Siège
Au moment où le joueur entre dans le comedy club, il voit un siège qui fait face à une scène éclairée. Il est invité à s'asseoir sur ce siège. L'installation sur le siège maintient le joueur en place et déclenche une série d'événements qui lui fera vivre le reste de l'expérience.
Les options utilisateur modifiées de l'appareil Siège sont les suivantes :
| Option | Value | Explication |
|---|---|---|
Modèle de siège | Personnalisée | Pour cette expérience, le siège est en fait rendu invisible, puis remplacé par un accessoire de siège Fortnite qui convient mieux au décor. |
Angle d'interaction | 180 degrés | Détermine la direction dans laquelle vous devez vous trouver par rapport à l'avant du siège pour pouvoir interagir avec lui. |
Rayon d'interaction | 1.2 m | Définit la distance à laquelle un joueur peut s'asseoir sur le siège. |
Appareils Déclencheur de commande
Le déclencheur de commande est le compagnon inséparable de l'appareil Siège. Il lie les entrées du joueur à diverses actions déclenchées chaque fois que le joueur appuie sur le bouton associé. Les déclencheurs d'entrée sont configurés pour autoriser le joueur à changer les caméras au fur et à mesure que le spectacle se déroule.
L'appareil propose douze entrées à sélectionner. Une fois une entrée choisie, vous pouvez ajouter une description d'ATH afin d'expliquer son effet.
Les options utilisateur modifiées de cet appareil sont les suivantes. Chaque appareil possède une liaison et une description d'ATH différentes dans la mesure où il est lié à un appareil de séquence cinématique distinct.
| Option | Value | Explication |
|---|---|---|
Commandes du mode Créatif | Personnalisée 5 (sprinter) | Définit la commande que cet appareil écoute. |
Description dans l'ATH | « Caméra précédente » | Une occasion d'expliquer la nouvelle commande au joueur. |
Comportement des joueurs enregistrés | Enregistrement nécessaire |
|
Appareils de personnage
Les appareils de personnage vous permettent d'interagir directement avec le joueur ou avec les autres personnages d'une scène. Ce modèle utilise quatre personnages qui alternent au cours du programme scénique.
Les options utilisateur modifiées de l'appareil de personnage sont les suivantes :
| Option | Value | Explication |
|---|---|---|
Personnage | Choisir un personnage | Définit le modèle affiché par ce personnage. |
Inactivité personnalisée | En étant assis | Définit une position d'inactivité personnalisée pour le personnage. |
Début d'inactivité aléatoire | True | Définit si l'animation d'inactivité doit commencer dans une position aléatoire. |
Le personnage principal est assis sur un escalier en coulisse, et les autres personnages attendent dans une petite pièce, au fond.
Essayez différentes tenues de personnage dans le menu déroulant Personnage, pour voir ce qu'elles donnent sur scène.
Ce modèle utilise des animations MetaHuman importées. Pour en savoir plus sur le mode de capture et d'importation de ces animations, consultez la page Importer des animations MetaHuman.
Appareils de séquence cinématique
Les six appareils de séquence cinématique permettent au joueur de regarder le spectacle de divers points de vue tout en restant assis sur l'appareil Siège.
Cette page n'explique pas en détail comment créer des séquences cinématiques. Pour en savoir plus, rendez-vous sur la page Sequencer et Control Rig, et pour une compréhension approfondie, consultez le document Comment créer des films dans l'Unreal Engine.
La seule modification concernée par cet appareil est la séquence cinématique chargée.
Comment Verse gère le spectacle
Ce modèle utilise Verse pour lancer le spectacle lorsque le joueur s'assied sur l'appareil Siège, ainsi que pour faire passer la caméra en mode TV, un type de vue cinématique. Il permet aussi au joueur de passer d'une caméra à une autre et de repasser en mode TV ou en vue libre pour changer de point de vue.
Créez un nouvel appareil Verse dans votre projet appelé show_template_device.verse à l'aide de l'explorateur Verse et faites glisser l'appareil dans le modèle. Double-cliquez sur votre fichier Verse pour l'ouvrir dans Visual Studio Code.
Dans votre modèle, vous avez configuré des appareils qui participent au fonctionnement de votre spectacle et vous allez maintenant les référencer dans votre code.
Ajoutez les champs suivants au fichier show_template_device :
D'abord, au-dessus de la définition de la classe
show_template_device, ajoutez unlog_channelnommélog_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):À présent, en haut de la définition de la classe
show_template_device, ajoutez un enregistreur qui utilise le canallog_show_template_device, afin de savoir quelles instructionsPrint()proviennent de cet appareil.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}Un appareil de chaise modifiable nommé
TheChair. Il s'agit du siège dans lequel s'assied le joueur pour lancer le spectacle.Verse# The chair device the player should sit in. @editable TheChair:chair_device = chair_device{}Deux appareils de séquence cinématique modifiables nommés
MainSequenceetTVModeSequence.MainSequenceest la séquence cinématique qui gère le spectacle par pilotage de l'animation et de l'audio de l'appareil de personnage du niveau. AvecTVModeSequence, la caméra du joueur adopte un mode de vue conforme àMainSequence, qui permet d'alterner entre plusieurs angles.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{}Une matrice modifiable de
cinematic_sequence_devicenomméeCameraSwitches. Cette matrice détient des références à chacune des caméras auxquelles les joueurs peuvent passer pendant le spectacle.Verse# A list of alternative camera sequences that are provided to view from during the main sequence. @editable CameraSwitches:[]cinematic_sequence_device = array{}Quatre appareils
input_trigger_devicemodifiables. Chacun de ces appareils reçoit les entrées de joueur pour passer d'un mode de caméra à un autre. Le déclencheurReturnToFreeLookrenvoie le joueur à la caméra par défaut, tandis queReturnToTVModele renvoie auTVModeSequence. Les camérasNextCameraetPreviousModelui permettent de passer d'une séquence cinématique à une autre dans la matriceCameraSwitches.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. @editableUne variable facultative d'appareil de séquence cinématique nommée
CurrentSequence. Si une séquence cinématique commeTVModeSequenceest en cours de lecture, cette option en stocke une référence. Il n'est pas souhaitable de lire plusieurs séquences cinématiques à la fois pour le personnage, et vous pouvez donc utiliser cette option pour désactiver la séquence en cours lorsque vous passez à une nouvelle.Verse# The alternative camera sequence that is playing if valid. var CurrentSequence:?cinematic_sequence_device = falseDeux variables logiques nommées
MainSequencePlayingetInTvMode. Elles vous informent respectivement de la lecture deMainSequenceouTVModeSequence.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 = falseUne variable int nommée
CurrentCameraIndex. Elle suit l'index de la séquence cinématique dans la matriceCameraSwitchesen cours de lecture.Verse# Keeps track of what camera we are viewing when using other cameras besides TV Mode. var CurrentCameraIndex:int = -1Cinq variables
cancelable(annulables) facultatives qui suivent les abonnements pour tous les événements référencés dans ce modèle. Diverses fonctions doivent être exécutées lorsque le joueur passe d'une caméra à une autre, revient en vue libre ou en mode TV, ou quitte l'appareil Siège. Un peu plus loin dans ce tutoriel, vous allez abonner les fonctions aux événements qui les déclenchent et stocker une référence à chaque abonnement de manière à pouvoir l'annuler lorsqu'il n'est plus nécessaire.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 = falseEnregistrez le script dans Visual Studio Code et compilez-le pour mettre à jour votre appareil créé avec Verse dans le niveau.
Sélectionnez l'appareil
show_template_devicedans votre modèle. Dans le panneau Détails, attribuez chaque référence d'appareil de votre script à l'appareil associé dans le niveau, notamment chacun de vos déclencheurs de commande et chacune de vos séquences cinématiques.
Déclencher la séquence
Le spectacle commence par une séquence cinématique une fois le joueur assis sur l'appareil Siège. Suivez les étapes ci-dessous pour déclencher la séquence principale lorsqu'un joueur s'assied sur le siège et pour lancer le mode TV afin que le joueur puisse regarder.
Ajoutez une nouvelle fonction
RunSequence()à la classeshow_template_device. Cette fonction prend l'agent qui a démarré le spectacle et démarre à la fois MainSequence etTVModeSequence. Ajoutez le modificateur àRunSequence()pour une exécution asynchrone. Cette fonction doit être asynchrone pour que vous puissiez exécuter d'autres codes simultanément et permettre au joueur de passer d'un angle de vue à un autre sans interrompre le codeRunSequence().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 =Dans
RunSequence(), appelezSleep()pendant une seconde pour laisser s'achever l'animation du joueur s'asseyant sur le siège avant de lancer le spectacle. Appelez ensuitePlay()sur laMainSequenceet définissezMainSequencePlayingsur 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()Appelez
Play()surTVModeSequenceen faisant passer la caméra de l'agent qui a lancé le spectacle en vue cinématique. ActivezInTVModeet appelez une nouvelle fonction intituléeAwaitMainSequenceEnding()qui attend la fin de laMainSequenceen transmettant l'agent. Vous configurerez cette fonction à la prochaine étape. Votre codeRunSequence()doit ressembler à ce qui suit une fois terminé :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()Ajoutez une nouvelle fonction
AwaitMainSequecingEnding()à la classeshow_template_devicequi prend l'agentdepuisRunSequence(). Cette fonction a elle aussi besoin du modificateur<suspends>, car il est souhaitable qu'elle s'exécute en arrière-plan et se déclenche à la fin deMainSequence.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 =Dans
AwaitMainSequencingEnding(), appelezAwait()surMainSequence.StoppedEvent(). À la fin deMainSequence, désactivezMainSequencePlayingen le définissant surfalseet expulsez le joueur du siège à l'aide de la fonctionEject()du siège. Votre fonctionAwaitMainSequencingEnding()doit ressembler à ce qui suit une fois terminée :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)Ajoutez les nouvelles fonctions
DoReturnToTVMode()etDoReturnToFreeLook()à la classeshow_template_device. Ces fonctions gèrent la logique lorsqu'un joueur revient respectivement en mode TV ou en vue libre, mais laissez-les vides pour le moment ; vous les remplirez lors d'une prochaine étape.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")Ajoutez une nouvelle fonction
OnSeated()à la classeshow_template_devicequi prend l'agent qui s'est assis surTheChair.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")Dans
OnSeated(), si laMainSequencen'est pas déjà en cours de lecture, générez une fonctionRunSequence()en transmettant l'agent qui s'est assis sur l'appareil Siège. Sinon, appelezDoReturnToTVMode()avec le même agent.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)Ajoutez une nouvelle fonction
OnChairExited()à la classeshow_template_devicequi prend le joueur ayant quitté le siège. Vous remplirez la logique de cette fonction à une étape ultérieure.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")Dans
OnBegin(), abonnezTheChair.SeatedEventà la fonctionOnSeated(). Désormais, chaque fois qu'un joueur s'assied dansTheChair, le spectacle s'exécute.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)
Enregistrez le script dans Visual Studio Code, compilez-le, puis cliquez sur Lancer la session dans la barre d'outils de l'UEFN pour tester le modèle. Lorsque vous exécutez votre jeu, l'installation sur le siège doit lancer le spectacle et placer la caméra du joueur en mode cinématique. Une fois le spectacle terminé, le joueur doit être expulsé du siège.
Changer de caméra
Pendant le spectacle, le joueur assis sur TheChair peut passer de l'un à l'autre des divers points de vue, gérés par les différentes séquences cinématiques. Suivez les étapes ci-dessous pour configurer la logique de passage de l'une à l'autre de ces différentes séquences.
Ajoutez une nouvelle fonction
DoCameraSwitch()à la classeshow_template_device. Cette fonction prend l'agent dont vous adoptez la caméra, ainsi qu'unintcorrespondant à l'index de séquence cinématique dansCameraSwitches.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 =Dans
DoCameraSwitch(), dans une instructionif, obtenez la séquence cinématique à l'index Valeur de la matriceCameraSwitches. Arrêtez ensuite toute séquence de lecture en cours en vérifiant siCurrentSequencecontient une séquence cinématique et en appelantStop()dessus.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)Commencez à lire la nouvelle séquence cinématique en appelant
Play()surCameraSwitch. Définissez ensuiteCurrentSequencede manière à indiquer quelle séquence est en cours de lecture. Enfin, à l'aide deRegister, inscrivez l'agentdont vous adoptez la caméra auprès des déclencheurs de commandeReturnToTVModeetReturnToFreeLookpour leur permettre de revenir à ces modes lors du suivi d'autres caméras. Votre fonctionDoCameraSwitch()doit ressembler à ce qui suit une fois terminée :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.Pour passer à la caméra suivante ou à la caméra précédente, vous allez configurer
DoNextCamera()etDoPreviousCamera(), deux fonctions très semblables. Vous devez tout d'abord remplir la logique de la caméra suivante ; par conséquent, ajoutez une nouvelle fonctionDoNextCamera()à la classeshow_template_device. Cette fonction prend l'agentdont vous adoptez la caméra.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")Dans
DoNextCamera(), vérifiez si le joueur est actuellement en mode TV. Si c'est le cas, arrêtez laTVModeSequenceavecStop(), puis définissezInTVModesur false etCurrentCameraIndexsur-1.-1est utilisé ici parce qu'il est souhaitable d'indexer la matriceCameraSwitches, qui correspondrait à l'index0, dans la séquence cinématique suivante.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 = -1Vous devez ensuite déterminer la caméra suivante à utiliser en fonction de l'index de la caméra actuelle. Pour ce faire, ajoutez une nouvelle variable
NextCameraValueauModdeCurrentCameraIndex + 1etCameraSwitches.Length. Cela vous permet de fixerNextCameraValuesur une valeur comprise entre0et la longueur deCameraSwitcheset vous empêche d'obtenir uneNextCameraValuesituée hors de la matriceCameraSwitches. Une fois votreNextCameraValueobtenue, attribuezCurrentCameraValueàNextCameraValueet appelezDoCameraSwitch()en transmettant l'agentet leCurrentCameraIndex. Votre fonctionDoNextCamera()doit ressembler à ce qui suit une fois terminée :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 = -1Pour passer à la caméra précédente, ajoutez une nouvelle fonction nommée
DoPreviousCamera()à la classeshow_template_device. Copiez le code deDoNextCamera()dans cette fonction. Lorsque vous vérifiez si le joueur est en mode TV, définissezCurrentCameraIndexsur0au lieu de-1. Modifiez égalementNextCameraValuepour qu'elle corresponde auModdeCurrentCameraIndex - 1etCameraSwitches.Length.Votre fonctionDoPreviousCamera()doit ressembler à ce qui suit une fois terminée :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
Lorsqu'un joueur est assis dans TheChair et qu'il suit une autre caméra dans CameraSwitches, il peut revenir en mode TV ou en vue libre. Vous avez précédemment configuré les fonctions DoReturnToFreeLook() et DoReturnToTVMode() et devez à présent les remplir.
Dans la fonction
DoReturnToFreeLook(), vérifiez si le joueur est actuellement en mode TV. Si c'est le cas, arrêtez laTVModeSequenceavecStop()et désactivezInTVModeen le définissant sur false. Procédez de la même façon avecCurrentSequence, en vérifiant siCurrentSequencecontient une séquence cinématique et en appelantStop()et en la désactivant à l'aide de false si tel est le cas.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 = falseÀ présent, inscrivez l'agent auprès du déclencheur de commande
ReturnToTVModeà l'aide deRegister()et désinscrivez-le du déclencheurReturnToFreeLookà l'aide deUnregister(), puisque vous ne souhaitez pas faire revenir en vue libre un joueur qui s'y trouve déjà. Votre fonctionDoReturnToFreeLook()doit ressembler à ce qui suit une fois terminée :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.La fonction
DoReturnToTVMode()requiert davantage de logique, puisque le retour en mode TV nécessite le démarrage de laTVModeSequencelorsque laMainSequencese produit. D'abord, vérifiez si le joueur est déjà en mode TV lorsque cette fonction est appelée. Si tel est le cas, utilisezreturn, car il n'y a rien de particulier à faire. Vérifiez ensuite siCurrentSequencecontient une séquence cinématique, en appelantStop()et en la définissant surfalsesi tel est le cas.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 = falseVous devez maintenant déterminer à quel endroit de sa lecture se situe la
MainSequenceet démarrer laTVModeSequenceà partir de cet emplacement. Obtenez la durée de lecture deMainSequenceen appelantGetPlayBackTime()et enregistrez-la dans une variableCurrentSeekTime. Définissez la durée de lecture deTVModeSequencesurCurrentSeekTimeà l'aide deSetPlaybackTime(), et lisez la séquence à l'aide dePlay()en transmettant l'agent. Activez ensuiteInTVModeen le définissant surtrue.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 = trueEnfin, désinscrivez l'agent du déclencheur de commande
ReturnToTVModeà l'aide deUnregister()et inscrivez-le auprès du déclencheurReturnToFreeLookà l'aide deRegister(). Votre fonctionDoReturnToTVMode()doit ressembler à ce qui suit une fois terminée :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?):
Tout relier
Vous avez configuré beaucoup de fonctions dans la partie précédente de ce tutoriel et le moment est venu de les relier aux divers déclencheurs d'entrée qui les appellent.
Dans
OnSeated(), à l'aide deRegister(), inscrivez l'agent auprès des déclencheurs de commandeReturnToFreeLook,NextCamera, etPreviousCamera, puisqu'il s'agit des déclencheurs auxquels le joueur aura d'emblée accès lorsqu'il s'installera sur le siège. Définissez ensuiteReturnToFreeLookSubscription,NextCameraSubscriptionetPreviousCameraSubscriptionen abonnant chaque déclencheur de commande à sa fonction associée. DéfinissezReturnToTVModeSubscriptionetChairExitSubscriptionde la même manière.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)Ajoutez une nouvelle fonction
CancelSubscription()qui prend une valeur cancelable facultative à la classeshow_template_device. DansCancelSubscription(), assurez-vous queSubscriptioncontient une valeur. Si tel est le cas, annulez l'abonnement avecCancel(). Votre annulation d'abonnementCancelSubscription()doit ressembler à ce qui suit une fois terminée :Verse# Cancel a subscription if it is valid. CancelSubscription(Subscription:?cancelable):void = if (SubscriptionToCancel := Subscription?): SubscriptionToCancel.Cancel()Lorsqu'un joueur quitte le siège, vous devez arrêter toute séquence en cours de lecture sur le joueur et annuler tout abonnement aux déclencheurs d'entrée auquel le joueur était inscrit. À la fonction
OnChairExited(), comme dansDoReturnToFreeLook(), assurez-vous que le joueur est en mode TV et queCurrentSequencecontient une séquence cinématique. AppelezStop()sur chaque séquence si c'est le cas et désactivezInTVModeen le définissant surfalsesi le joueur se trouve en mode TV. Désactivez ensuiteCurrentSequenceen la définissant surfalse.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.À présent, annulez tous les abonnements du joueur en transmettant chacun d'eux à la fonction
CancelSubscription(). Désinscrivez également le joueur de chaque déclencheur de commande grâce àUnregister(), puisqu'il ne doit plus avoir accès à ces boutons lorsqu'il quitte le siège. Votre fonctionOnChairExited()doit ressembler à ce qui suit une fois terminée :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.
Enregistrez le script dans Visual Studio Code, compilez-le, puis cliquez sur Lancer la session dans la barre d'outils de l'UEFN pour tester le modèle. Au moment du test, le fait de s'asseoir sur le siège doit déclencher le spectacle. Pendant le spectacle, vous devez pouvoir alterner entre mode TV, vue libre et les autres angles de caméra. Repasser en mode TV doit aligner la séquence en mode TV sur la séquence principale. À la fin du spectacle, vous devez repasser en vue libre et quitter le siège.