Câmeras desempenham um papel fundamental na aparência de um jogo. Câmeras em terceira pessoa podem dar aos jogadores maior sensação de espaço, enquanto câmeras de primeira pessoa dão uma visão mais detalhada do mundo do jogo. Trocar de câmera durante o jogo pode evocar sentimentos diferentes, e a transição entre várias câmeras pode adicionar uma variedade significativa à sua experiência. Por exemplo, você pode criar um divertido desafio de plataforma usando uma câmera fixa para criar uma seção de rolagem lateral.
No UEFN, você pode usar o Verse para lidar com alterações de câmera. Ao usar dispositivos para recepcionar eventos, você pode adicionar uma câmera a um jogador para alterar sua visão quando o evento for acionado. Neste exemplo, você adicionará um dispositivo Câmera em Órbita a um jogador no final de uma cinematografia. Você pode modificar as configurações de uma câmera orbital para simular uma visão em primeira pessoa e, ao adicionar a câmera no final de uma cinematografia, pode criar uma transição suave da terceira para a primeira pessoa. Para maior jogabilidade, este exemplo faz com que o jogador pegue uma arma e bata com ela na porta para acionar a cinematografia. É possível adaptar este exemplo para atender às necessidades da sua experiência, como um jogador batendo com uma chave inglesa para consertar uma porta de navio com defeito ou com um martelo para quebrar uma pedra e revelar uma área secreta. Você também pode aplicar esses conceitos de forma mais ampla para criar momentos de jogabilidade interessantes, como uma tomada ampla ao entrar em uma nova zona, alternar para uma visão de cima para baixo quando o jogador precisa resolver um quebra-cabeça ou uma visão em primeira pessoa em uma experiência de terror assustadora.
Siga este tutorial para aprender a criar um dispositivo Verse que faz a transição de um jogador da terceira a primeira pessoa usando uma sequência cinematográfica quando ele abre uma porta.
Este exemplo usa as seguintes funcionalidades da linguagem:
Classe: este exemplo cria uma classe Verse que ativa uma cinematografia quando um jogador abre uma porta.
Option: você pode armazenar eventos inscritos em variáveis do tipo option e cancelar as assinaturas desses eventos mais tarde.
Este exemplo usa as seguintes APIs:
Subscribable: você se inscreverá em eventos para saber quando um jogador entra em um volume próximo à porta e concederá um item aos jogadores quando eles interagirem com um botão.
Como configurar o nível
Este exemplo usa os seguintes dispositivos:
1 dispositivo Botão: quando o jogador interagir com o botão, ele receberá uma espada de um dispositivo distribuidor de itens.
1 dispositivo Distribuidor de Itens: o distribuidor de itens concede ao jogador a espada necessária para avançar pela porta.
1 x dispositivo Botão Condicional: a arma necessária é definida como item-chave do botão condicional, para que o jogador não possa avançar pela porta a menos que tenha a espada necessária.
1 dispositivo Gatilho de Entrada: abre a porta quando o jogador ataca, recepcionando a ação de entrada de disparo. Isso acontece apenas quando o jogador está dentro do dispositivo Volume, se estiver com a espada e se a porta ainda não estiver aberta.
1 dispositivo Volume: como você não quer que qualquer gatilho de ataque com a espada abra a porta, o dispositivo Volume garante que o jogador precise estar bem próximo à porta para abri-la.
1 dispositivo Sequência Cinematográfica: para criar uma transição suave da terceira para a primeira pessoa, você reproduzirá uma cinematografia que mostra a porta se abrindo e reposicionará a câmera para se alinhar ao ponto de vista do jogador na primeira pessoa.
1 dispositivo Câmera em Órbita: para criar uma visão em primeira pessoa para o jogador, você usará uma câmera em órbita posicionada no peito do personagem para imitar um ponto de vista em primeira pessoa. Essa mudança de visão só acontece após a reprodução da cinematografia quando o jogador abre a porta.
1 dispositivo Cadeado: mantém a porta trancada, para evitar que o jogador a abra antes de ter a arma necessária.
1 dispositivo Indicador de Mapa: exibe a localização da porta no minimapa quando o jogador pega a arma.
Para configurar seu nível, siga estas etapas:
Distribuidor de Iens e Botão
Para conceder ao jogador a arma necessária para abrir a porta, você usará um distribuidor de itens e um dispositivo Botão. Quando o jogador interagir com o botão, o distribuidor de itens concederá a arma. Para adicionar esses elementos, siga estas etapas:
Adicione um dispositivo Distribuidor de Itens ao seu nível.
Selecione o distribuidor de itens no Organizador. No painel Detalhes, em Opções do Usuário, defina os valores para os itens a seguir:
Option Valor Explicação Definição de Item
Espada
Esta é a arma com a qual o jogador abre a porta.
Equipar Item Concedido
True
Neste exemplo, o jogador pega a arma e a equipa imediatamente.
Adicione um dispositivo Botão ao seu nível.
Selecione o botão no Organizador. No painel Detalhes, em Opções do Usuário, defina os valores para os itens a seguir:
Option Valor Explicação Texto de interação
"Coletar"
Este é o texto que solicita ao jogador que interaja com o botão.
Vezes que Pode Ser Acionado
1
Neste exemplo, o jogador só pode pegar a arma uma vez.
Gatilho de Entrada
Para saber quando um jogador bater com uma arma, você pode usar um gatilho de entrada que recepciona uma ação específica. Quando um jogador bater com a arma, o gatilho de entrada será ativado. Para adicionar um gatilho de entrada, siga estas etapas:
Adicione um dispositivo Gatilho de Entrada ao seu nível.
Selecione o gatilho de entrada no Organizador. No painel Detalhes, em Opções do Usuário, defina os valores para os itens a seguir:
Option Valor Explicação Tipo de Comando
Ação Padrão
Disparar é uma ação padrão, que é o que o gatilho de entrada precisa monitorar para saber quando o jogador executa o ataque com a arma.
Entrada Padrão
Fogo
Disparar é a ação que o gatilho de entrada precisa monitorar para saber quando o jogador executa o ataque com a arma.
Exibir no HUD
false
Você não precisa mostrar essa ação no HUD.
volume
Para garantir que um jogador esteja próximo à porta para abri-la, você pode usar um dispositivo de volume perto da porta para verificar se há um jogador dentro dela. Para adicionar um dispositivo de volume, siga estas etapas.
Adicione uma porta em algum lugar do seu nível. Esta é a porta que o jogador abre com a arma.
Adicione um dispositivo Volume ao seu nível. Esse dispositivo Volume deve se sobrepor a uma pequena área na frente da porta ou à área que você deseja que seu jogador ataque.
Altere o tamanho do dispositivo Volume modificando seu gizmo de transformação para caber na área você deseja que o jogador esteja ao atacar. O gatilho de entrada somente recepcionará o evento de disparo enquanto o jogador estiver dentro desse volume. Portanto, certifique-se de que ele atenda às necessidades da sua experiência.
Cadeado
Para garantir que um jogador não consiga abrir a porta antes de pegar a arma, você pode trancar a porta usando um dispositivo Cadeado. Para adicionar um dispositivo Cadeado, siga estas etapas:
Adicione um dispositivo Cadeado conectado à sua porta.
Selecione o cadeado no Organizador. No painel Detalhes, em Opções do Usuário, defina Visível no Jogo como false.
Indicador de Mapa
Quando o lugar que um jogador precisa chegar está longe de onde ele conseguiu a arma, é útil mostrar para ele aonde ir usando um indicador de mapa. Isso exibe uma imagem em seu mapa e no minimapa e pode ativar um pulso objetivo que aponta os jogadores diretamente para a porta. Para adicionar um indicador de mapa, siga estas etapas:
Adicione um dispositivo Indicador de Mapa ao seu nível, escondido embaixo da porta.
Selecione o indicador do mapa no Organizador. No painel Detalhes, em Opções do Usuário:
Option Valor Explicação Habilitado no Início do Jogo
false
O indicador de mapa só é habilitado depois que o jogador pega a arma.
Ícone pequeno
Escolha um ícone
Escolha um ícone que você deseja mostrar no minimapa.
Ícone grande
Escolha um ícone
Escolha um ícone que deseja mostrar no mapa.
Botão Condicional de Item
Para saber se um jogador está batendo com a arma certa de que precisa para abrir a porta, você pode usar um botão de item condicional para verificar a arma que ele está segurando ao bater com ela. Para adicionar um botão de item condicional, siga estas etapas:
Adicione um dispositivo Botão Condicional de Item ao seu nível.
Selecione o botão condicional de item no Organizador. No painel Detalhes, em Opções do Usuário, defina os valores para os itens a seguir:
Option Valor Explicação Consumir itens-chave
false
Você não quer consumir a arma do jogador quando ele abrir a porta.
Definição de Item do Item-Chave 1
Arma
Esta é a arma de que o jogador precisa para abrir a porta.
Câmera em Órbita
Para simular uma visão em primeira pessoa, você pode usar uma câmera orbital para mudar a perspectiva do jogador. Para adicionar uma câmera orbital, siga estas etapas:
Adicione um dispositivo Câmera em Órbita ao seu nível.
Selecione o botão de câmera em órbita no Organizador. No Painel Detalhes, em Câmera, defina os valores como mostrado a seguir:
Option Valor Explicação Distância
0,0 cm
Parâmetros necessários para a visão em primeira pessoa
Deslocamento X
27,0 cm
Parâmetros necessários para a visão em primeira pessoa
Deslocamento Y
0,0 cm
Parâmetros necessários para a visão em primeira pessoa
Deslocamento Z
76,0 cm
Parâmetros necessários para a visão em primeira pessoa
Velocidade Horizontal
0,0 cm/s
Parâmetros necessários para a visão em primeira pessoa
No painel Detalhes, em Transição, defina os valores como mostrado a seguir:
Option Valor Explicação Tempo da Transição de Entrada
0,0 s
Parâmetros necessários para a visão em primeira pessoa
Tempo da Transição de Saída
0,1 s
Parâmetros necessários para a visão em primeira pessoa
Tipo da Transição de Saída
Desaceleração
Parâmetros necessários para a visão em primeira pessoa
Sequência Cinematográfica
Para acionar uma cinematografia ao abrir a porta, você precisa de um dispositivo de sequência cinemática para reproduzi-la. Para adicionar uma sequência cinematográfica, siga estas etapas:
Adicione um dispositivo Sequência Cinematográfica ao seu nível.
No Navegador de Conteúdo, crie a sequência cinematográfica que você deseja usar em seu nível. A sequência cinematográfica usa a câmera orbital que você configurou antes e deve mostrar a porta se abrindo enquanto a câmera faz a transição de um ângulo inicial para uma visão em primeira pessoa. Para obter mais informações sobre como criar suas próprias sequências cinematográficas, confira Como criar cinematografia e cenas.
No Organizador, selecione a sequência cinematográfica. Em seguida, no painel Detalhes, em Opções do Usuário, atribua a Sequência à sua sequência cinematográfica.
Clique na imagem para ampliar.
Cinematografia de abertura da porta usando Verse
Para lidar com a lógica de reproduzir uma cinematografia e abrir a porta, você usará um dispositivo Verse. O dispositivo recepciona um jogador batendo com sua arma dentro do dispositivo Volume e depois reproduz uma sequência cinematográfica, abre a porta e faz a transição do jogador para a primeira pessoa.
Configuração dos campos
Para criar seu dispositivo Verse:
Crie um novo dispositivo Verse usando o Explorador de Verse e chame-o de
door_open_cinematic_manager.Acima da definição de classe
door_open_cinematic_manager, adicione um canal de log para imprimir mensagens específicas desse dispositivo. Em seguida, adicione um Logger à definição de classe para usar com o canal de log.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}Adicione os seguintes campos à definição de classe
door_open_cinematic_manager:Um dispositivo Volume editável chamado
DoorVolume. Este é o volume onde o jogador precisa estar para abrir a porta.Verse# The volume the player needs to be inside of to open the door. @editable DoorVolume:volume_device = volume_device{}Um dispositivo Gatilho de Entrada editável chamado
FireTrigger. Ele monitora o uso da arma pelo jogador enquanto ele estiver dentro doDoorVolume.Verse# The input trigger that listens for the player swinging their weapon # when inside the DoorVolume. @editable FireTrigger:input_trigger_device = input_trigger_device{}Um dispositivo Botão Condicional editável chamado
ConditionalButton. Verifica se o jogador possui a arma correta equipada quando está dentro do dispositivo Volume.Verse# The Conditional Item Button that checks that the player has the correct weapon. @editable ConditionalButton:conditional_button_device = conditional_button_device{}Um dispositivo Cadeado editável chamado
DoorLock. Mantém a porta trancada caso o jogador não tenha a arma correta.Verse# The lock device that prevents the door from being opened. @editable Door:lock_device = lock_device{}Um dispositivo Sequência Cinematográfica editável chamado
CinematicSequence. Reproduz a transição cinematográfica para a transição da câmera ao abrir a porta.Verse# The cinematic sequence device that plays the cinematic when opening the door. @editable CinematicSequence:cinematic_sequence_device = cinematic_sequence_device{}Um dispositivo Indicador de Mapa editável chamado
ObjectiveMarker. Mostra a localização da porta no minimapa depois que o jogador pega a arma.Verse# The map indicator device that shows the location of the door. @editable ObjectiveMarker:map_indicator_device = map_indicator_device{}Um dispositivo Distribuidor de Itens editável chamado
ItemGranter. Concede ao jogador a arma necessária para progredir.Verse# The item granter device that grants the player the weapon they need. @editable ItemGranter:item_granter_device = item_granter_device{}Um dispositivo Botão editável chamado
ItemGrantButton. Isso ativa oItemGranterpara conceder ao jogador a arma da qual ele precisa.Verse# The button that activates the ItemGranter granter. @editable ItemGrantButton:button_device = button_device{}Um dispositivo Câmera em Órbita editável chamado
FPSCamera. Simula uma visão em primeira pessoa e é adicionado ao jogador após o término da cinematografia.Verse# The orbit camera that simulates a first-person view. @editable FPSCamera:gameplay_camera_orbit_device = gameplay_camera_orbit_device{}Uma variável
logicchamadaIsDoorOpen. Esse campo rastreia se a porta já está aberta. Em caso positivo, a sequência não é reproduzida.Verse# A variable that tracks whether the door is already open. var IsDoorOpen:logic = falseUma variável
optioncancelablechamadaFireSubscription. Isso armazena a inscrição noPressedEventdeFireTrigger. A sequência cinematográfica apenas deve ser acionada quando o jogador está bem perto da porta. Essa inscrição cancelável garante que o jogador seja desregistrado (Unregister) doFireTriggercaso se afaste demais.Verse# A cancelable subscription to the FireTrigger device. var FireSubscription:?cancelable = false
Reprodução da cinematografia
Quando a porta se abre, ocorre uma cinematografia que mostra a porta se abrindo e faz a transição da visão do jogador da terceira para a primeira pessoa. Siga as etapas abaixo para ativar sua cinematografia quando um jogador abrir a porta.
Adicione um novo método
PlayCinematic()à definição de classedoor_open_cinematic_manager. Adicione um novo métodoPlayCinematic()à definição de classedoor_open_cinematic_manager. Essa função usa o jogador que está abrindo a porta. Em seguida, ela reproduz o cinematografia e abre a porta usando o dispositivo Cadeado.Verse# Plays a cinematic and unlocks the door. PlayCinematic(Agent:agent):void=Em
PlayCinematic(), primeiro reproduza a sequência cinematográfica deCinematicSequence, depois destranque a porta e abra-a usandoUnlock()eOpen(), 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 fim, mude a visão do jogador da terceira para a primeira pessoa adicionando a câmera em órbita a ele com
AddTo()e, em seguida, desabilite o Marcador de Objetivo. Sua funçãoPlayCinematic()completa deve ficar assim: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 = trueA cinematografia só deve ser reproduzida quando o jogador estiver segurando o item necessário e não deve ser reproduzida novamente depois que a porta já estiver aberta. Para lidar com essa lógica, adicione um novo método
CheckCinematic()à definição de classedoor_open_cinematic_manager. Essa função leva o jogador para dentro doDoorVolumee verifica se ele possui os itens necessários.Verse# Check if the player has the required item and the door isn't already open. CheckCinematic(Agent:agent):void=Em
CheckCinematic(), verifique se o jogador está segurando o item registrado noConditionalButtonusandoIsHoldingItem[]e verifique seIsDoorOpené falso para ter certeza de que a porta já não está destrancada. Nesse caso, executespawn{}e gere a funçãoPlayCinematic(), passando o jogador que está abrindo a porta. Sua funçãoCheckCinematic()completa deve ficar assim: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)}
Monitoramento do jogador e concessão de itens
Como o jogador precisa atacar com a arma enquanto está dentro de DoorVolume para abrir a porta, o dispositivo Gatilho de Entrada precisa estar monitorando esse evento. Siga as etapas abaixo para fazer com que o gatilho de entrada recepcione o momento em que o jogador bate com uma arma.
Adicione um novo método
OnPlayerEntersVolume()à definição de classedoor_open_cinematic_manager. Essa função recebe um agente e o registra noFireTriggerquando ele entra noDoorVolume.Verse# Registers the Agent with the FireTrigger when they enter the DoorVolume. OnPlayerEntersVolume(Agent:agent):void= Logger.Print("Agent entered DoorVolume")Em
OnPlayerEntersVolume(), registre o agente noFireTriggerchamandoRegister(). Em seguida, definaFireSubscriptioncomo o resultado da assinatura deFireTrigger.PressedEventemPlayCinematic(). Sua funçãoOnPlayerEntersVolume()completa deve ficar assim: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))}Quando um jogador sai do
DoorVolume, você precisa parar de monitorar a inscrição deFireTrigger.PressedEvent, pois o jogador somente deverá ser capaz de ativar a cinematografia se não estiver dentro do volume. Para lidar com isso, adicione um novo métodoOnPlayerExitsVolume()à definição de classedoor_open_cinematic_manager.Verse# Unregister the Agent with the FireTrigger when they leave the DoorVolume. OnPlayerExitsVolume(Agent:agent):void=Em
OnPlayerExitsVolume(), primeiro executeUnregister()para cancelar o registro do agente noFireTrigger. Em seguida, recupere a inscrição dentro deFireSubscriptione cancele-a. Seu métodoOnPlayerExitsVolume()completo deve ficar assim: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()Quando o jogador interage com o
ItemButton, ele recebe a arma necessária para progredir. Um marcador de objetivo também aparece em seu minimapa, mostrando o caminho até a porta, caso ele ainda não a tenha encontrado. Para lidar com isso, adicione um novo métodoGrantItem(), que recebe umagent, à definição de classedoor_open_cinematic_manager. Dentro deGrantItem(), chameGrantItemno agente que foi passado e habilite o marcador de objetivo. Seu métodoGrantItem()concluído deve ficar assim: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()
É hora de juntar tudo
Agora, você pode inscrever cada evento em sua função associada e testar seu código no jogo.
Em
OnBegin(), inscrevaItemGrantButton.InteractedWithEventna funçãoGrantItem(). Em seguida, inscrevaDoorVolume.AgentEntersEventeDoorVolume.AgentExitsEventem suas funções associadas. Sua funçãoOnBegin()deve ficar assim: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)Salve o código e compile-o.
No UEFN, selecione o dispositivo DoorOpenCinematicManager em seu nível. No Organizador, atribua cada referência editável ao dispositivo no nível.
Clique na imagem para ampliar.
Clique em Iniciar sessão na barra de ferramentas do UEFN para testar o nível. Ao testar o nível, a interação com o botão do item deve conceder ao jogador a arma necessária e adicionar um marcador de objetivo ao minimapa do jogador. Quando o jogador usar a arma no volume da porta, uma cinematografia deverá ser reproduzida, a porta deverá se abrir e o jogador deverá fazer a transição para a visão em primeira pessoa.
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 si só
Ao concluir este guia, você aprendeu a usar o Verse para reproduzir uma cena cinematográfica quando um jogador abre uma porta e como fazer a transição da câmera da terceira para a primeira pessoa.
Usando o que você aprendeu, tente o seguinte:
Você consegue fazer outros tipos de transições de câmera, como uma transição para uma exibição com rolagem lateral?
Que tal um botão dedicado para alterar o ângulo da câmera ou criar um nível que exija vários ângulos de câmera para progredir?
Você consegue usar gatilhos de entrada para penalidades negativas, como desafiar os jogadores a passar por uma seção sem pular e reproduzir uma cena cinematográfica se eles falharem?