Le visuali giocano un ruolo cruciale nell'aspetto e nell'atmosfera di un gioco. Le visuali in terza persona aiutano i giocatori a valutare lo spazio a disposizione, mentre quelle in prima persona permettono di vedere da vicino il mondo di gioco. Cambiare visuale durante il gioco può evocare sensazioni diverse e la transizione tra più visuali può aggiungere notevole varietà all'esperienza di gioco. Ad esempio, puoi creare una divertente sfida platform utilizzando una visuale fissa per creare una sezione a scorrimento laterale.
In UEFN puoi usare Verse per gestire i cambi di visuale. Utilizzando i dispositivi per ascoltare gli eventi, puoi aggiungere una telecamera a un giocatore per cambiare la sua visuale quando l'evento si attiva. In questo esempio, aggiungerai un dispositivo Visuale rotante a un giocatore alla fine di una cinematica. Puoi modificare le impostazioni di una visuale rotante per simulare una visuale in prima persona, mentre aggiungendo la visuale alla fine di un filmato puoi creare una transizione fluida dalla terza alla prima persona. Per arricchire il gameplay, questo esempio prevede che il filmato si attivi quando il giocatore afferra un'arma e la muove verso la porta. Puoi adattare questo esempio alle tue esigenze, ad esempio un giocatore che muove una chiave inglese per riparare la porta difettosa di una nave o un martello per distruggere un masso e rivelare un'area segreta. Puoi anche applicare questi concetti in modo più ampio per creare momenti di gioco interessanti, come un'inquadratura larga quando si entra in una nuova zona, il passaggio a una visuale dall'alto quando il giocatore deve risolvere un enigma o una visuale in prima persona in un'inquietante esperienza horror.
Segui questo tutorial per imparare a creare un dispositivo Verse che fa passare il giocatore dalla terza alla prima persona con una sequenza cinematica quando apre una porta.
Questo esempio utilizza le seguenti funzionalità del linguaggio:
Classe: in questo esempio viene creata una classe Verse che attiva una cinematica quando un giocatore apre una porta.
Opzione: puoi memorizzare gli eventi sottoscrivibili nelle variabili di opzione e annullare le sottoscrizioni a tali eventi in un secondo momento.
Questo esempio utilizza le seguenti API:
Sottoscrivibile: ti iscriverai agli eventi per sapere quando un giocatore entra in un volume vicino alla porta e per assegnare ai giocatori un oggetto quando interagiscono con un pulsante.
Configurazione del livello
Questo esempio utilizza i seguenti dispositivi:
1 dispositivo Pulsante: quando il giocatore interagisce con il pulsante, riceve una spada da un dispositivo che assegna oggetti.
1 dispositivo Assegnatore oggetti: l'assegnatore di oggetti assegna al giocatore la spada di cui ha bisogno per attraversare la porta.
1 dispositivo Pulsante condizionale: l'arma richiesta è impostata come Oggetto chiave del pulsante condizionale in modo che il giocatore non possa attraversare la porta se non ha la spada richiesta.
1 dispositivo Attivatore input: apre la porta quando il giocatore attacca ascoltando l'azione di input Spara. Avviene solo quando il giocatore si trova all'interno del dispositivo Volume, se ha la spada e se la porta non è già aperta.
1 dispositivo Volume: per evitare che un qualsiasi attacco con la spada apra la porta, il dispositivo Volume fa in modo che il giocatore debba trovarsi vicino alla porta per aprirla.
1 dispositivo Sequenza cinematica: per creare una transizione fluida dalla terza alla prima persona, riprodurrai una sequenza cinematica che mostra l'apertura della porta e riposizionerai la visuale per allinearla al punto di vista del giocatore in prima persona.
1 dispositivo Visuale rotante per creare una visuale in prima persona per il giocatore utilizzerai una visuale rotante posizionata all'interno del petto del personaggio per imitare la visuale in prima persona. Questo cambio di visuale avviene solo dopo la riproduzione della sequenza cinematica, quando il giocatore apre la porta.
1 dispositivo Blocco: blocca la porta per evitare che il giocatore la apra prima di avere l'arma richiesta.
1 dispositivo Indicatore mappa: visualizza la posizione della porta sulla minimappa quando il giocatore prende l'arma.
Segui questi passaggi per configurare il livello:
Assegnatore oggetti e Pulsante
Per assegnare al giocatore l'arma di cui ha bisogno per aprire la porta, utilizzerai un assegnatore di oggetti e un dispositivo Pulsante. Quando il giocatore interagisce con il pulsante, l'assegnatore di oggetti gli assegna l'arma. Per aggiungere questi elementi, segui i passaggi:
Aggiungi un dispositivo Assegnatore oggetti al livello.
Seleziona l'assegnatore di oggetti nell'Outliner. Nel pannello Dettagli, alla voce Opzioni utente, imposta i seguenti valori:
Opzione Valore Spiegazione Definizione oggetto
Spada
L'arma con cui il giocatore apre la porta.
Equipaggia l'oggetto assegnato
Vero
In questo esempio, il giocatore raccoglie ed equipaggia immediatamente l'arma.
Aggiungi un dispositivo Pulsante al tuo livello.
Seleziona il pulsante nell'Outliner. Nel pannello Dettagli, alla voce Opzioni utente, imposta i seguenti valori:
Opzione Valore Spiegazione Testo di interazione
"Raccogli"
Questo è il testo che chiede al giocatore di interagire con il pulsante.
Numero di attivazioni possibili
1
In questo esempio, il giocatore può raccogliere l'arma solo una volta.
Attivatore input
Per sapere quando un giocatore muove un'arma, puoi utilizzare un attivatore di input che ascolta una particolare azione. Quando un giocatore muove l'arma, l'attivatore di input si attiva. Segui questi passaggi per aggiungere un attivatore di input:
Aggiungi un dispositivo Attivatore input al livello.
Seleziona l'attivatore di input nell'Outliner. Nel pannello Dettagli, alla voce Opzioni utente, imposta i seguenti valori:
Opzione Valore Spiegazione Tipo di input
Azione standard
Spara è un'azione standard, ovvero ciò che l'attivatore di input deve ascoltare per sapere quando un giocatore muove l'arma.
Input standard
Fuoco
Spara è l'azione che l'attivatore di input deve ascoltare per sapere quando un giocatore muove un'arma.
Mostra su HUD
Falso
Non è necessario mostrare questa azione sull'HUD.
Volume
Per assicurarti che un giocatore debba trovarsi vicino alla porta per aprirla, puoi utilizzare un dispositivo Volume vicino alla porta per verificare che il giocatore si trovi al suo interno. Per aggiungere un dispositivo Volume segui questi passaggi:
Aggiungi una porta da qualche parte nel livello. Si tratta della porta che il giocatore apre utilizzando l'arma.
Aggiungi un dispositivo Volume al livello. Questo dispositivo Volume deve sovrapporsi a una piccola area di fronte alla porta o all'area che vuoi che il giocatore attacchi.
Cambia le dimensioni del dispositivo volume modificandone il Gizmo di trasformazione per adattarlo all'area in cui vuoi che il giocatore si trovi quando attacca. L'attivatore di input ascolterà l'evento Spara solo quando il giocatore si trova all'interno di questo volume, quindi assicurati che corrisponda alle esigenze della tua esperienza.
BLOC MAIUSC
Per assicurarti che un giocatore non possa aprire la porta prima di aver ottenuto l'arma, puoi bloccare la porta utilizzando un dispositivo Blocco. Per aggiungere un dispositivo Blocco segui questi passaggi:
Aggiungi un dispositivo Blocco alla tua porta.
Seleziona il blocco nell'Outliner. Nel pannello Dettagli, alla voce Opzioni utente, imposta Visibile nel gioco su Falso.
Indicatore mappa
Se il luogo che il giocatore deve raggiungere è molto lontano dal punto in cui ottiene l'arma, è utile mostrare ai giocatori dove andare utilizzando un indicatore sulla mappa. Si tratta di un'immagine visualizzata sulla mappa e sulla minimappa che può attivare un impulso obiettivo che indica la posizione della porta ai giocatori. Per aggiungere un indicatore sulla mappa, segui questi passaggi:
Aggiungi al livello un dispositivo Indicatore mappa nascosto sotto la porta.
Seleziona l'indicatore sulla mappa nell'Outliner. Nel pannello Dettagli, alla voce Opzioni utente:
Opzione Valore Spiegazione Abilitato all'avvio del gioco
falso
L'indicatore sulla mappa è abilitato solo dopo che il giocatore ha raccolto l'arma.
Icona piccola
Scegli un'icona
Scegli un'icona da mostrare sulla minimappa.
Icona grande
Scegli un'icona
Scegli un'icona da mostrare sulla mappa.
Pulsante oggetto condizionale
Per sapere se il giocatore sta muovendo l'arma giusta per aprire la porta, puoi utilizzare un pulsante oggetto condizionale per controllare l'arma che sta impugnando quando la muove. Per aggiungere un pulsante oggetto condizionale sulla mappa, segui questi passaggi:
Aggiungi un dispositivo Pulsante oggetto condizionale al tuo livello.
Seleziona il pulsante oggetto condizionale nell'Outliner. Nel pannello Dettagli, alla voce Opzioni utente, imposta i seguenti valori:
Opzione Valore Spiegazione Consuma oggetti chiave
Falso
Non consuma l'arma del giocatore quando apre la porta.
Definizione oggetto chiave 1
Arma
Quest'arma serve al giocatore per aprire la porta.
Visuale rotante
Per simulare una visuale in prima persona puoi utilizzare una visuale rotante in modo da cambiare la prospettiva del giocatore. Per aggiungere una visuale rotante, segui questi passaggi:
Aggiungi un dispositivo Visuale: rotante al tuo livello.
Seleziona il pulsante della visuale rotante nell'Outliner. Nel pannello Dettagli, alla voce Visuale, imposta i valori seguenti:
Opzione Valore Spiegazione Distanza
0,0 cm
Parametri necessari per la visuale in prima persona
Offset X
27,0 cm
Parametri necessari per la visuale in prima persona
Offset Y
0,0 cm
Parametri necessari per la visuale in prima persona
Offset Z
76,0 cm
Parametri necessari per la visuale in prima persona
Velocità orizzontale
0,0 cm/s
Parametri necessari per la visuale in prima persona
Nel pannello Dettagli, alla voce Transizione, imposta i valori seguenti:
Opzione Valore Spiegazione Tempo transizione
0,0 s
Parametri necessari per la visuale in prima persona
Tempo di transizione in uscita
0,1 s
Parametri necessari per la visuale in prima persona
Tipo transizione in uscita
Ease out
Parametri necessari per la visuale in prima persona
Sequenza cinematografica
Per attivare un filmato all'apertura della porta è necessario un dispositivo Sequenza cinematica che lo riproduca. Per aggiungere una sequenza cinematica, segui questi passaggi:
Aggiungi un dispositivo Sequenza cinematica al tuo livello.
In Esplora contenuti, crea una sequenza cinematica da utilizzare nel tuo livello. La sequenza cinematica utilizza la visuale rotante che hai impostato in precedenza e deve mostrare l'apertura della porta mentre la telecamera passa da un'angolazione iniziale a una visuale in prima persona. Per maggiori informazioni sulla creazione di sequenze cinematiche, consulta Creazione di sequenze cinematiche e cutscene.
Nell'Outliner, seleziona la sequenza cinematica. Nel pannello Dettagli, alla voce Opzioni utente assegna Sequenza alla sequenza cinematica.
Fai clic sull'immagine per ingrandirla.
Filmato di apertura della porta con Verse
Per gestire la logica della riproduzione di una cinematica e dell'apertura della porta, utilizzerai un dispositivo Verse. Il dispositivo ascolta il giocatore che muove l'arma all'interno del dispositivo di volume, quindi riproduce una sequenza cinematica, apre la porta e attiva la visuale in prima persona.
Configurazione dei campi
Per creare il dispositivo Verse:
Crea un nuovo dispositivo Verse utilizzando Verse Explorer e chiamalo
door_open_cinematic_manager.Sopra la definizione della classe
door_open_cinematic_manager, aggiungi un canale di registro per la stampa dei messaggi specifici di questo dispositivo. Poi aggiungi un logger alla definizione della classe da utilizzare con il canale di 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}Aggiungi i seguenti campi alla definizione di classe
door_open_cinematic_manager:Un dispositivo Volume modificabile denominato
DoorVolume. Si tratta del volume all'interno del quale deve trovarsi il giocatore per aprire la porta.Verse# The volume the player needs to be inside of to open the door. @editable DoorVolume:volume_device = volume_device{}Un dispositivo Attivatore input modificabile denominato
FireTrigger. Ascolta se il giocatore utilizza l'arma mentre si trova all'interno diDoorVolume.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 Pulsante condizionale modificabile denominato
ConditionalButton. Controlla che il giocatore abbia l'arma corretta quando si trova all'interno del dispositivo Volume.Verse# The Conditional Item Button that checks that the player has the correct weapon. @editable ConditionalButton:conditional_button_device = conditional_button_device{}Un dispositivo Blocco modificabile denominato
DoorLock. Mantiene la porta chiusa se il giocatore non ha l'arma corretta.Verse# The lock device that prevents the door from being opened. @editable Door:lock_device = lock_device{}Un dispositivo Sequenza cinematica modificabile denominato
CinematicSequence. Riproduce il filmato che porta alla transizione della visuale quando si apre la porta.Verse# The cinematic sequence device that plays the cinematic when opening the door. @editable CinematicSequence:cinematic_sequence_device = cinematic_sequence_device{}Un dispositivo Indicatore mappa modificabile denominato
ObjectiveMarker. Mostra la posizione della porta sulla minimappa dopo aver raccolto l'arma.Verse# The map indicator device that shows the location of the door. @editable ObjectiveMarker:map_indicator_device = map_indicator_device{}Un dispositivo Assegnatore oggetti modificabile denominato
ItemGranter. Assegna al giocatore l'arma di cui ha bisogno per avanzare.Verse# The item granter device that grants the player the weapon they need. @editable ItemGranter:item_granter_device = item_granter_device{}Un dispositivo Pulsante modificabile denominato
ItemGrantButton. In questo modo si attivaItemGranterper assegnare al giocatore l'arma di cui ha bisogno.Verse# The button that activates the ItemGranter granter. @editable ItemGrantButton:button_device = button_device{}Un dispositivo Visuale rotante modificabile denominato
FPSCamera. Simula una visuale in prima persona e viene aggiunto al giocatore dopo la fine del filmato.Verse# The orbit camera that simulates a first-person view. @editable FPSCamera:gameplay_camera_orbit_device = gameplay_camera_orbit_device{}Una variabile
logicadenominataIsDoorOpen. Questo campo controlla se la porta è già aperta, nel qual caso la sequenza non viene riprodotta.Verse# A variable that tracks whether the door is already open. var IsDoorOpen:logic = falseUna variabile
opzioneannullabiledenominataFireSubscription. Questa variabile memorizza la sottoscrizione alPressedEventFireTrigger. La sequenza cinematica deve attivarsi solo quando il giocatore si trova vicino alla porta. Questa sottoscrizione annullabile fa in modo diannullare la registrazionedel giocatore daFireTrigger, se si allontana troppo.Verse# A cancelable subscription to the FireTrigger device. var FireSubscription:?cancelable = false
Riproduzione del filmato
Quando la porta si apre, viene visualizzato un filmato che mostra l'apertura della porta e modifica la visuale dalla terza alla prima persona. Per attivare il filmato quando un giocatore apre la porta segui questi passaggi:
Aggiungi un nuovo metodo
PlayCinematic()alla definizione della classedoor_open_cinematic_manager. Aggiungi un nuovo metodoPlayCinematic()alla definizione della classedoor_open_cinematic_manager. Questa funzione prende il giocatore che sta aprendo la porta, quindi riproduce il filmato e apre la porta utilizzando il dispositivo Blocco.Verse# Plays a cinematic and unlocks the door. PlayCinematic(Agent:agent):void=In
PlayCinematic(), prima riproduci la sequenza cinematica diCinematicSequence, poi sblocca la porta e aprila usando rispettivamenteUnlock()eOpen().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)Infine, cambia la visuale del giocatore dalla terza alla prima persona aggiungendo la visuale rotante con
AddTo(), quindi disattiva l'Indicatore obiettivo. La tua funzionePlayCinematic()completa deve essere simile a questa: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 = trueIl filmato deve essere riprodotto solo quando il giocatore ha in mano l'oggetto richiesto e non deve essere nuovamente riprodotto dopo che la porta è stata aperta. Per gestire questa logica, aggiungi un nuovo metodo
CheckCinematic()alla definizione della classedoor_open_cinematic_manager. Questa funzione prende il giocatore all'interno diDoorVolumee controlla se possiede gli oggetti richiesti.Verse# Check if the player has the required item and the door isn't already open. CheckCinematic(Agent:agent):void=In
CheckCinematic(), controlla se il giocatore ha in mano l'oggetto registrato suConditionalButtonusandoIsHoldingItem[]e controlla seIsDoorOpenè falso per assicurarsi che la porta non sia già aperta. In caso affermativo, usaspawn{}per generare la funzionePlayCinematic()passando il giocatore che apre la porta. La tua funzione completaCheckCinematic()deve avere questo aspetto: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)}
Tracciamento del giocatore e assegnazione degli oggetti
Poiché il giocatore deve muovere l'arma all'interno di DoorVolume per aprire la porta, il dispositivo Attivatore input deve essere in ascolto di questo evento. Segui i passaggi per far sì che il dispositivo Attivatore input ascolti quando il giocatore muove un'arma.
Aggiungi un nuovo metodo
OnPlayerEntersVolume()alla definizione della classedoor_open_cinematic_manager. Questa funzione prende un agente e lo registra aFireTriggerquando entra inDoorVolume.Verse# Registers the Agent with the FireTrigger when they enter the DoorVolume. OnPlayerEntersVolume(Agent:agent):void= Logger.Print("Agent entered DoorVolume")In
OnPlayerEntersVolume(), registra l'agente aFireTriggerchiamandoRegister(). Poi imposta suPlayCinematic()laFireSubscriptional risultato della sottoscrizione diFireTrigger.PressedEvent. La funzioneOnPlayerEntersVolume()completata deve essere simile alla seguente: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 un giocatore esce da
DoorVolume, devi smettere di tracciare la sottoscrizione perFireTrigger.PressedEvent, perché il giocatore deve essere in grado di attivare il filmato solo se non si trova all'interno del volume. Per gestire questa situazione, aggiungi un nuovo metodoOnPlayerExitsVolume()alla definizione della classedoor_open_cinematic_manager.Verse# Unregister the Agent with the FireTrigger when they leave the DoorVolume. OnPlayerExitsVolume(Agent:agent):void=In
OnPlayerExitsVolume(), primaUnregister()l'agente conFireTrigger. Poi recupera la sottoscrizione all'interno diFireSubscriptione annullala. Il metodoOnPlayerExitsVolume()completo deve essere simile al seguente: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 il giocatore interagisce con
ItemButton, ottiene l'arma necessaria per avanzare. Inoltre, sulla minimappa compare un indicatore di obiettivo che indica la strada per raggiungere la porta nel caso in cui non l'abbia ancora trovata. Per gestire questo aspetto, aggiungi un nuovo metodoGrantItem()che porta unagentnella definizione della classedoor_open_cinematic_manager. All'interno diGrantItem(), chiamaGrantItemsull'agente che è stato passato e attiva l'indicatore di obiettivo. Il metodoGrantItem()completato deve essere simile al seguente: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()
Collegare il tutto
Ora puoi sottoscrivere ogni evento alla funzione associata e testare il codice nel gioco.
In
OnBegin(), sottoscrivi l'eventoItemGrantButton.InteractedWithEventalla funzioneGrantItem(). Quindi sottoscrivi siaDoorVolume.AgentEntersEventcheDoorVolume.AgentExitsEventalle funzioni associate. La tua funzioneOnBegin()deve essere simile alla seguente: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)Salva il codice e compilalo.
In UEFN, seleziona il dispositivo DoorOpenCinematicManager nel tuo livello. Nell'Outliner, assegna ogni riferimento modificabile al dispositivo nel livello.
Fai clic sull'immagine per ingrandirla.
Fai clic su Avvia la sessione nella barra degli strumenti UEFN per eseguire il playtest del livello. Durante il playtest del livello, l'interazione con il pulsante dell'oggetto dovrebbe assegnare al giocatore l'arma di cui ha bisogno e aggiungere un indicatore di obiettivo alla minimappa. Quando il giocatore usa l'arma all'interno del volume della porta, dovrebbe partire un filmato, la porta dovrebbe aprirsi e il giocatore dovrebbe passare alla visuale in prima persona.
Codice 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}
Ora tocca a te
Ora hai imparato come utilizzare Verse per riprodurre un filmato quando un giocatore apre una porta e come passare dalla visuale in terza persona a quella in prima persona.
Utilizzando ciò che hai imparato, prova quanto segue:
Puoi realizzare altri tipi di transizioni di visuali, per esempio passare a una visuale a scorrimento laterale?
Che ne pensi di un pulsante dedicato per cambiare l'angolazione della visuale o di progettare un livello che richiede più angolazioni per avanzare?
Puoi utilizzare gli attivatori di input per le penalità negative, per esempio sfidando i giocatori a superare una sezione senza saltare e riproducendo un filmato se falliscono?