In questa sezione ti mostreremo come aggiungere al tuo gameplay dei VFX (effetto visivo) personalizzati per il battito cardiaco che rivelano la posizione di un oggetto scenografico non in movimento.
Quando i giocatori del team oggetti scenografici rimangono inattivi per troppo tempo, un effetto visivo di battito cardiaco viene riprodotto su quei giocatori, avvisando il team cacciatori. Questo effetto visivo viene registrato su tutti i giocatori del team oggetti scenografici, nel momento in cui si generano nel gioco.
Utilizzerai i dispositivi generatore VFX insieme a Verse per implementare la funzionalità battito cardiaco. Questo include:
-
Attivare gli effetti visivi.
-
Teletrasportare ai giocatori il generatore VFX.
-
Creare un'UI che mostri ai membri del team oggetti scenografici quanto tempo hanno a disposizione per muoversi prima che si attivi il battito cardiaco.
Questo tutorial include snippet di Verse che mostrano come eseguire le meccaniche di gameplay necessarie in questo gioco. Segui i passaggi seguenti e copia lo script completo al passaggio 6 di questo tutorial.
Prima di iniziare
È buona norma organizzare gli asset e i dispositivi in cartelle, in modo da facilitarne la localizzazione. Puoi raggruppare i dispositivi in base allo scopo, alla posizione, al tipo o a qualsiasi altro criterio preferito.
Puoi spostare gli asset posizionati nelle cartelle e negli attori che hai creato.
Nella gif qui sopra, il dispositivo generatore VFX viene trascinato nella cartella HeartBeatVFX del team oggetti scenografici per motivi di organizzazione. Puoi anche fare clic con il tasto destro del mouse e selezionare Sposta in per scegliere la cartella in cui vuoi che l'asset venga spostato.
Dispositivi utilizzati:
- ~ 16 generatori VFX
Dispositivo generatore VFX
Crea un generatore VFX per ogni giocatore. Quando un giocatore ha bisogno del VFX, quest'ultimo viene teletrasportato nella sua posizione. Quando non è più richiesto, verrà nascosto fino a quando non sarà di nuovo necessario.
I generatori VFX di questo modello utilizzano i VFX Niagara per creare asset personalizzati da mostrare durante il gameplay. Gli asset VFX utilizzati in questo tutorial sono impostati per visualizzare un battito cardiaco per rivelare i giocatori immobili del team oggetti scenografici. Questo VFX apparirà su oggetti scenografici che sono rimasti statici per almeno 15 secondi.
Puoi visitare la sezione Effetti visivi della nostra documentazione, dove troverai numerosi tutorial sulla modalità di creazione di VFX del battito cardiaco. Puoi quindi utilizzare il battito personalizzato creato con il generatore VFX.
Puoi provare a eseguire questa operazione quando posizioni un generatore VFX. Nel pannello Dettagli, seleziona l'effetto personalizzato dal menu a discesa Effetto visivo personalizzato. Assicurati di abilitare Override effetto visivo personalizzato affinché il VFX selezionato venga visualizzato nella viewport.
Da qui, puoi personalizzare ulteriormente il tuo effetto dal pannello Dettagli, aggiungendo il colore e decidendo quando il VFX verrà riprodotto e da chi sarà visualizzato.
Posiziona questo dispositivo in un luogo non visibile ai giocatori e configura le Opzioni utente in modo che corrispondano alla tabella seguente. Quindi, copia e incolla questo dispositivo affinché corrisponda al numero di giocatori consentito dal tuo gameplay.
| Opzione | Valore | Spiegazione |
|---|---|---|
| Effetto visivo personalizzato | HeartBeatVFX | Definisce una particella personalizzata invece di usarne una da un elenco predefinito. |
| Override effetto visivo personalizzato | True | Determina se usare gli effetti sviluppatore. |
| Abilitato nella fase | Solo gameplay | Determina le fasi di gioco durante le quali il dispositivo viene abilitato. Un generatore VFX abilitato riprodurrà l'effetto particellare definito. |
Riproduci gli effetti del battito cardiaco in una posizione
Segui questi passaggi per spostare il dispositivo generatore VFX in Verse per riprodurre e fermare l'effetto del battito cardiaco sui giocatori del team oggetti scenografici.
-
Crea un nuovo file Verse nel progetto, denominato heartbeat.verse. Questo non sarà un dispositivo Verse, quindi puoi crearlo come un file Verse vuoto.
-
Inizia facendo due volte clic sul file di Verse creato per aggiungere i seguenti Percorsi Verse da importare.
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 } -
Questo codice crea una classe denominata
heartbeat_vfxin heartbeat.verse. La classeheartbeat_vfxcontiene una struttura di dati per tracciare gli oggettivfx_spawner_deviceper giocatore, nonché le funzioni per impostare il VFX in una posizione o resettarlo.log_heart_beat := class(log_channel){} # Questi messaggi vengono utilizzati per notificare a un agente oggetto scenografico un messaggio (o per nasconderlo) quando deve muoversi per evitare che il suo battito cardiaco diventi visibile. HeartBeatWarningMessage<localizes>(Time:int):message = "Battito cardiaco tra {Time} secondi. Muoviti!" HeartBeatWarningClear<localizes>:message = "" # Questa classe espone le proprietà modificabili del battito cardiaco al dispositivo prop_hunt di Verse. heart_beat := class<concrete>(): Logger:log = log{Channel:=log_heart_beat} @editable # Il numero di secondi prima che un agente oggetto scenografico si muova prima che il battito cardiaco riveli la sua posizione. MoveTime:float = 15.0 @editable # I secondi rimanenti prima che venga visualizzato l'avviso del battito cardiaco. Non deve essere > di HeartBeatTimer. WarningTime:float = 5.0 @editable # Un array di dispositivi VFX del battito cardiaco. Ce n'è uno per ogni giocatore. AgentVFX:[]heartbeat_vfx = array{} @editable # Il dispositivo lettore radiofonico è utilizzato per riprodurre gli effetti sonori del battito cardiaco (SFX). SFXPlayer:radio_device = radio_device{} # Questa mappa associa un'UI per la visualizzazione dell'avviso del battito cardiaco a ogni agente oggetto scenografico. var WarningUI:[agent]heartbeat_warning_ui = map{} # Tiene traccia di quanti giocatori hanno un battito cardiaco attivo in modo da poter gestire il dispositivo SFX. var NumberOfHeartBeats:int = 0 # Imposta l'UI del battito cardiaco per l'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) {} # Attiva i VFX e gli SFX del battito cardiaco per il giocatore specificato. Enable(PropAgent:agent, HeartBeatVFXData:heartbeat_vfx):void = if: # Ottieni il personaggio, che viene utilizzato per trovare la posizione dell'agente oggetto scenografico nella scena. Character := PropAgent.GetFortCharacter[] then: # Imposta la posizione del battito cardiaco di VFX sulla posizione dell'agente oggetto scenografico. HeartBeatVFXData.Activate(Character.GetTransform()) # Aumenta il conteggio del battito cardiaco e, se questo è il primo battito in riproduzione, dobbiamo riprodurre il suono per farlo partire. set NumberOfHeartBeats += 1 if (NumberOfHeartBeats = 1) then SFXPlayer.Play() # Registra l'agente oggetto scenografico nel dispositivo riproduttore audio in modo che l'audio del battito cardiaco venga riprodotto da quella posizione. SFXPlayer.Register(PropAgent) else: Logger.Print("Character, Index, o HeartBeatVFXData non trovati. Impossibile avviare il battito cardiaco") # Cancella i VFX e gli SFX del battito cardiaco per l'agente oggetto scenografico specificato. Disable(PropAgent:agent, HeartBeatVFXData:heartbeat_vfx):void = Logger.Print("Disabilitazione battito cardiaco.") # Disattiva la grafica VFX. HeartBeatVFXData.Deactivate() # Annulla la registrazione dell'agente oggetto scenografico dal dispositivo riproduttore audio, causando l'interruzione dell'audio del battito cardiaco. SFXPlayer.Unregister(PropAgent) # Diminuisci il contatore dei battiti cardiaci. Questo contatore non deve mai scendere sotto lo 0. set NumberOfHeartBeats -= 1 if (NumberOfHeartBeats < 0) then set NumberOfHeartBeats = 0 # Cancella tutti i VFX e gli SFX del battito cardiaco per tutti gli agenti oggetti scenografici. DisableAll():void = Logger.Print("Disabilitazione di tutti i battiti cardiaci.") # Scorri tutti i VFX e spostali a 0,0,0. for (HeartBeatVFXDevice : AgentVFX): HeartBeatVFXDevice.Deactivate() # Annulla la registrazione di tutti i giocatori dal suono del battito cardiaco. SFXPlayer.UnregisterAll() # Reinizializza il contatore del battito cardiaco a 0 set NumberOfHeartBeats = 0 # La classe heartbeat_warning_ui contiene una struttura di dati per tenere traccia del canvas UI e del text_block per giocatore, nonché la funzione per creare un nuovo canvas UI per l'avviso del battito cardiaco. heartbeat_warning_ui := class: var Canvas:canvas = canvas{} var Text:text_block = text_block{} # Crea il canvas UI per il messaggio di avviso. 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 := Testo -
Questo codice crea un metodo
Activate()nella classeheartbeat_vfxche prende un argomento di trasformazione e sposta il dispositivo generatore VFX sutransform.# La classe heartbeat_vfx contiene una struttura di dati per tracciare la radice del VFX e gli oggetti vfx_spawner_device per giocatore, nonché le funzioni per impostare il VFX in una posizione o resettarlo. heartbeat_vfx := class<concrete>: @editable # Il dispositivo VFX per ogni battito cardiaco. VFXDevice:vfx_spawner_device = vfx_spawner_device{} # Questo offset viene utilizzato per posizionare il battito cardiaco sopra la testa dell'agente oggetto scenografico. HeartBeatVFXOffset:vector3 = vector3{X := 0.0, Y := 0.0, Z := 110.0} # Imposta la posizione del VFX del battito cardiaco e lo attiva. Activate(Transform:transform):void = VFXPosition := Transform.Translation + HeartBeatVFXOffset if (VFXDevice.TeleportTo[VFXPosition, Transform.Rotation]): VFXDevice.Enable() -
Questo codice crea un metodo
Deactivate()nella classeheartbeat_vfxche disabilita il dispositivo generatore VFX e quindi nasconde la grafica del battito cardiaco.# La classe heartbeat_vfx contiene una struttura di dati per tracciare la radice del VFX e gli oggetti vfx_spawner_device per giocatore, nonché le funzioni per impostare il VFX in una posizione o resettarlo. heartbeat_vfx := class<concrete>: @editable # Il dispositivo VFX per ogni battito cardiaco. VFXDevice:vfx_spawner_device = vfx_spawner_device{} # Questo offset viene utilizzato per posizionare il battito cardiaco sopra la testa dell'agente oggetto scenografico. HeartBeatVFXOffset:vector3 = vector3{X := 0.0, Y := 0.0, Z := 110.0} # Imposta la posizione del VFX del battito cardiaco e lo attiva. Activate(Transform:transform):void = VFXPosition := Transform.Translation + HeartBeatVFXOffset if (VFXDevice.TeleportTo[VFXPosition, Transform.Rotation]): VFXDevice.Enable() # Disabilita VFX, nascondendo la grafica del battito cardiaco. Deactivate():void = VFXDevice.Disable()
Mostrare l'avviso di battito cardiaco a un giocatore
Segui questi passaggi per impostare un'UI personalizzata con un blocco di testo che mostri il messaggio di avviso del battito cardiaco. Per saperne di più sulla creazione di un'UI personalizzata e di altri componenti UI di Verse, fai riferimento a Interfacce utente in gioco.
-
Le due costanti sottostanti controllano il testo che verrà mostrato ai giocatori del team oggetti scenografici in momenti diversi del gioco.
-
La costante
HeartBeatWarningMessageè una funzione che prende uninte restituisce il tipomessage. Questo tipo è utilizzato negli elementi UI perché può essere localizzato. Questo è il testo che i giocatori vedranno quando dovranno muoversi per evitare che l'effetto del battito cardiaco riveli la loro posizione. -
La costante
HeartBeatWarningClearè unmessagevuoto che verrà mostrato in modo che i giocatori non vedano più il messaggio di avviso.
# Questi messaggi vengono utilizzati per notificare a un agente oggetto scenografico un messaggio (o per nasconderlo) quando deve muoversi per evitare che il suo battito cardiaco diventi visibile. HeartBeatWarningMessage<localizes>(Time:int):message = "Battito cardiaco tra {Time} secondi. Muoviti!" HeartBeatWarningClear<localizes>:message = "" -
-
Crea una nuova classe denominata
heartbeat_warning_uiin heartbeat.verse. La classe heartbeat_warning_ui contiene una struttura di dati per tenere traccia del canvas UI, del text_block per giocatore e la funzione per creare un nuovo canvas UI per l'avviso del battito cardiaco.# La classe heartbeat_warning_ui contiene una struttura di dati per tenere traccia del canvas UI e del text_block per giocatore, nonché la funzione per creare un nuovo canvas UI per l'avviso del battito cardiaco. heartbeat_warning_ui := class: var Canvas:canvas = canvas{} var Text:text_block = text_block{} # Crea il canvas UI per il messaggio di avviso. 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 := Testo
Gestire gli effetti del battito cardiaco
Segui questi passaggi per creare la gestione battito cardiaco.
-
Questo codice crea una classe denominata
heart_beatin heartbeat.verse. Questa classe espone le proprietà modificabili del battito cardiaco al dispositivo prop_hunt e gestisce gli effetti del battito cardiaco.log_heart_beat := class(log_channel){} # Questa classe espone le proprietà modificabili del battito cardiaco al dispositivo prop_hunt. heart_beat := class<concrete>(): Logger:log = log{Channel:=log_heart_beat} @editable MoveTime:float = 15.0 - Questo codice aggiunge le seguenti proprietà modificabili alla classe
heart_beat.-
Questo codice controlla i secondi prima che un agente oggetto scenografico si muova prima che l'effetto battito cardiaco riveli la sua posizione.
@editable MoveTime:float = 15.0-
Questo codice controlla i secondi rimanenti prima che sullo schermo vengano visualizzate delle parole per avvertire un membro del team oggetti scenografici e dirgli di muoversi prima che si attivi il battito cardiaco.
@editable WarningTime:float = 5.0 -
Questo codice è un array di dispositivi VFX del battito cardiaco. Ce n'è uno per ogni giocatore.
@editable AgentVFX:[]heartbeat_vfx = array{} -
In questo codice, il dispositivo lettore radiofonico è utilizzato per riprodurre gli effetti sonori del battito cardiaco (SFX).
@editable SFXPlayer:radio_device = radio_device{}
-
-
-
Questa mappa di codice associa un'UI per la visualizzazione dell'avviso del battito cardiaco a ogni agente oggetto scenografico.
# Questa mappa associa un'UI per la visualizzazione dell'avviso del battito cardiaco a ogni agente oggetto scenografico. var WarningUI:[agent]heartbeat_warning_ui = map{} -
Questo codice tiene traccia di quanti giocatori hanno un battito cardiaco attivo in modo da poter gestire il dispositivo SFX.
# Tiene traccia di quanti giocatori hanno un battito cardiaco attivo in modo da poter gestire il dispositivo SFX. var NumberOfHeartBeats:int = 0 -
Questo codice mostra l'UI di avviso ai giocatori.
# Imposta l'UI del battito cardiaco per l'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) {} -
Questo codice attiva gli effetti visivi (VFX) e sonori (SFX) per il giocatore specificato.
# Attiva i VFX e gli SFX del battito cardiaco per il giocatore specificato. Enable(PropAgent:agent, HeartBeatVFXData:heartbeat_vfx):void = if: # Ottieni il personaggio, che viene utilizzato per trovare la posizione dell'agente oggetto scenografico nella scena. Character := PropAgent.GetFortCharacter[] then: # Imposta la posizione del battito del cuore di VFX sulla posizione dell'agente oggetto scenografico. HeartBeatVFXData.Activate(Character.GetTransform()) # Aumenta il conteggio del battito cardiaco e, se questo è il primo battito in riproduzione, dobbiamo riprodurre il suono per farlo partire. set NumberOfHeartBeats += 1 if (NumberOfHeartBeats = 1) then SFXPlayer.Play() # Registra l'agente oggetto scenografico nel dispositivo riproduttore audio in modo che l'audio del battito cardiaco venga riprodotto da quella posizione. SFXPlayer.Register(PropAgent) else: Logger.Print("Character, Index, o HeartBeatVFXData non trovati. Impossibile avviare il battito cardiaco") -
Questo codice crea un metodo per disabilitare i VFX e gli SFX per un giocatore e un altro metodo per disabilitarli per tutti i giocatori.
# Cancella i VFX e gli SFX del battito cardiaco per l'agente oggetto scenografico specificato. Disable(PropAgent:agent, HeartBeatVFXData:heartbeat_vfx):void = Logger.Print("Disabilitazione battito cardiaco.") # Disattiva la grafica VFX. HeartBeatVFXData.Deactivate() # Annulla la registrazione dell'agente oggetto scenografico dal dispositivo riproduttore audio, causando l'interruzione dell'audio del battito cardiaco. SFXPlayer.Unregister(PropAgent) # Diminuisci il contatore dei battiti cardiaci. Questo contatore non deve mai scendere sotto lo 0. set NumberOfHeartBeats -= 1 if (NumberOfHeartBeats < 0) then set NumberOfHeartBeats = 0 # Cancella tutti i VFX e gli SFX del battito cardiaco per tutti gli agenti oggetti scenografici. DisableAll():void = Logger.Print("Disabilitazione di tutti i battiti cardiaci.") # Scorri tutti i VFX e spostali a 0,0,0. for (HeartBeatVFXDevice : AgentVFX): HeartBeatVFXDevice.Deactivate() # Annulla la registrazione di tutti i giocatori dal suono del battito cardiaco. SFXPlayer.UnregisterAll() # Reinizializza il contatore del battito cardiaco a 0 set NumberOfHeartBeats = 0