Las cámaras desempeñan un papel fundamental en la experiencia de juego. Las cámaras en tercera persona pueden dar a los jugadores una mayor sensación de espacio, mientras que las cámaras en primera persona permiten ver más de cerca el mundo del juego. Al cambiar de cámara durante el juego, se pueden evocar sensaciones diferentes, y la transición entre varias cámaras puede añadir una variedad significativa a tu experiencia. Por ejemplo, podrías crear un divertido desafío de plataformas donde utilizas una cámara fija para crear una sección de desplazamiento lateral.
En UEFN, puedes utilizar Verse para controlar los cambios de cámara. Al utilizar dispositivos para escuchar eventos, puedes añadir una cámara a un reproductor para que cambie su vista cuando se active el evento. En este ejemplo, añadirás un dispositivo Cámara orbital a un jugador cuando acabe una cinemática. Puedes modificar los ajustes de una cámara orbital para simular una vista en primera persona. Además, al añadir la cámara al final de una cinemática puedes crear una transición suave de tercera a primera persona. Para aumentar la jugabilidad, en este ejemplo el jugador coge un arma y la golpea contra la puerta para activar la cinemática. Puedes adaptar este ejemplo a las necesidades de tu experiencia, como que un jugador mueva una llave inglesa para arreglar una puerta defectuosa de una nave o que mueva un martillo para aplastar una roca y revelar una zona secreta. También puedes aplicar estos conceptos de forma más amplia para crear momentos de juego interesantes, como un plano general al entrar en una nueva zona, cambiar a una vista cenital cuando el jugador tiene que resolver un puzle o una vista en primera persona en una experiencia de terror espeluznante.
Sigue este tutorial para aprender a crear un dispositivo Verse que haga pasar al jugador de tercera a primera persona mediante una secuencia cinemática cuando abra una puerta.
Este ejemplo utiliza las siguientes características del lenguaje:
Class: este ejemplo crea una clase de Verse que activa una cinemática cuando un jugador abre una puerta.
Option: puedes almacenar eventos a los que poder suscribirse en variables de opción y cancelar las suscripciones a esos eventos más tarde.
Este ejemplo utiliza las siguientes API:
Subscribable: te suscribirás a eventos para saber cuándo un jugador entra en un volumen junto a la puerta y concederás a los jugadores un objeto cuando interactúen con un botón.
Cómo configurar el nivel
Este ejemplo utiliza los siguientes dispositivos:
1 dispositivo Botón: cuando el jugador interactúe con el botón, recibirá una espada de un dispositivo repartidor de objetos.
1 dispositivo Repartidor de objetos: el repartidor de objetos concede al jugador la espada que necesita para avanzar por la puerta.
1 dispositivo Botón condicional: el arma requerida se establece como objeto clave del botón condicional para que el jugador no pueda avanzar por la puerta a menos que tenga la espada requerida.
1 dispositivo Activador de entrada: esto abrirá la puerta cuando el jugador ataca escuchando la acción de entrada de disparo. Esto solo ocurre cuando el jugador se encuentra dentro del dispositivo de volumen, si el jugador tiene la espada, y la puerta no está ya abierta.
1 dispositivo Volumen: puesto que no quieres que cualquier activador de ataque con la espada abra la puerta, el dispositivo de volumen se asegura de que el jugador tenga que estar justo al lado de la puerta para abrirla.
1 dispositivo Secuencia cinemática: para crear una transición fluida de tercera a primera persona, reproducirás una cinemática que muestra la puerta abriéndose y reposicionarás la cámara para que quede alineada con el punto de vista del jugador en primera persona.
1 dispositivo Cámara orbital: para crear una vista en primera persona para el jugador, utilizarás una cámara orbital posicionada dentro del pecho del personaje para imitar un punto de vista en primera persona. Este cambio de vista solo se produce después de la cinemática cuando el jugador abre la puerta.
1 dispositivo Bloqueo: esto mantiene la puerta bloqueada para impedir que el jugador la abra antes de que tenga el arma requerida.
1 dispositivo Indicador del mapa: esto muestra la ubicación de la puerta en el minimapa cuando el jugador recoge el arma.
Sigue estos pasos para configurar el nivel:
Repartidor de objetos y botón
Para otorgar al jugador el arma que necesita para abrir la puerta, utilizarás un repartidor de objetos y un dispositivo de botón. Cuando el jugador interactúa con el botón, el repartidor de objetos le otorga el arma. Sigue estos pasos para añadir estos elementos:
Añade un dispositivo Repartidor de objetos a tu nivel.
Selecciona el repartidor de objetos en el Esquematizador. En el panel Detalles, en Opciones de usuario, establece los siguientes valores:
Opción Valor Explicación Definición del elemento
Espada
Esta es el arma con la que el jugador abre la puerta.
Equipar el objeto otorgado
Verdadero
En este ejemplo, el jugador recoge y equipa enseguida el arma.
Añade un dispositivo Botón a tu nivel.
Selecciona el botón en el Esquematizador. En el panel Detalles, en Opciones de usuario, establece los siguientes valores:
Opción Valor Explicación Texto de interacción
"Recoger"
Este es el texto que pide al jugador que interactúe con el botón.
Veces que puede activarse
1
En este ejemplo, el jugador solo puede recoger el arma una vez.
Activador de entrada
Para saber cuándo un jugador blande un arma, puedes utilizar un activador de entrada que escuche una acción concreta. Cuando un jugador blande el arma, se activa el activador de entrada. Sigue estos pasos para añadir un activador de entrada:
Añade un dispositivo Activador de entrada a tu nivel.
Selecciona el activador de entrada en el Esquematizador. En el panel Detalles, en Opciones de usuario, establece los siguientes valores:
Opción Valor Explicación Tipo de entrada
Acción estándar
Disparar es una acción estándar, que es lo que el activador de entrada necesita escuchar para saber cuándo un jugador blande el arma.
Entrada estándar
Disparar
Disparar es la acción que el activador de entrada debe escuchar para saber cuándo un jugador blande un arma.
Mostrar en el HUD
Falso
No necesitas mostrar esta acción en el HUD.
Volumen
Para asegurarte de que un jugador se encuentra junto a la puerta para abrirla, puedes utilizar un dispositivo de volumen cerca de la puerta para comprobar si hay un jugador en su interior. Sigue estos pasos para añadir un dispositivo de volumen.
Añade una puerta en algún sitio de tu nivel. Esta es la puerta que el jugador abre con el arma.
Añade un dispositivo Volumen a tu nivel. Este dispositivo de volumen tiene que superponerse a una pequeña zona delante de la puerta, o a la zona que quieres que ataque tu jugador.
Cambia el tamaño del dispositivo de volumen mediante la modificación de su gizmo de transformación para que se ajuste a la zona en la que quieres que se encuentre el jugador cuando ataque. El activador de entrada solo escuchará el evento de disparo cuando el jugador se encuentre dentro de este volumen, así que asegúrate de que se ajusta a las necesidades de tu experiencia.
bloqueo
Para asegurarte de que un jugador no pueda abrir la puerta antes de conseguir el arma, puedes bloquear la puerta mediante un dispositivo de bloqueo. Sigue estos pasos para añadir un dispositivo de bloqueo:
Añade un dispositivo de Bloqueo a tu puerta.
Selecciona el bloqueo en el Esquematizador. En el panel de detalles, en las opciones de usuario, establece Visible en el juego en false.
indicador del mapa
Cuando el sitio al que un jugador necesita llegar está lejos de donde consigue el arma, es conveniente mostrar a los jugadores dónde ir mediante un indicador de mapa. Esto muestra una imagen en sus mapas y minimapas y puede activar un pulso objetivo que señala a los jugadores directamente a la puerta. Sigue estos pasos para añadir un indicador de mapa:
Añade un dispositivo Indicador de mapa a tu nivel, oculto bajo la puerta.
Selecciona el indicador de mapa en el Esquematizador. En el panel Detalles, en Opciones de usuario:
Opción Valor Explicación Habilitado al inicio de la partida
false
El indicador de mapa solo se habilita una vez que el jugador recoge el arma.
Icono pequeño
Elige un icono
Selecciona el icono que deseas que aparezca en el minimapa.
Icono grande
Elige un icono
Selecciona el icono que deseas que aparezca en el mapa.
Botón de objeto condicional
Para saber si un jugador está blandiendo el arma adecuada para abrir la puerta, puedes utilizar un botón de objeto condicional a fin de comprobar el arma que sostiene cuando la blande. Sigue estos pasos para añadir un botón de objeto condicional:
Añade un dispositivo Botón de objeto condicional a tu nivel.
Selecciona el botón de objeto condicional en el Esquematizador. En el panel Detalles, en Opciones de usuario, establece los siguientes valores:
Opción Valor Explicación Consumir objetos clave
Falso
No querrás que se consuma el arma del jugador al abrir la puerta.
Definición del elemento de objeto clave
Arma
Esta es el arma que el jugador necesita para abrir la puerta.
Cámara orbital
Puedes utilizar una cámara orbital para cambiar la perspectiva del jugador y simular una vista en primera persona. Sigue estos pasos para añadir una cámara orbital:
Añade un dispositivo Cámara: orbital a tu nivel.
Selecciona el botón de cámara orbital en el Esquematizador. En el panel Detalles, en Cámara, establece los siguientes valores:
Opción Valor Explicación Distancia
0.0 cm
Parámetros necesarios para la vista en primera persona
Compensación X
27.0 cm
Parámetros necesarios para la vista en primera persona
Compensación Y
0.0 cm
Parámetros necesarios para la vista en primera persona
Compensación Z
76.0 cm
Parámetros necesarios para la vista en primera persona
Velocidad horizontal
0.0 cm/s
Parámetros necesarios para la vista en primera persona
En el panel Detalles, en Transición, establece los siguientes valores:
Opción Valor Explicación Transición temporal
0.0 s
Parámetros necesarios para la vista en primera persona
Tiempo de transición de salida
0.1 s
Parámetros necesarios para la vista en primera persona
Tipo de transición de salida
Desaceleración
Parámetros necesarios para la vista en primera persona
Secuencia cinemática
Para activar una cinemática al abrir la puerta, necesitas un dispositivo de secuencia cinemática que la reproduzca. Sigue estos pasos para añadir una secuencia cinemática:
Añade un dispositivo de Secuencia cinemática a tu nivel.
En el Explorador de contenido, crea una secuencia cinemática que desees utilizar en tu nivel. La secuencia cinemática utiliza la cámara orbital que has configurado antes y debería mostrar la puerta abriéndose mientras se produce la transición de la cámara desde un ángulo inicial a una vista en primera persona. Si quieres más información sobre cómo crear tus propias secuencias cinemáticas, consulta Cómo crear escenas cinemáticas.
En el Esquematizador, selecciona la secuencia cinemática. A continuación, en el panel de detalles, en Opciones de usuario, asigna la secuencia a tu secuencia cinemática.
Haz clic en la imagen para ampliarla.
Cinemática de apertura de puertas utilizando Verse
Para controlar la lógica de reproducción de una cinemática y la apertura de la puerta, utilizarás un dispositivo de Verse. El dispositivo escucha si un jugador blande el arma dentro del dispositivo de volumen y, a continuación, reproduce una secuencia cinemática, abre la puerta y realiza la transición del jugador a la primera persona.
Cómo configurar campos
Para crear un dispositivo Verse:
Crea un nuevo dispositivo de Verse mediante el Explorador de Verse y llámalo
door_open_cinematic_manager.Encima de la definición de la clase
door_open_cinematic_manager, añade un canal de registro para mostrar mensajes específicos de este dispositivo. A continuación, añade un registrador a la definición de la clase para utilizarlo con el canal de registro.Versedoor_open_channel := class(log_channel){} # A Verse-authored creative device that can be placed in a level door_open_cinematic_manager := class(creative_device): Logger:log = log{Channel := door_open_channel}Añade los siguientes campos a la definición de la clase
door_open_cinematic_manager:Un dispositivo de volumen editable con el nombre
DoorVolume. Este es el volumen en el que el jugador tiene que encontrarse para abrir la puerta.Verse# The volume the player needs to be inside of to open the door. @editable DoorVolume:volume_device = volume_device{}Un dispositivo Activador de entrada con el nombre
FireTrigger. Esta escucha si el jugador utiliza el arma mientras está dentro deDoorVolume.Verse# The input trigger that listens for the player swinging their weapon # when inside the DoorVolume. @editable FireTrigger:input_trigger_device = input_trigger_device{}Un dispositivo de botón condicional editable con el nombre
ConditionalButton. Este comprueba que el jugador tiene el arma adecuada equipada cuando se encuentra dentro del dispositivo de volumen.Verse# The Conditional Item Button that checks that the player has the correct weapon. @editable ConditionalButton:conditional_button_device = conditional_button_device{}Un dispositivo de bloqueo editable con el nombre
DoorLock. Este mantiene la puerta bloqueada en caso de que el jugador no tenga el arma adecuada.Verse# The lock device that prevents the door from being opened. @editable Door:lock_device = lock_device{}Un dispositivo de secuencia cinemática editable con el nombre
CinematicSequence. Este reproduce la cinemática que lleva a la transición de cámara al abrir la puerta.Verse# The cinematic sequence device that plays the cinematic when opening the door. @editable CinematicSequence:cinematic_sequence_device = cinematic_sequence_device{}Un dispositivo de indicador de mapa editable con el nombre
ObjectiveMarker. Este muestra la ubicación de la puerta en el minimapa después de recoger el arma.Verse# The map indicator device that shows the location of the door. @editable ObjectiveMarker:map_indicator_device = map_indicator_device{}Un dispositivo de repartidor de objetos editable con el nombre
ItemGranter. Este otorga al jugador el arma que necesita para progresar.Verse# The item granter device that grants the player the weapon they need. @editable ItemGranter:item_granter_device = item_granter_device{}Un dispositivo Botón editable con el nombre
ItemGrantButton. Este activa elItemGranterpara otorgar al jugador el arma que necesita.Verse# The button that activates the ItemGranter granter. @editable ItemGrantButton:button_device = button_device{}Un dispositivo de cámara orbital editable con el nombre
FPSCamera. Este simula una vista en primera persona y se añade al jugador después de que finalice la cinemática.Verse# The orbit camera that simulates a first-person view. @editable FPSCamera:gameplay_camera_orbit_device = gameplay_camera_orbit_device{}Una variable
lógicacon el nombreIsDoorOpen. Este campo registra si la puerta ya está abierta, para que la secuencia no se reproduzca si es así.Verse# A variable that tracks whether the door is already open. var IsDoorOpen:logic = falseUna variable
opcióncancelablecon el nombreFireSubscription. Esta almacena la suscripción aFireTriggerPressedEvent. La secuencia cinemática solo se debería activar cuando el jugador se encuentre junto a la puerta. Esta suscripción cancelable se asegura deAnular el registrodel jugador delFireTrigger, si se aleja demasiado.Verse# A cancelable subscription to the FireTrigger device. var FireSubscription:?cancelable = false
Cómo reproducir la cinemática
Cuando se abre la puerta, se inicia una cinemática que muestra la puerta abriéndose y cambia la vista del jugador de tercera a primera persona. Sigue los pasos que aparecen a continuación para activar la cinemática cuando un jugador abra la puerta.
Añade un nuevo método
PlayCinematic()a la definición de la clasedoor_open_cinematic_manager. Añade un nuevo métodoPlayCinematic()a la definición de la clasedoor_open_cinematic_manager. Esta función recibe el jugador que está abriendo la puerta. A continuación, reproduce la cinemática y abre la puerta utilizando el dispositivo de bloqueo.Verse# Plays a cinematic and unlocks the door. PlayCinematic(Agent:agent):void=En
PlayCinematic(), primero reproduce la secuencia cinemática desdeCinematicSequence, después desbloquea la puerta y ábrela medianteUnlock()yOpen()respectivamente.Verse# Plays a cinematic and unlocks the door. PlayCinematic(Agent:agent)<suspends>:void= Logger.Print("Player is holding item, playing cinematic...") CinematicSequence.Play() # Unlock the door, then open it. Door.Unlock(Agent) Door.Open(Agent)Por último, cambia la vista de jugador de tercera a primera persona añadiéndole la cámara orbital mediante
AddTo(), y desactiva el marcador de objetivo. Tu funciónPlayCinematic()completa debería tener el siguiente aspecto:Verse# Plays a cinematic and unlocks the door. PlayCinematic(Agent:agent)<suspends>:void= Logger.Print("Player is holding item, playing cinematic...") CinematicSequence.Play() # Unlock the door, then open it. Door.Unlock(Agent) Door.Open(Agent) set IsDoorOpen = trueLa cinemática solo se debería reproducir cuando el jugador tenga el objeto necesario, y no se debería volver a reproducir cuando la puerta ya esté abierta. Para controlar esta lógica, añade un nuevo método
CheckCinematic()a la definición de la clasedoor_open_cinematic_manager. Esta función recibe el jugador que se encuentra dentro deDoorVolumey comprueba si tiene los objetos necesarios.Verse# Check if the player has the required item and the door isn't already open. CheckCinematic(Agent:agent):void=En
CheckCinematic(), comprueba si el jugador está sujetando el objeto registrado en elConditionalButtonmedianteIsHoldingItem[], y comprueba siIsDoorOpenestá establecido en false para asegurarte de que la puerta no está ya desbloqueada. En ese caso,spawn{}la funciónPlayCinematic()pasando el jugador que abre la puerta. Tu funciónCheckCinematic()completa debería tener el siguiente aspecto:Verse# Check if the player has the required item and the door isn't already open. CheckCinematic(Agent:agent):void= if: ConditionalButton.IsHoldingItem[Agent] and not IsDoorOpen? then: spawn{PlayCinematic(Agent)}
Cómo realizar el seguimiento del jugador y otorgar objetos
Puesto que el jugador necesita blandir su arma mientras se encuentra dentro de DoorVolume para abrir la puerta, el dispositivo de activador de entrada necesita estar a la escucha de ese evento. Sigue los pasos que aparecen a continuación para que tu activador de entrada escuche cuando el jugador blande un arma.
Añade un nuevo método
OnPlayerEntersVolume()a la definición de la clasedoor_open_cinematic_manager. Esta función recibe un Agente y lo registra con elFireTriggercuando entra en elDoorVolume.Verse# Registers the Agent with the FireTrigger when they enter the DoorVolume. OnPlayerEntersVolume(Agent:agent):void= Logger.Print("Agent entered DoorVolume")En
OnPlayerEntersVolume(), registra el agente con elFireTriggerllamando aRegister(). Después, establece laFireSubscriptional resultado de suscribir elFireTrigger.PressedEventaPlayCinematic(). Tu funciónOnPlayerEntersVolume()completa debería tener el siguiente aspecto:Verse# Registers the Agent with the FireTrigger when they enter the DoorVolume. OnPlayerEntersVolume(Agent:agent):void= Logger.Print("Agent entered DoorVolume") FireTrigger.Register(Agent) # Subscribe the PressedEvent to PlayCinematic, and store that subscription in FireSubscrition. set FireSubscription = option{(FireTrigger.PressedEvent.Subscribe(PlayCinematic))}Cuando un jugador sale del
DoorVolume, tienes que dejar de hacer el seguimiento de la suscripción para elFireTrigger.PressedEventya que el jugador solo debería poder activar la cinemática si no está dentro del volumen. Para controlar esto, añade un nuevo métodoOnPlayerExitsVolume()a la definición de la clasedoor_open_cinematic_manager.Verse# Unregister the Agent with the FireTrigger when they leave the DoorVolume. OnPlayerExitsVolume(Agent:agent):void=En
OnPlayerExitsVolume(), primero,Unregister()el agente con elFireTrigger. Luego recupera la suscripción enFireSubscriptiony cancélala. Tu métodoOnPlayerExitsVolume()completo debería tener el siguiente aspecto:Verse# Unregister the Agent with the FireTrigger when they leave the DoorVolume. OnPlayerExitsVolume(Agent:agent):void= Logger.Print("Agent exited DoorVolume") FireTrigger.Unregister(Agent) # Cancel the subscription to the FireSubscription. if (SubscriptionToCancel := FireSubscription?): SubscriptionToCancel.Cancel()Cuando el jugador interactúa con el
ItemButton, se le otorga el arma que necesita para progresar. También aparece un marcador de objetivo en su minimapa, que muestra el camino hacia la puerta en caso de que todavía no se haya encontrado. Para controlar esto, añade un nuevo métodoGrantItem()que recibe unagentea la definición de la clasedoor_open_cinematic_manager. Dentro deGrantItem(), llama aGrantItemen el agente que se ha pasado y activa el marcador de objetivo. Tu métodoGrantItem()completo debería tener el siguiente aspecto:Verse# Grants the Agent an item when they interact with the ItemGrantButton # and enables the ObjectiveMarker. GrantItem(Agent:agent):void= ItemGranter.GrantItem(Agent) ObjectiveMarker.Enable()
Cómo unirlo todo
Ahora puedes suscribir cada evento a su función asociada y probar tu código en el juego.
En
OnBegin(), suscribe elItemGrantButton.InteractedWithEventa la funciónGrantItem(). Después suscribe ambosDoorVolume.AgentEntersEventyDoorVolume.AgentExitsEventa sus funciones asociadas. Tu funciónOnBegin()debería tener el siguiente aspecto:Verse# Runs when the device is started in a running game OnBegin<override>()<suspends>:void= # Subscribe each event to its associated function. ItemGrantButton.InteractedWithEvent.Subscribe(GrantItem) DoorVolume.AgentEntersEvent.Subscribe(OnPlayerEntersVolume) DoorVolume.AgentExitsEvent.Subscribe(OnPlayerExitsVolume)Guarda el código y compílalo.
En UEFN, selecciona el dispositivo DoorOpenCinematicManager de tu nivel. En el Esquematizador, asigna cada referencia editable al dispositivo del nivel.
Haz clic en la imagen para ampliarla.
Haz clic en Abrir sesión en la barra de herramientas de UEFN para hacer una prueba de juego del nivel. Al probar el nivel, la interacción con el botón de objeto debería otorgar al jugador el arma que necesita y añadir un marcador de objetivo al minimapa del jugador. Cuando el jugador utilice el arma dentro del volumen de la puerta, se debería reproducir una cinemática, la puerta debería abrirse y el jugador debería pasar a la vista en primera persona.
Código completo
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
# See https://dev.epicgames.com/documentation/en-us/uefn/create-your-own-device-in-verse for how to create a verse device.
door_open_log := class(log_channel){}
door_open_cinematic_manager := class(creative_device):
Logger:log = log{Channel := door_open_log}
Por tu cuenta
Al finalizar esta guía, habrás aprendido a utilizar Verse para reproducir una cinemática cuando un jugador abre una puerta y a pasar de la cámara en tercera persona a la cámara en primera persona.
Con lo que has aprendido, intenta lo siguiente:
¿Puedes hacer otros tipos de transiciones de cámara, como una transición a una vista de desplazamiento lateral?
¿Qué tal un botón dedicado para cambiar el ángulo de la cámara, o diseñar un nivel que necesite varios ángulos de cámara para progresar?
¿Puedes utilizar activadores de entrada para penalizaciones negativas, como por ejemplo desafiar a los jugadores a superar una sección sin saltar y reproducir una cinemática si fallan?