Este tutorial es un complemento para la plantilla de comedia en Verse, que demuestra cómo usar dispositivos para crear una experiencia social y cinemática dentro de un club de comedia.
Utiliza recursos detallados de animador de MetaHuman con los dispositivos de personajes
Activa eventos de jugabilidad con las asignaciones de entradas de jugadores con los dispositivos activadores de botón
Fija a un jugador para ver la experiencia con el dispositivo de silla
Un dispositivo de Verse se encarga de todo el espectáculo, con los conceptos clave del código de Verse detallados más adelante.
Puedes encontrar la plantilla de comedia en verse en la sección de ejemplos destacados de UEFN (Unreal Editor para Fortnite).
Dispositivos usados:
1 x Silla
4 x Personajes
Los conceptos de Verse que se utilizan en este tutorial son:
Suscripciones
Declaraciones If
Matrices
Secuencias cinemáticas
API de dispositivo de silla
API de dispositivo de activador de botón
Toma en cuenta que la mayor parte de los ajustes modificados se generan con código de Verse, por lo que las opciones de usuario modificadas para la mayoría de los dispositivos aparecerán de manera reducida.
ajustes de isla
Estos son los ajustes de isla modificados para la plantilla de comedia de Verse.
Opción | Value | Explicación |
---|---|---|
Máximo de jugadores | 1 | Esta es una experiencia de un solo jugador. |
Tamaño del equipo | 1 | Solo se necesita un equipo. |
Unión en curso | Observar | Los jugadores observarán si se unen a una partida que ya comenzó. |
Después de la última aparición ir a | Índice del equipo: 1 | Los jugadores reaparecerán en su equipo. |
Chat de voz | Todo | Se permite el chat de voz entre jugadores. |
Comenzar con pico | Falso | Los jugadores no comenzarán la partida con un pico. |
Permitir observar a otros equipos | No permitido | Los jugadores no podrán observar a otros equipos. |
Límite de tiempo | 120 | El límite de tiempo es de dos horas. |
Ocultar mochila retro | Verdadero | No se verán las mochilas retro en esta isla. |
Permitir trepar/saltar sobre obstáculos | Falso | Los jugadores no podrán trepar ni pasar sobre obstáculos. |
Costo de energía de esprint por segundo | 2.0 | El consumo de energía por esprintar. |
Invencibilidad | Verdadero | Los jugadores son invencibles. |
Permitir construir | Ninguno. | Los jugadores no pueden construir. |
Las construcciones pueden destruir el entorno | Falso | Las construcciones no pueden destruir el entorno. |
Daño al entorno | Desactivado | Los jugadores no pueden dañar el entorno. |
Materiales de construcción infinitos | Falso | No se puede construir en esta experiencia. |
Hora del día | 12:00 a. m. | Ajuste de noche. |
Brillo | 0 | Todas las fuentes de luz de esta experiencia provienen de lámparas. |
Espesor de la niebla | 30 % | El ambiente tiene una ligera niebla. |
Color de la niebla | Azul | Determina el color de la niebla. |
Declaración de victoria personalizada | Gracias por venir a The Cheese Cannery | Lo que ven los jugadores al final de la partida. |
Mostrar noticias de eliminaciones | Falso | No se muestran las eliminaciones. |
Mostrar contador de recursos de madera/piedra/metal | Falso | No se muestran los recursos. |
Mostrar eliminaciones del grupo | Falso | No se muestran las eliminaciones del grupo. |
Depurar | Verdadero | Las funciones de depuración están habilitadas. |
Modo de iteración rápida | Verdadero | Se habilita la opción de iteración rápida entre el modo de edición y de juego. |
Dispositivo de silla
Cuando el jugador entre caminando al club de comedia, verá una silla en un escenario iluminado. Se le indicará que se siente en la silla. Sentarse en la silla fija al jugador en un punto y comienza con la cadena de eventos que lo llevará por el resto de la experiencia.
Estas son las opciones de usuario modificadas para el dispositivo de silla:
Opción | Value | Explicación |
---|---|---|
Modelo de silla | Personalizar | Para esta experiencia, la silla se hace invisible y se sustituye con una utilería de silla de Fortnite para que luzca mejor en el entorno del club. |
Ángulo de interacción | 180 grados | Determina el ángulo en cualquier dirección en frente de la silla en el que el jugador debe estar para interactuar con ella. |
Radio de interacción | 1.2 m | Determina la distancia a la que el jugador puede entrar a la silla. |
Dispositivos de activador de botón
El dispositivo de activador de botón va de la mano con el dispositivo de silla. Su función es vincular las entradas del jugador a ciertas acciones, que se activan cada vez que el jugador presiona el botón reasignado. Los activadores de entrada se configuran para que el jugador pueda cambiar su vista de cámara mientras se desarrolla el show.
El dispositivo contiene doce entradas disponibles para elegir. Una vez que elijas una entrada, puedes añadir una descripción de HUD para aclarar qué hace la nueva entrada.
Estas son las opciones de usuario modificadas para este dispositivo. Cada uno de los dispositivos tendrá una asignación y descripción de HUD distintas porque se vinculan a diferentes dispositivos de secuencia cinemática.
Opción | Value | Explicación |
---|---|---|
Entrada del modo Creativo | Personalizada 5 (esprintar) | Define la entrada que escucha este dispositivo. |
Descripción en HUD | "Cámara anterior" | La oportunidad de explicar la nueva entrada al jugador. |
Comportamiento de jugadores registrados | Registro necesario |
|
Dispositivos de personaje
Los dispositivos de personaje representan una manera de interactuar directamente con el jugador o con otros personajes en una escena. Esta plantilla utiliza cuatro personajes que se alternan en la rutina del escenario.
Estas son las opciones de usuario modificadas para el dispositivo de personaje:
Opción | Value | Explicación |
---|---|---|
Personaje | Elige un personaje | Determina qué personaje se muestra. |
Posición de inactividad personalizada | Sentado | Elige una posición de inactividad personalizada para el personaje. |
Inicio de inactividad aleatorio | Verdadero | Determina si la posición de inactividad empieza en una posición aleatoria. |
El personaje principal se sienta en una escalera tras bambalinas, mientras que el resto de los personajes esperan en una pequeña habitación en la parte de atrás.
¡Experimenta con distintos atuendos de personajes en el menú desplegable Personaje y mira cómo lucen en el escenario!
Esta plantilla utiliza animaciones de MetaHuman importadas. Para saber más sobre cómo fueron capturadas e importadas dichas animaciones, consulta la página Cómo importar animaciones de MetaHuman.
Dispositivos de Secuencia cinemática
Los seis dispositivos de secuencia cinemática permiten que el jugador pueda ver el show desde distintos ángulos mientras se sienta en el dispositivo de silla.
Esta página no proporciona más detalles sobre la creación de secuencias cinemáticas. Para conocer más al respecto, consulta la página Sequencer y rigs de control. Si quieres todavía más detalles, consulta la página de uso de Sequencer (en inglés).
La única modificación para este dispositivo es la secuencia cinemática cargada.
Cómo Verse se encarga del espectáculo
Esta plantilla utiliza Verse para comenzar el show cuando un jugador se sienta en el dispositivo de silla y también cambia su cámara a una vista cinemática llamada modo TV. También permite que el jugador cambie entre distintas cámaras, además de poder volver al modo TV o vista libre para tener diferentes experiencias de vista.
Crea un dispositivo de Verse nuevo llamado show_template_device.verse
en tu proyecto con el explorador de Verse y arrastra el dispositivo a la plantilla. Haz doble clic en tu archivo de Verse para abrirlo en Visual Studio Code.
Ya estableciste dispositivos en tu plantilla que te permiten ejecutar el show y ahora tendrás que hacer referencia a ellos en tu código.
Añade los siguientes campos al archivo show_template_device
:
Primero, arriba de la definición de clase
show_template_device
, añade unlog_channel
llamadolog_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):
Ahora, en la parte superior de la definición de clase de
show_template_device
, añade un logger que use el canallog_show_template_device
. De esta manera, podrás saber cuáles son las declaracionesPrint()
provenientes de este dispositivo.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 dispositivo de silla editable llamado
TheChair
. Esta es la silla en la que se sentarán los jugadores para comenzar el show de comedia.Verse# The chair device the player should sit in. @editable TheChair:chair_device = chair_device{}
Dos dispositivos de Secuencia cinemática editables llamados
MainSequence
yTVModeSequence
.MainSequence
es la secuencia cinemática que ejecuta el show de comedia y que controla la animación y audio en el dispositivo de personaje en el nivel.TVModeSequence
cambia la cámara del jugador a un modo de vista que siga aMainSequence
, alternando entre distintos ángulos.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{}
Una matriz editable de
cinematic_sequence_device
llamadaCameraSwitches
. Esta matriz contiene referencias a cada una de las cámaras que los jugadores pueden ir eligiendo durante el show.Verse# A list of alternative camera sequences that are provided to view from during the main sequence. @editable CameraSwitches:[]cinematic_sequence_device = array{}
Cuatro
input_trigger_device
editables. Cada uno de estos dispositivos toma la entrada del jugador para alternar entre modos de cámara. El activadorReturnToFreeLook
devuelve al jugador a la cámara predeterminada, mientras queReturnToTVMode
devuelve al jugador aTVModeSequence
. Las cámarasNextCamera
yPreviousMode
hacen que el jugador vaya cambiando entre las distintas secuencias cinemáticas en la matrizCameraSwitches
.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. @editable
Una variable de dispositivo opcional de secuencia cinemática llamada
CurrentSequence
. Si se está reproduciendo una secuencia cinemática comoTVModeSequence
, esta opción almacena una referencia a ella. Si no quieres reproducir varias secuencias cinemáticas para el personaje a la vez, puedes utilizar esta opción para desactivar la secuencia actual cuando cambies a una nueva.Verse# The alternative camera sequence that is playing if valid. var CurrentSequence:?cinematic_sequence_device = false
Dos variables lógicas llamadas
MainSequencePlaying
yInTvMode
. Te permiten rastrear cuando se reproducenMainSequence
oTVModeSequence
respectivamente.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 = false
Una variable int llamada
CurrentCameraIndex
. Esto da seguimiento a la secuencia cinemática de la matrizCameraSwitches
que se está reproduciendo actualmente.Verse# Keeps track of what camera we are viewing when using other cameras besides TV Mode. var CurrentCameraIndex:int = -1
Cinco variables
cancelable
opcionales que rastrean las suscripciones para todos los eventos referenciados en esta plantilla. Se deben ejecutar distintas funciones cuando el jugador alterne entre cámaras, necesite volver a vista libre o modo TV o cuando salga del dispositivo de silla. En una parte posterior de este tutorial, tendrás que suscribir estas funciones a los eventos que las activan y almacenar una referencia a cada suscripción para que puedas cancelarlas cuando ya no las necesites.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 = false
Guarda la secuencia de comandos en Visual Studio Code y compílala para actualizar tu dispositivo creado con Verse en el nivel.
Elige el
show_template_device
en tu plantilla. En el panel de detalles, asigna cada referencia de dispositivo en tu secuencia de comandos al dispositivo asociado en el nivel, incluyendo a cada uno de tus activadores de entrada y secuencias cinemáticas.
Activación de la secuencia
El show comienza cuando un jugador se sienta en un dispositivo de silla. Es preferible que la secuencia cinemática comience cuando el jugador se haya sentado. Sigue los pasos a continuación para activar la secuencia principal cuando un jugador se siente en la silla, además de activar el modo TV para que el jugador también pueda ver.
Añade una función
RunSequence()
nueva a la claseshow_template_device
. Esta función toma al agente que inició el show e inicia tanto a MainSequence como aTVModeSequence
. Añade el modificadora RunSequence()
para que se ejecute de forma asíncrona. Esta función debe ser asíncrona para que puedes ejecutar más código de forma concurrente junto con ella, al mismo tiempo que permites que el jugador cambie de vistas de cámara sin interrumpir el códigoRunSequence()
.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 =
En
RunSequence()
, llama aSleep()
por un segundo para permitir que la animación del jugador que se sienta en la silla termine antes de comenzar el show. Luego llama aPlay()
en laMainSequence
y estableceMainSequencePlaying
en verdadero.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()
Llama a
Play()
en laTVModeSequence
, pasando al agente que comenzó el show para cambiar su cámara a la vista cinemática. EstableceInTVMode
en verdadero y llama a una nueva función que espere el final de laMainSequence
y que se llameAwaitMainSequenceEnding()
, que pase al agente. Configurarás esta función en el paso siguiente. Tu códigoRunSequence()
completo debería verse de la siguiente manera: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()
Añade una nueva función
AwaitMainSequecingEnding()
a la claseshow_template_device
para que tome alagent
deRunSequence()
. Esta función también necesita el modificador<suspends>
porque necesitarás ejecutarla en segundo plano y activarla cuando termine laMainSequence
.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 =
En
AwaitMainSequencingEnding()
, llama aAwait()
enMainSequence.StoppedEvent()
. Cuando termine laMainSequence
, estableceMainSequencePlaying
enfalse
y expulsa al jugador de la silla con la función de sillaEject()
. Tu funciónAwaitMainSequencingEnding()
completa debería verse de la siguiente manera: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)
Añade dos funciones nuevas,
`DoReturnToTVMode()
yDoReturnToFreeLook()
a la claseshow_template_device
. Estas funciones gestionan la lógica que ocurre cuando un jugador vuelve al modo TV o a la vista libre respectivamente, pero los dejaremos vacío por ahora y nos encargaremos de llenarlos más adelante.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")
Añade una nueva función
OnSeated()
a la claseshow_template_device
, que tome el agente que se sentó enTheChair
.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")
En
OnSeated()
, si laMainSequence
no se está reproduciendo ya, genera una funciónRunSequence()
, pasando al agente que se sentó en el dispositivo de silla. De lo contrario, se debe llamar aDoReturnToTVMode()
con el mismo agente.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)
Añade una nueva función
OnChairExited()
a la claseshow_template_device
que toma al jugador que salió de la silla. Tendrás que llenar la lógica para esta función en un paso posterior.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")
En
OnBegin()
, suscribeTheChair.SeatedEvent
a la funciónOnSeated()
. Ahora, cuando un jugador se siente enTheChair
, se presentará el show.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)
Guarda la secuencia de comandos en Visual Studio Code, compílala y haz clic en Comenzar sesión en la barra de herramientas de UEFN para probar la plantilla. Cuando ejecutes tu juego, sentarse en la silla debería comenzar con el show y establecer la cámara del jugador al modo cinemático. Cuando el show termine, el jugador debería ser expulsado de la silla.
Cambio de cámaras
En el show, el jugador que se siente en TheChair
puede alternar entre distintas vistas de cámara, que se gestionan con distintas secuencias cinemáticas. Sigue los pasos a continuación para establecer la lógica para cambiar entre las distintas secuencias.
Añade una nueva función
DoCameraSwitch()
a la claseshow_template_device
. Esta función toma al agente cuya cámara estás cambiando, así como unint
correspondiente al índice de secuencia cinemática enCameraSwitches
.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 =
En
DoCameraSwitch()
, en una declaraciónif
, obtén la secuencia cinemática del valor del índice en la matrizCameraSwitches
. Luego, detén cualquier secuencia que se esté reproduciendo al comprobar siCurrentSequence
contiene una secuencia cinemática, para después llamar aStop()
.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)
Empieza a reproducir la nueva secuencia cinemática al llamar
Play()
enCameraSwitch
. Luego, estableceCurrentSequence
para saber cuál es la secuencia que se está reproduciendo actualmente. Finalmente, ejecutaRegister()
alagent
cuya cámara estás cambiando con los activadores de entradaReturnToTVMode
yReturnToFreeLook
, para permitirles volver a esos modos cuando esté viendo otras cámaras. Tu funciónDoCameraSwitch()
completa debería verse de la siguiente manera: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.
Para alternar entre las cámaras anteriores y siguientes, tendrás que establecer dos funciones muy similares:
DoNextCamera()
yDoPreviousCamera()
. Completarás la lógica para la cámara 'siguiente' primero, así que añade una nueva funciónDoNextCamera()
a la claseshow_template_device
. Esta función toma alagent
cuya cámara estás cambiando.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")
En
DoNextCamera()
, comprueba si el jugador se encuentra en modo TV. Si es así, ejecutaStop()
enTVModeSequence
, estableceInTVMode
en falso y estableceCurrentCameraIndex
en-1
. Aquí utilizas-1
porque queremos pasar al índice de la siguiente secuencia cinemática de la matrizCameraSwitches
, que tendría el índice0
.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 = -1
Entonces, necesitas conocer la siguiente cámara la que debes cambiar según el índice de la cámara actual. Para hacerlo, establece una nueva variable
NextCameraValue
para elMod
deCurrentCameraIndex + 1
yCameraSwitches.Length
. Esto te permite establecerNextCameraValue
en un valor entre0
y la longitud deCameraSwitches
e impide que obtengas unNextCameraValue
que se salga de la matrizCameraSwitches
. Una vez que tengasNextCameraValue
, estableceCurrentCameraValue
aNextCameraValue
y llamaDoCameraSwitch()
, pasando elagent
y elCurrentCameraIndex
. Tu funciónDoNextCamera()
completa debería verse de la siguiente manera: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 = -1
Para cambiar a la cámara anterior, añade una nueva función
DoPreviousCamera()
a la claseshow_template_device
. Copia el código deDoNextCamera()
a esta función. Al comprobar si el jugador está en modo TV, estableceCurrentCameraIndex
en0
en vez de-1
. Además, cambiaNextCameraValue
para que sea elMod
deCurrentCameraIndex - 1
yCameraSwitches.Length
. Tu funciónDoPreviousCamera()
completa debería verse de la siguiente manera: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
Cuando un jugador está sentado en TheChair
y está viendo desde una cámara distinta en CameraSwitches
, pueden volver a modo TV o a vista libre. Ya estableciste las funciones DoReturnToFreeLook()
y DoReturnToTVMode()
, ahora hay que llenarlas.
En la función
DoReturnToFreeLook()
, comprueba si el jugador se encuentra en modo TV. Si es así, ejecutaStop()
enTVModeSequence
y estableceInTVMode
en falso. Haz lo mismo conCurrentSequence
, comprueba siCurrentSequence
contiene una secuencia cinemática, llama aStop()
y establécela en falso de ser así.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
Ahora, ejecuta
Register()
en el agente con el activador de entradaReturnToTVMode
y ejecutaUnregister()
con el activador de entradaReturnToFreeLook
, puesto que no queremos devolver a un jugador a la vista libre si ya se encuentra ahí. Tu funciónDoReturnToFreeLook()
completa debería verse de la siguiente manera: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 función
DoReturnToTVMode()
necesita más lógica, puesto que, al volver al modo TV, necesitas comenzar laTVModeSequence
en el tiempo actual deMainSequence
. Primero, comprueba si el jugador ya se encuentra en modo TV cuando se llama esta función. De ser así, solo ejecutareturn
, puesto que no hay nada más por hacer. Luego, comprueba siCurrentSequence
contiene una secuencia cinemática, llama aStop()
y establécela enfalse
de ser así.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 = false
Ahora debes averiguar en qué punto de reproducción se encuentra la
MainSequence
y comenzarTVModeSequence
desde el mismo lugar. Obtén el tiempo de reproducciónMainSequence
mediante el llamado deGetPlayBackTime()
y guárdalo en una variable llamadaCurrentSeekTime
. Establece el tiempo de reproducción deTVModeSequence
aCurrentSeekTime
medianteSetPlaybackTime()
y ejecutaPlay()
en la secuencia, pasando al agente. Luego, estableceInTVMode
entrue
.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 = true
Finalmente, ejecuta
Unregister()
en el agente del activador de entradaReturnToTVMode
y ejecutaRegister()
al activador de entradaReturnToFreeLook
. Tu funciónDoReturnToTVMode()
completa debería verse de la siguiente manera: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?):
Hora de unir todo
Estableciste muchas funciones en la parte anterior de este tutorial. Ahora, tienes que vincularlas todas a los distintos activadores de entrada que las llaman.
En
OnSeated()
, ejecutaRegister()
en el agente con los activadores de entradaReturnToFreeLook
,NextCamera
yPreviousCamera
, puesto que estos son los activadores a los que el jugador tendrá acceso inicialmente cuando se siente en la silla. Luego, estableceReturnToFreeLookSubscription
,NextCameraSubscription
yPreviousCameraSubscription
al suscribir cada activador de entrada a su función asociada. EstableceReturnToTVModeSubscription
yChairExitSubscription
de la misma manera.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)
Añade una nueva función
CancelSubscription()
que recibe un valor opcional cancelable a la claseshow_template_device
. EnCancelSubscription()
, comprobar si laSubscription
contiene un valor. De ser así, ejecutaCancel()
. Tu funciónCancelSubscription()
completa debería verse de la siguiente manera:Verse# Cancel a subscription if it is valid. CancelSubscription(Subscription:?cancelable):void = if (SubscriptionToCancel := Subscription?): SubscriptionToCancel.Cancel()
Cuando un jugador sale de la silla, debes detener cualquier secuencia que se esté reproduciendo y cancelar todas las suscripciones a activadores de entrada a las que se había registrado el jugador. En la función
OnChairExited()
, como enDoReturnToFreeLook()
, comprueba si el jugador está en el modo TV y también siCurrentSequence
contiene una secuencia cinemática. Llama aStop()
para cada secuencia de ser así y estableceInTVMode
enfalse
si el jugador está en modo TV. Luego, estableceCurrentSequence
enfalse
.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.
Ahora, cancela todas las suscripciones del jugador al pasar cada suscripción por la función
CancelSubscription()
. También ejecutaUnregister()
al jugador para cada activador de entrada, puesto que no debería poder acceder a esos botones si sale de la silla. Tu funciónOnChairExited()
completa debería verse de la siguiente manera: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.
Guarda la secuencia de comandos en Visual Studio Code, compílala y haz clic en Comenzar sesión en la barra de herramientas de UEFN para probar la plantilla. Cuando hagas una prueba de juego, sentarte en la silla debería comenzar con el show. En el show, deberías poder alternar entre el modo TV, la vista libre y varios ángulos de cámara. Volver al modo TV debería alinear la secuencia de modo TV con la secuencia principal. Cuando el show termine, deberías volver al modo de vista libre y salir de la silla.