Las cámaras desempeñan un papel fundamental en el aspecto de un 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 entorno del juego. Cambiar de cámara durante el juego puede 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 utilizando una cámara fija para crear una sección de desplazamiento lateral.
En UEFN, puedes utilizar Verse para manejar 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 de cámara orbital a un jugador al final de una cinemática. Puedes modificar la configuración de una cámara de órbita para simular una vista en primera persona, y al añadir la cámara al final de una cinemática, puedes crear una transición de tercera a primera persona. Para una jugabilidad añadida, en este ejemplo, el jugador tiene que tomar un arma y balancearla hacia la puerta para activar la cinemática. Puedes adaptar este ejemplo para que se ajuste a las necesidades de tu experiencia, como un jugador que balancea una llave inglesa para arreglar una puerta de barco defectuosa o un martillo para aplastar una roca y revelar una zona secreta. Puedes aplicar también estos conceptos más ampliamente para crear momentos de jugabilidad geniales, como una toma abierta al entrar a una nueva zona o cambiar a una vista isométrica cuando el jugador necesite resolver un rompecabezas o a una vista en primera persona en una experiencia de terror espeluznante.
Sigue este tutorial para aprender cómo crear un dispositivo de Verse que haga pasar a un jugador de una tercera persona a una primera persona mediante una secuencia cinemática cuando abra una puerta.
En este ejemplo, se usan las siguientes características de lenguaje:
Clase: en este ejemplo, se crea una clase de Verse que activa una cinemática cuando un jugador abre una puerta.
Opción: puedes almacenar eventos a los que te puedes suscribir en variables de opción y cancelar las suscripciones a esos eventos más tarde.
En este ejemplo, se utilizan las siguientes API:
Suscribible: te puedes suscribir a eventos para saber cuándo un jugador introduce un volumen junto a la puerta, y le brinda a los jugadores un elemento cuando interactúan con un botón.
Configuración del nivel
Este ejemplo utiliza los siguientes dispositivos.
1 x dispositivo de botón: cuando un jugador interactúa con el botón, recibirá una espada de un dispositivo otorgador de elemento.
1 x dispositivo otorgador de elemento: el otorgador de elemento le otorga al jugador la espada que necesita para avanzar por la puerta.
1 x dispositivo de botón condicional: el arma obligatoria se establece como el elemento clave del botón condicional para que el jugador no pueda avanzar por la puerta a menos que tenga la espada obligatoria.
1 x dispositivo activador de entrada: abre la puerta cuando el jugador ataca al escuchar la acción de entrada del disparo. Esto solo sucede cuando el jugador está dentro del dispositivo de volumen, si el jugador tiene la espada y la puerta ya no está abierta.
1 x dispositivo de volumen: como no quieres que cualquier activador de ataque con la espada abra la puerta, el dispositivo de volumen se asegura de que el jugador deba estar justo al lado de la puerta para abrirla.
1 x dispositivo de secuencia cinemática: para crear una transición fluida desde la tercera hacia la primera persona, reproducirás una cinemática que muestre la puerta abriéndose y reposicionarás la cámara para que se alinee con el punto de vista del jugador en primera persona.
1 x dispositivo de cámara orbital: para crear una perspectiva de primera persona para el jugador, usarás una cámara orbital posicionada dentro del pecho del personaje para imitar el punto de vista de primera persona. Este cambio de perspectiva solo sucede después de la cinemática cuando el jugador abre la puerta.
1 x dispositivo de bloqueo: mantiene la puerta bloqueada para evitar que el jugador la abra antes de tener el arma necesaria.
1 x dispositivo indicador de mapa: muestra la ubicación de la puerta en el minimapa cuando el jugador recoge el arma.
Para configurar tu nivel, sigue estos pasos:
Botón y otorgador de elemento
El jugador debe abrir la puerta para recibir el arma; usarás un otorgador de elemento y un dispositivo de botón. Cuando el jugador interactúa con el botón, el otorgador de elemento otorga el arma. Para añadir estos elementos, sigue estos pasos:
Añade un dispositivo otorgador de elemento a tu nivel.
Selecciona el otorgador de elemento en el esquematizador. En el panel de detalles, en Opciones de usuario, define los siguientes valores:
Opción Value Explicación Definición del elemento
Espada
Es el arma con la que el jugador abre la puerta.
Equipar objeto otorgado
Verdadero
En este ejemplo, el jugador recoge e inmediatamente equipa el arma.
Añade un dispositivo de botón a tu nivel.
Selecciona el botón en el esquematizador. En el panel de detalles, en Opciones de usuario, define los siguientes valores:
Opción Value Explicación Texto de interacción
"Recoger"
Es el texto que le indica al jugador que debe interactuar con el botón.
Las 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 usar un disparador de entrada que escuche una acción en particular. Cuando un jugador blande el arma, el disparador de entrada se activa. Para agregar un disparador de entrada, sigue estos pasos:
Añade un dispositivo activador de entrada a tu nivel.
Selecciona el activador de entrada en el esquematizador. En el panel de detalles, en Opciones de usuario, define los siguientes valores:
Opción Value Explicación Tipo de entrada
Acción estándar
Disparo es una acción estándar, que es lo que el activador de entrada debe escuchar para saber cuándo un jugador blande el arma.
Entrada estándar
Disparar
El disparo 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 garantizar que un jugador debe estar al lado de la puerta para abrirla, puedes usar un dispositivo de volumen cerca de la puerta para verificar si un jugador está dentro de él. Para agregar un dispositivo de volumen, sigue estos pasos.
Añade una puerta en algún lugar de tu nivel. Esta es la puerta que el jugador abre usando el arma.
Añade un dispositivo de volumen a tu nivel. Este dispositivo de volumen debe superponerse a una pequeña área en frente de la puerta o al área que quieres que tu jugador ataque.
Cambia el tamaño del dispositivo de volumen al modificar su artilugio de transformación para que se ajuste a la zona en la que quieres que esté el jugador al atacar. El disparador de entrada solo escuchará el evento de disparo mientras el jugador esté dentro de este volumen, así que asegúrate de que satisfaga las necesidades de tu experiencia.
bloqueo
Para asegurarte de que un jugador no pueda abrir la puerta antes de que tengan el arma, puedes bloquear la puerta usando un dispositivo de bloqueo. Para agregar un dispositivo de bloqueo, sigue estos pasos.
Añade un dispositivo de bloqueo a tu puerta.
Selecciona el bloqueo en el esquematizador. En el panel de detalles, en Opciones de usuario, establece Visible en el juego en falso.
indicador de mapa
Cuando el sitio que un jugador debe alcanzar está lejos de donde encuentra el arma, es útil mostrarles a los jugadores a dónde ir usando un indicador de mapa. Esto muestra una imagen en su mapa y minimapa y puede activar un pulso de objetivo que guía a los jugadores directamente a la puerta. Para añadir un indicador de mapa, sigue estos pasos:
Añade un dispositivo indicador de mapa a tu nivel, oculto debajo de la puerta.
Selecciona el indicador de mapa en el esquematizador. En el panel de detalles, en Opciones de usuario:
Opción Value Explicación Habilitado al inicio de la partida
false
El indicador de mapa solo se habilita después de que el jugador recoge el arma.
Ícono pequeño
Elige un ícono
Elige un ícono que quieras mostrar en el minimapa.
Ícono grande
Elige un ícono
Elige un ícono que quieras mostrar en el mapa.
Botón de elemento condicional
Para saber que un jugador está blandiendo el arma correcta, este debe abrir la puerta; puedes usar un botón de elemento condicional para verificar el arma que el jugador está sosteniendo al blandirla. Para agregar un botón de elemento condicional, sigue estos pasos:
Añade un dispositivo de botón de elemento condicional a tu nivel.
Selecciona el botón de elemento condicional en el esquematizador. En el panel de detalles, en Opciones de usuario, define los siguientes valores:
Opción Value Explicación Consumir objetos clave
Falso
No deberías consumir el arma del jugador cuando abra la puerta.
Definición de elemento clave 1
arma
Esta es el arma que el jugador necesita para abrir la puerta.
Cámara orbital
Para simular una perspectiva de primera persona, puedes usar la cámara orbital para cambiar la perspectiva del jugador. Para agregar una cámara orbital, sigue estos pasos:
Añade un dispositivo de cámara orbital a tu nivel.
Selecciona el botón de cámara orbital en el esquematizador. En el panel de detalles, en Cámara, establece los siguientes valores:
Opción Value Explicación Distancia
0.0 cm
Parámetros necesarios para la perspectiva de primera persona
Compensación X
27.0 cm
Parámetros necesarios para la perspectiva de primera persona
Compensación Y
0.0 cm
Parámetros necesarios para la perspectiva de primera persona
Compensación Z
76.0 cm
Parámetros necesarios para la perspectiva de primera persona
Velocidad horizontal
0.0 cm/s
Parámetros necesarios para la perspectiva de primera persona
En el panel de detalles, en Transición, establece los siguientes valores:
Opción Value Explicación Tiempo de entrada de transición
0.0 s
Parámetros necesarios para la perspectiva de primera persona
Tiempo de salida de transición
0.1 s
Parámetros necesarios para la perspectiva de primera persona
Tipo de salida de transición
Salida suave
Parámetros necesarios para la perspectiva de primera persona
Secuencia cinemática
Para activar una cinemática al abrir la puerta, necesitas que un dispositivo de secuencia cinemática la reproduzca. Para agregar una secuencia cinemática, sigue estos pasos:
Añade un dispositivo de secuencia cinemática a tu nivel.
En el explorador de contenido, crea la secuencia cinemática que quieras usar en tu nivel. La secuencia cinemática usa la cámara orbital que configuraste antes y debería mostrar la puerta abriéndose mientras las cámara hace la transición del ángulo inicial a la perspectiva de primera persona. Para obtener más información sobre cómo crear tus propias secuencias cinemáticas, consulta Cómo crear cinemáticas y escenas.
En el esquematizador, selecciona la secuencia cinemática. Luego, 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 puerta usando Verse
A fin de manejar la lógica para reproducir una cinemática y abrir la puerta, usarás un dispositivo de Verse. El dispositivo escucha a un jugador blandiendo su arma dentro del dispositivo de volumen, luego reproduce una secuencia cinemática, abre la puerta y el jugador hace una transición hacia la perspectiva de primera persona.
Cómo configurar los campos
Para crear tu dispositivo de Verse:
Crea un nuevo dispositivo de Verse con el explorador de Verse y asígnale el nombre
door_open_cinematic_manager.Encima de la definición de la clase
door_open_cinematic_manager, añade un canal de registro para imprimir los 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 llamado
DoorVolume. # Este es el volumen en el que debe estar el jugador 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 botón editable llamado
FireTrigger. Esto escucha al jugador usando su arma mientras está dentro delDoorVolume.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 llamado
ConditionalButton. Esto verifica que el jugador tenga equipada el arma correcta cuando está 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 llamado
DoorLock. Esto mantiene la puerta bloqueada si el jugador no tiene el arma correcta.Verse# The lock device that prevents the door from being opened. @editable Door:lock_device = lock_device{}Un dispositivo de secuencia cinemática editable llamado
CinematicSequence. Esto reproduce la cinemática que lleva a la transición de la 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 indicador de mapa editable llamado
ObjectiveMarker. Esto 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 otorgador de elemento editable llamado
ItemGranter. Esto le da 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 de botón editable llamado
ItemGrantButton. Esto activa elItemGranterpara que le dé 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 llamado
FPSCamera. Esto simula una perspectiva de primera persona y se añade al jugador después de que finaliza 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
logicllamadaIsDoorOpen. Este campo verifica si la puerta ya está abierta, de modo que la secuencia no se reproduce si lo está.Verse# A variable that tracks whether the door is already open. var IsDoorOpen:logic = falseUna variable
optioncancelablellamadaFireSubscription. Esto almacena la suscripción alPressedEventdeFireTrigger. Esta secuencia cinemática solo debería activarse cuando el jugador esté justo al lado de la puerta. Esta suscripción cancelable se asegura de usarUnregisteren el jugador con elFireTriggersi se aleja mucho.Verse# A cancelable subscription to the FireTrigger device. var FireSubscription:?cancelable = false
Cómo reproducir la cinemática
Cuando la puerta se abre, ocurre una cinemática que muestra la puerta abriéndose y el jugador hace una transición desde una perspectiva de tercera persona a una de primera persona. Sigue los pasos a continuación para activar tu cinemática cuando un jugador abra una 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. Luego, reproduce la cinemática y abre la puerta usando el dispositivo de bloqueo.Verse# Plays a cinematic and unlocks the door. PlayCinematic(Agent:agent):void=En
PlayCinematic(), primero reproduce la secuencia cinemática deCinematicSequence, luego desbloquea la puerta y ábrela usandoUnlock()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)Finalmente, cambia la perspectiva del jugador de tercera a primera persona añadiendo la cámara orbital con
AddTo()y, luego, deshabilita el marcador de objetivo. Tu funciónPlayCinematic()completa debería verse así: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 debería reproducirse cuando el jugador esté sosteniendo el elemento necesario y no debería reproducirse de nuevo después de que la puerta ya esté abierta. Para manejar esta lógica, añade un nuevo método
CheckCinematic()a la definición de la clasedoor_open_cinematic_manager. Esta función lleva al jugador al interior delDoorVolumey verifica si tiene los elementos necesarios.Verse# Check if the player has the required item and the door isn't already open. CheckCinematic(Agent:agent):void=En
CheckCinematic(), verifica si el jugador está sosteniendo el elemento registrado enConditionalButtonusandoIsHoldingItem[], y verifica siIsDoorOpenes falso para garantizar que la puerta ya no esté desbloqueada. De ser así, usaspawn{}con la funciónPlayCinematic()pasando al jugador que abre la puerta. La funciónCheckCinematic()completa debería verse así: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 hacer seguimiento del jugador y otorgar elementos
Dado que el jugador necesita blandir su arma mientras esté dentro del DoorVolume para abrir la puerta, el activador de botón debe escuchar ese evento. Sigue los pasos a continuación para que tu disparador de entrada escuche cuando un jugador blanda 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 ingresa alDoorVolume.Verse# Registers the Agent with the FireTrigger when they enter the DoorVolume. OnPlayerEntersVolume(Agent:agent):void= Logger.Print("Agent entered DoorVolume")En
OnPlayerEntersVolume(), llama aRegister()para registrar el agente en elFireTrigger. Luego, estableceFireSubscriptionen el resultado de suscribir elFireTrigger.PressedEventaPlayCinematic(). La funciónOnPlayerEntersVolume()completa debería verse así: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 de
DoorVolume, debes dejar de seguir la suscripción paraFireTrigger.PressedEvent, ya que el jugador solo debería poder activar la cinemática si no está dentro del volumen. Para manejar 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 usaUnregister()en el agente con elFireTrigger. Luego, recupera la suscripción dentro deFireSubscriptiony cancélala. El métodoOnPlayerExitsVolume()completo debería verse así: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, recibe el arma que necesita para progresar. También aparece un marcador de objetivo en su minimapa, que le muestra el camino hacia la puerta en caso de que no lo haya encontrado todavía. Para manejar esto, añade un nuevo métodoGrantItem(), que pasa unagentea la definición de la clasedoor_open_cinematic_manager. Dentro deGrantItem(), llama aGrantItemen el agente que se pasó y habilita el marcador de objetivo. El métodoGrantItem()completo debería verse así: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()
Integración
Ahora puedes suscribir cada evento a su función asociada y probar tu código en el juego.
En
OnBegin(), suscribeItemGrantButton.InteractedWithEventa la funciónGrantItem(). Luego, suscribe tantoDoorVolume.AgentEntersEventcomoDoorVolume.AgentExitsEventa sus funciones asociadas. La funciónOnBegin()debería verse así: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 tu código y compílalo.
En UEFN, selecciona el dispositivo DoorOpenCinematicManager en tu nivel. En el esquematizador, asigna cada referencia editable al dispositivo en el nivel.
Haz clic en la imagen para ampliarla.
Haz clic en Comenzar sesión en la barra de herramientas de UEFN para probar el nivel. Cuando se le hace una prueba de juego al nivel, al interactuar con el botón del elemento, el jugador debería recibir el arma que necesita y se debería añadir un marcador de objetivo en el minimapa del jugador. Cuando el jugador usa el arma dentro del volumen de la puerta, debería reproducirse una cinemática, la puerta debería abrirse, y el jugador debería hacer una transición hacia lista perspectiva de 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}
Hazlo por tu cuenta
Al completar esta guía, habrás aprendido a usar Verse para reproducir una cinemática cuando un jugador abre una puerta y a hacer la transición de la cámara de tercera persona a la de primera persona.
Con lo que aprendiste, prueba lo siguiente:
¿Puedes hacer otros tipos de transiciones de cámara, como una transición a una vista del desplazador lateral?
¿Qué tal un botón dedicado a cambiar el ángulo de la cámara o diseñar un nivel que exija múltiples ángulos de cámara para progresar?
¿Puedes usar activadores de entrada para penalizaciones negativas, como retar a los jugadores a que atraviesen una sección sin saltar, y reproducir una cinemática si no lo logran?