Esta seção mostrará a você como adicionar um efeito visual (VFX) de batimento cardíaco à sua experiência que entregue o local de um adereço parado.
Quando os jogadores de uma equipe de adereços ficam ociosos por muito tempo, um efeito visual de batimento cardíaco é reproduzido nesse jogador, notificando a equipe de caçadores. Esse efeito visual é registrado em cada jogador da equipe de adereços quando eles surgem no jogo.
Você usará os dispositivos Gerador de Efeitos Visuais juntamente com Verse para implementar a funcionalidade de batimentos cardíacos. O que inclui:
-
Ativar os efeitos visuais.
-
Teletransportar o Gerador de Efeitos Visuais para os jogadores.
-
Criar uma IU mostrando os membros da equipe de adereços quanto tempo eles têm para se mover antes que o batimento cardíaco dispare.
O tutorial inclui trechos de Verse que mostram como executar as mecânicas de jogo necessárias nesse jogo. Siga as etapas a seguir e copie o script completo na etapa 6 deste tutorial.
Antes de começar
É uma prática recomendada manter os ativos e os dispositivos organizados em pastas para que sejam localizados mais facilmente. Você pode agrupar dispositivos por finalidade, local, tipo ou de qualquer outra forma que quiser.
Você pode mover ativos colocados para as pastas e os atores que cria.
No GIF acima, o dispositivo Gerador de Efeitos Visuais está sendo arrastando para a pasta "HeartBeatVFX" da equipe de adereços com motivos organizacionais. Você também pode clicar com o botão direito e selecionar Mover para para escolher a pasta para onde deseja mover o ativo.
Dispositivos utilizados:
Dispositivo Gerador de Efeitos Visuais
Crie um Gerador de Efeitos Visuais para cada jogador. Quando um jogador precisa dos efeitos visuais, eles serão teletransportados para o local do jogador. Quando não forem mais necessários, serão ocultados até que sejam necessários novamente.
Os Geradores de Efeitos Especiais neste modelo usam os efeitos visuais do Niagara para criar ativos personalizados que são mostrados durante o jogo. Os ativos de efeitos visuais neste tutorial são definidos para exibir um batimento cardíaco e revelar jogadores parados na equipe de adereços. Esses efeitos visuais aparecem sobre os adereços que ficam estáticos por pelo menos 15 segundos.
Você pode visitar a seção Efeitos Visuais da documentação para consultar vários tutoriais sobre como criar efeitos visuais de batimentos cardíacos. Você poderá depois usar o batimento cardíaco personalizado criado com o Gerador de Efeitos Visuais.
E poderá experimentar o efeito quando colocar o Gerador de Efeitos Visuais. No painel Detalhes, selecione o efeito personalizado no menu suspenso Efeito Visual Personalizado. A opção Substituição de efeito visual personalizado deve estar habilitada para o efeito visual ser exibido na janela de visualização.
Daqui, você pode personalizar ainda mais seu efeito no painel Detalhes adicionando cor e decidindo quando o efeito visual será reproduzido e por quem será visto.
Coloque esse dispositivo em um local que não seja visto pelos jogadores e configure as Opções do Usuário de forma que correspondam à tabela a seguir. Depois, copie e cole esse dispositivo de forma que corresponda ao número de jogadores que seu jogo permite.
| Opção | Valor | Explicação |
|---|---|---|
| Efeito Visual Personalizado | HeartBeatVFX | Define uma partícula personalizada para ser usada em vez de uma da lista predefinida. |
| Substituição de Efeito Visual Personalizado | True | Determina se os efeitos de desenvolvedor serão usados. |
| Habilitado Durante Fase | Apenas Jogo | Determina as fases do jogo durante as quais o dispositivo ficará habilitado. Um Gerador de Efeitos Visuais habilitado reproduzirá o efeito de partícula definido. |
Reproduza os efeitos de batimentos cardíacos em um local
Siga esta etapas para mover o dispositivo Gerador de Efeitos Visuais em Verse para reproduzir e interromper o efeito de batimento cardíaco da equipe de adereços.
-
Crie um novo arquivo Verse no seu projeto chamado heartbeat.verse. Esse não será um dispositivo Verse, então, você pode criá-lo como um arquivo Verse vazio.
-
Comece clicando duas vezes no arquivo Verse criado para adicionar os seguintes caminhos Verse para importar.
~~~(verse) using { /Fortnite.com/Characters } using { /Fortnite.com/Devices } using { /Fortnite.com/UI } using { /UnrealEngine.com/Temporary/SpatialMath } using { /UnrealEngine.com/Temporary/Diagnostics } using { /UnrealEngine.com/Temporary/UI } using { /Verse.org/Colors } using { /Verse.org/Simulation } ~~~
-
Esse código cria uma classe chamada
heartbeat_vfxem heartbeat.verse. A classeheartbeat_vfxcontém uma estrutura de dados para rastrear os objetos devfx_spawner_devicepor jogador, além das funções para definir o efeito visual para uma posição e redefini-lo.~~~(verse) log_heart_beat := class(log_channel){} # Essas mensagens são usadas para notificar um agente de adereço com uma mensagem (ou para ocultá-la) quando ele precisar se mover para evitar que seus batimentos cardíacos fiquem visíveis. HeartBeatWarningMessage
(Time:int):message = "Batimento cardíaco em {Time} segundos. Mova-se!" HeartBeatWarningClear :message = "" # Essa classe expõe as propriedades editáveis para os batimentos cardíacos para o dispositivo Verse prop_hunt. heart_beat := class (): Logger:log = log{Channel:=log_heart_beat} @editável # O número de segundos antes que um agente de adereço deva se mover até que o batimento cardíaco revele sua posição. MoveTime:float = 15.0 @editável # O tempo em segundos restante até que o aviso do batimento cardíaco apareça. Não deve ser maior que "HeartBeatTimer". WarningTime:float = 5.0 @editável # Uma matriz de dispositivos de efeitos visuais de batimentos cardíacos. Existe uma por jogador. AgentVFX:[]heartbeat_vfx = array{} @editável # O dispositivo Reprodutor de Rádio usado para reproduzir os efeitos sonoros (SFX) de batimentos cardíacos. SFXPlayer:radio_device = radio_device{} # Esse mapa associa uma IU para exibir o aviso de batimentos cardíacos para cada agente adereço. var WarningUI:[agent]heartbeat_warning_ui = map{} # Rastreia quantos jogadores têm um batimento cardíaco ativo, para que possamos gerenciar o dispositivo de efeitos sonoros. var NumberOfHeartBeats:int = 0 # Configura a IU de batimento cardíaco para o agente. SetUpUI(PropAgent:agent):void = if: not WarningUI[PropAgent] AsPlayer := player[PropAgent] PlayerUI := GetPlayerUI[AsPlayer] then: UIData:heartbeat_warning_ui = heartbeat_warning_ui{} UIData.CreateCanvas() PlayerUI.AddWidget(UIData.Canvas, player_ui_slot{ZOrder := 1}) if (set WarningUI[PropAgent] = UIData) {} # Ativa os efeitos visuais e sonoros de batimentos cardíacos para o jogador especificado. Enable(PropAgent:agent, HeartBeatVFXData:heartbeat_vfx):void = if: # Obtém o personagem que é usado para encontrar a posição do agente de adereço na cena. Character := PropAgent.GetFortCharacter[] then: # Define a posição do efeito visual de batimento cardíaco para a posição do agente adereço. HeartBeatVFXData.Activate(Character.GetTransform()) # Incrementa a contagem de batimentos cardíacos e, se esse for o primeiro batimento cardíaco reproduzido, precisamos reproduzir o áudio para iniciá-lo. set NumberOfHeartBeats += 1 if (NumberOfHeartBeats = 1) then SFXPlayer.Play() # Registra o agente adereço para o dispositivo de reprodução de áudio, para que o áudio do batimento cardíaco seja reproduzido dessa posição. SFXPlayer.Register(PropAgent) else: Logger.Print("Personagem, índice ou HeartBeatVFXData não encontrado. Não é possível iniciar batimento cardíaco.") # Limpa os efeitos visuais e sonoros do batimento cardíaco para o agente adereço especificado. Disable(PropAgent:agent, HeartBeatVFXData:heartbeat_vfx):void = Logger.Print("Desabilitando batimento cardíaco.") # Desativa os efeitos visuais. HeartBeatVFXData.Deactivate() # Cancela o registro do agente adereço do dispositivo de reprodução de áudio, fazendo com que o áudio do batimento cardíaco seja interrompido. SFXPlayer.Unregister(PropAgent) # Reduz o contador de batimentos cardíacos. Esse contador nunca deve chegar a menos que 0. set NumberOfHeartBeats -= 1 if (NumberOfHeartBeats < 0) then set NumberOfHeartBeats = 0 # Limpa todos os efeitos visuais e sonoros de batimentos cardíacos de todos os agentes de adereços. DisableAll():void = Logger.Print("Desabilitando todos os batimentos cardíacos.") # Itera por todos os efeitos visuais e move-os para 0,0,0. for (HeartBeatVFXDevice : AgentVFX): HeartBeatVFXDevice.Deactivate() # Cancela o registro de todos os jogadores do áudio do batimento cardíaco. SFXPlayer.UnregisterAll() # Reinicializa o contador de batimentos cardíacos para 0. set NumberOfHeartBeats = 0 # A classe "heartbeat_warning_ui" contém uma estrutura de dados para rastrear a tela de IU e text_block por jogador, além da função para criar uma nova tela de IU de aviso de batimento cardíaco. heartbeat_warning_ui := class: var Canvas:canvas = canvas{} var Text:text_block = text_block{} # Cria a tela de IU para a mensagem de aviso. CreateCanvas():void = set Text = text_block{DefaultTextColor := NamedColors.White, DefaultShadowColor := NamedColors.Black} set Canvas = canvas: Slots := array: canvas_slot: Anchors := anchors{Minimum := vector2{X := 0.5, Y := 0.75}, Maximum := vector2{X := 0.5, Y := 0.75}} Offsets := margin{Top := 0.0, Left := 0.0, Right := 0.0, Bottom := 0.0} Alignment := vector2{X := 0.5, Y := 1.0} SizeToContent := true Widget := Text ~~~ -
Esse código cria o método
Activate()na classeheartbeat_vfxque toma um argumento de transformação e move o dispositivo Gerador de Efeitos Visuais para essetransform.~~~(verse) # A classe "heartbeat_vfx" contém uma estrutura de dados para rastrear os objetos de "vfx_spawner_device" por jogador, além das funções para definir o efeito visual para uma posição e redefini-lo. heartbeat_vfx := class
: @editável # O dispositivo de efeitos visuais para cada batimento cardíaco. VFXDevice:vfx_spawner_device = vfx_spawner_device{} # Essas linhas são usadas para posicionar o batimento cardíaco acima da cabeça do agente de adereço. HeartBeatVFXOffset:vector3 = vector3{X := 0.0, Y := 0.0, Z := 110.0} # Define a posição do efeito visual de batimento cardíaco e depois habilita o efeito visual. Activate(Transform:transform):void = VFXPosition := Transform.Translation + HeartBeatVFXOffset if (VFXDevice.TeleportTo[VFXPosition, Transform.Rotation]): VFXDevice.Enable() ~~~ -
Esse código cria o método
Deactivate()na classeheartbeat_vfxque desabilita o dispositivo Gerador de Efeitos Visuais e, portanto, oculta os visuais de batimentos cardíacos.~~~(verse) # A classe "heartbeat_vfx" contém uma estrutura de dados para rastrear os objetos de "vfx_spawner_device" por jogador, além das funções para definir o efeito visual para uma posição e redefini-lo. heartbeat_vfx := class
: @editável # O dispositivo de efeitos visuais para cada batimento cardíaco. VFXDevice:vfx_spawner_device = vfx_spawner_device{} # Essas linhas são usadas para posicionar o batimento cardíaco acima da cabeça do agente de adereço. HeartBeatVFXOffset:vector3 = vector3{X := 0.0, Y := 0.0, Z := 110.0} # Define a posição do efeito visual de batimento cardíaco e depois habilitar o efeito visual. Activate(Transform:transform):void = VFXPosition := Transform.Translation + HeartBeatVFXOffset if (VFXDevice.TeleportTo[VFXPosition, Transform.Rotation]): VFXDevice.Enable() # Desabilita os efeitos visuais, ocultando os visuais de batimentos cardíacos. Deactivate():void = VFXDevice.Disable() ~~~
Exiba o aviso de batimento cardíaco a um jogador
Siga estas etapas para configurar uma IU personalizada com um bloco de texto que exibirá a mensagem de aviso de batimento cardíaco. Consulte Interfaces de usuário no jogo para saber mais sobre a criação de IU personalizada e outros componentes de IU Verse.
-
As duas constantes abaixo controlam o texto que será exibido aos jogadores da equipe de adereços em diferentes momentos no jogo.
-
A constante
HeartBeatWarningMessageé uma função que toma uminte retorna amessage(mensagem) de tipo. Esse tipo é usado em elementos de IU porque pode ser localizado. Esse é o texto que os jogadores verão quando precisarem se mover para evitar que o efeito de batimento cardíaco revele sua posição. -
A constante
HeartBeatWarningClearé umamessagevazia que será exibida para que os jogadores não mais vejam a mensagem de aviso.~~~(verse) # Essas mensagens são usadas para notificar um agente de adereço com uma mensagem (ou para ocultá-la) quando ele precisar se mover para evitar que seus batimentos cardíacos fiquem visíveis. HeartBeatWarningMessage
(Time:int):message = "Batimento cardíaco em {Time} segundos. Mova-se!" HeartBeatWarningClear :message = "" ~~~
-
-
Crie uma nova classe chamada
heartbeat_warning_uiem heartbeat.verse. A classe "heartbeat_warning_ui" contém uma estrutura de dados para rastrear a tela de IU e text_block por jogador, além da função para criar uma nova tela de IU de aviso de batimento cardíaco.~~~(verse) # A classe "heartbeat_warning_ui" contém uma estrutura de dados para rastrear a tela de IU e text_block por jogador, além da função para criar uma nova tela de IU de aviso de batimento cardíaco. heartbeat_warning_ui := class: var Canvas:canvas = canvas{} var Text:text_block = text_block{} # Cria a tela de IU para a mensagem de aviso. CreateCanvas():void = set Text = text_block{DefaultTextColor := NamedColors.White, DefaultShadowColor := NamedColors.Black} set Canvas = canvas: Slots := array: canvas_slot: Anchors := anchors{Minimum := vector2{X := 0.5, Y := 0.75}, Maximum := vector2{X := 0.5, Y := 0.75}} Offsets := margin{Top := 0.0, Left := 0.0, Right := 0.0, Bottom := 0.0} Alignment := vector2{X := 0.5, Y := 1.0} SizeToContent := true Widget := Text ~~~
Gerencie os efeitos de batimentos cardíacos
Siga estas etapas para criar o gerenciador de batimentos cardíacos.
-
O código a seguir cria uma classe chamada
heart_beatem heartbeat.verse. Essa classe expõe as propriedades editáveis para os batimentos cardíacos para o dispositivo prop_hunt e gerencia os efeitos de batimentos cardíacos.~~~(verse) log_heart_beat := class(log_channel){} Essa classe expõe as propriedades editáveis para os batimentos cardíacos para o dispositivo prop_hunt. heart_beat := class
(): Logger:log = log{Channel:=log_heart_beat} @editable MoveTime:float = 15.0 ~~~ - Esse código adiciona as seguintes propriedades editáveis à classe
heart_beat.-
Esse código controla o tempo em segundos antes que um agente adereço deva se mover até que o batimento cardíaco revele sua posição.
~~~(verse) @editable MoveTime:float = 15.0
1. Esse código controla o tempo em segundos restantes antes que as palavras apareçam na tela para avisar um membro da equipe de adereços e diga a ele para se mover antes que os batimentos cardíacos disparem. ~~~(verse) @editable WarningTime:float = 5.0-
Esse código é uma matriz de dispositivos de efeitos visuais de batimentos cardíacos. Existe uma por jogador.
@editable AgentVFX:[]heartbeat_vfx = array{} -
Nesse código, o dispositivo Reprodutor de Rádio é usado para reproduzir os efeitos sonoros de batimentos cardíacos.
~~~(verse) @editable SFXPlayer:radio_device = radio_device{} ~~~
-
-
-
Esse código mapeia uma IU para exibir o aviso de batimento cardíaco para cada agente adereço.
# Esse mapa associa uma IU para exibir o aviso de batimentos cardíacos para cada agente de adereço. var WarningUI:[agent]heartbeat_warning_ui = map{} -
Esse código rastreia quantos jogadores têm um batimento cardíaco ativo, para que possamos gerenciar o dispositivo de efeitos sonoros.
~~~(verse) # Rastreia quantos jogadores têm um batimento cardíaco ativo, para que possamos gerenciar o dispositivo de efeitos sonoros. var NumberOfHeartBeats:int = 0 ~~~
-
Esse código mostra a IU de aviso para os jogadores.
~~~(verse) # Configura a IU de batimento cardíaco para o agente. SetUpUI(PropAgent:agent):void = if: not WarningUI[PropAgent] AsPlayer := player[PropAgent] PlayerUI := GetPlayerUI[AsPlayer] then: UIData:heartbeat_warning_ui = heartbeat_warning_ui{} UIData.CreateCanvas() PlayerUI.AddWidget(UIData.Canvas, player_ui_slot{ZOrder := 1}) if (set WarningUI[PropAgent] = UIData) {} ~~~
-
Esse código ativa os efeitos visuais e sonoros para o jogador especificado.
~~~(verse) # Ativa os efeitos visuais e sonoros de batimentos cardíacos para o jogador especificado. Enable(PropAgent:agent, HeartBeatVFXData:heartbeat_vfx):void = if: # Obtém o personagem que é usado para encontrar a posição do agente de adereço na cena. Character := PropAgent.GetFortCharacter[] then: # Define a posição do efeito visual de batimento cardíaco para a posição do agente de adereço. HeartBeatVFXData.Activate(Character.GetTransform()) # Incrementa a contagem de batimentos cardíacos e, se esse for o primeiro batimento cardíaco reproduzido, precisamos reproduzir o áudio para iniciá-lo. set NumberOfHeartBeats += 1 if (NumberOfHeartBeats = 1) then SFXPlayer.Play() # Registra o agente de adereço no dispositivo de reprodução de áudio, para que o áudio do batimento cardíaco seja reproduzido dessa posição. SFXPlayer.Register(PropAgent) else: Logger.Print("Personagem, índice ou HeartBeatVFXData não encontrado. Não é possível iniciar batimento cardíaco.") ~~~
-
Esse código cria um método para desabilitar os efeitos visuais e sonoros para um jogador, e outro para desabilitá-los para todos os jogadores.
~~~(verse) # Limpa os efeitos visuais e sonoros do batimento cardíaco para o agente adereço especificado. Disable(PropAgent:agent, HeartBeatVFXData:heartbeat_vfx):void = Logger.Print("Desabilitando batimento cardíaco.") # Desativa os efeitos visuais. HeartBeatVFXData.Deactivate() # Cancela o registro do agente de adereço do dispositivo de reprodução de áudio, fazendo com que o áudio do batimento cardíaco seja interrompido. SFXPlayer.Unregister(PropAgent) # Reduz o contador de batimentos cardíacos. Esse contador nunca deve chegar a menos que 0. set NumberOfHeartBeats -= 1 if (NumberOfHeartBeats < 0) then set NumberOfHeartBeats = 0 # Limpa todos os efeitos visuais e sonoros de batimentos cardíacos de todos os agentes de adereços. DisableAll():void = Logger.Print("Desabilitando todos os batimentos cardíacos.") # Itera por todos os efeitos visuais e move-os para 0,0,0. for (HeartBeatVFXDevice : AgentVFX): HeartBeatVFXDevice.Deactivate() # Cancela o registro de todos os jogadores do áudio do batimento cardíaco. SFXPlayer.UnregisterAll() # Reinicializa o contador de batimentos cardíacos para 0. set NumberOfHeartBeats = 0 ~~~