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 un filmato. 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 un filmato 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:
*Sottoscrizione possibile: sottoscriverai gli 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 di un 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 telecamera 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 telecamera rotante posizionata all'interno del petto del personaggio. 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 x 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. Fai clic sull'immagine per ingrandirla.
-
Aggiungi un dispositivo Pulsante al livello.
-
Seleziona il pulsante nell'Outliner. Nel pannello Dettagli, alla voce Opzioni utente imposta i seguenti valori:
Opzione Valore Spiegazione Testo di interazione "Raccogli" 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. Fai clic sull'immagine per ingrandirla.
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 Spara Spara è l'azione che l'attivatore di input deve ascoltare per sapere quando un giocatore muove un'arma. Mostra sull'interfaccia Falso Non è necessario mostrare questa azione sull'HUD. Fai clic sull'immagine per ingrandirla.
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 la 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.
Fai clic sull'immagine per ingrandirla.
Blocco
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 porta.
-
Seleziona il blocco nell'Outliner. Nel pannello Dettagli, alla voce Opzioni utente imposta Visibile nel gioco su Falso.
Fai clic sull'immagine per ingrandirla.
Indicatore sulla 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 l'icona da mostrare sulla minimappa. Icona grande Scegli un'icona Scegli l'icona da mostrare sulla minimappa. Fai clic sull'immagine per ingrandirla.
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 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 L'arma di cui ha bisogno il giocatore per aprire la porta. Fai clic sull'immagine per ingrandirla.
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 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 Sfalsamento X 27.0 cm Parametri necessari per la visuale in prima persona Sfalsamento Y 0.0 cm Parametri necessari per la visuale in prima persona Sfalsamento 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 in entrata 0.0 s Parametri necessari per la visuale in prima persona Tempo 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 Fai clic sull'immagine per ingrandirla.
Sequenza cinematica
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 livello.
-
In Esplora contenuti, crea una sequenza cinematica da utilizzare nel 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 sequenze cinematografiche e cutscene.
-
Seleziona ila sequenza cinematica nell'Outliner. 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 un filmato 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 nominalo
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.door_open_channel := class(log_channel){} # Dispositivo di Fortnite Creativo sviluppato con Verse che può essere inserito in un livello 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.# Il volume all'interno del quale deve trovarsi il giocatore per aprire la porta. @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
.# L'attivatore di input che ascolta il giocatore che muove l'arma # quando si trova all'interno di 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.# Il Pulsante oggetto condizionale che controlla che il giocatore abbia l'arma corretta. @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.# Il dispositivo Blocco che impedisce l'apertura della porta. @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.# Il dispositivo Sequenza cinematica che riproduce il filmato quando si apre la porta. @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.# Il dispositivo Indicatore mappa che mostra la posizione della porta. @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.# Il dispositivo Assegnatore oggetti che assegna al giocatore l'arma di cui ha bisogno. @editable ItemGranter:item_granter_device = item_granter_device{}
-
Un dispositivo Pulsante modificabile denominato
ItemGrantButton
. AttivaItemGranter
per assegnare al giocatore l'arma di cui ha bisogno.# Il pulsante che attiva l'assegnatore ItemGranter. @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.# La visuale rotante che simula una visuale in prima persona. @editable FPSCamera:gameplay_camera_orbit_device = gameplay_camera_orbit_device{}
-
Una variabile
logica
denominataIsDoorOpen
. Questo campo controlla se la porta è già aperta, nel qual caso la sequenza non viene riprodotta.# Una variabile che controlla se la porta è già aperta. var IsDoorOpen:logic = false
-
Una variabile
opzione
annullabile
denominataFireSubscription
. Questa variabile memorizza la sottoscrizione alPressedEvent
FireTrigger
. La sequenza cinematica deve attivarsi solo quando il giocatore si trova vicino alla porta. Questa sottoscrizione annullabile fa in modo diannullare la registrazione
del giocatore aFireTrigger
, se si allontana troppo.# Una sottoscrizione annullabile al dispositivo FireTrigger. 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.# Riproduce un filmato e sblocca la porta. PlayCinematic(Agent:agent):void=
-
In
PlayCinematic()
, prima riproduci la sequenza cinematica diCinematicSequence
, poi sblocca la porta e aprila usando rispettivamenteUnlock()
eOpen()
.# Riproduce un filmato e sblocca la porta. PlayCinematic(Agent:agent)<suspends>:void= Logger.Print("Il giocatore ha in mano un oggetto; riproduzione del filmato...") CinematicSequence.Play() # Sblocca la porta, quindi la apre. Door.Unlock(Agent) Door.Open(Agent) set IsDoorOpen = true
-
Infine, cambia la visuale del giocatore dalla terza alla prima persona aggiungendo la visuale rotante con
AddTo()
, quindi disattiva l'Indicatore obiettivo. La funzionePlayCinematic()
completata dovrebbe essere simile a questa:# Riproduce un filmato e sblocca la porta. PlayCinematic(Agent:agent)<suspends>:void= Logger.Print("Il giocatore ha in mano un oggetto; riproduzione del filmato...") CinematicSequence.Play() # Sblocca la porta, quindi la apre. Door.Unlock(Agent) Door.Open(Agent) set IsDoorOpen = true # Aggiunge la visuale in prima persona all'agente. Quando il filmato termina, # l'agente sarà nella visuale in prima persona. FPSCamera.AddTo(Agent) Logger.Print("Visuale modificata") # Disabilita l'Indicatore obiettivo ObjectiveMarker.Disable()
-
Il 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 diDoorVolume
e controlla se possiede gli oggetti richiesti.# Controlla se il giocatore ha l'oggetto richiesto e se la porta non è già aperta. CheckCinematic(Agent:agent):void=
-
In
CheckCinematic()
, controlla se il giocatore ha in mano l'oggetto registrato suConditionalButton
usandoIsHoldingItem[]
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 funzioneCheckCinematic()
completata dovrebbe essere simile a questa:# Controlla se il giocatore ha l'oggetto richiesto e se la porta non è già aperta. CheckCinematic(Agent:agent):void= if: ConditionalButton.IsHoldingItem[Agent] and not IsDoorOpen? then: spawn{PlayCinematic(Agent)}
Tracciamento del giocatore e assegnazione di 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 aFireTrigger
quando entra inDoorVolume
.# Registra l'agente a FireTrigger quando entra in DoorVolume. OnPlayerEntersVolume(Agent:agent):void= Logger.Print("L'agente è entrato in DoorVolume")
-
In
OnPlayerEntersVolume()
, registra l'agente aFireTrigger
chiamandoRegister()
. Poi imposta suPlayCinematic()
laFireSubscription
al risultato della sottoscrizione diFireTrigger.PressedEvent
. La funzioneOnPlayerEntersVolume()
completata dovrebbe essere simile alla seguente:# Registra l'agente a FireTrigger quando entra in DoorVolume. OnPlayerEntersVolume(Agent:agent):void= Logger.Print("L'agente è entrato in DoorVolume") FireTrigger.Register(Agent) # Sottoscrive l'evento PressedEvent a PlayCinematic e memorizza la sottoscrizione in FireSubscrition. set FireSubscription = option{(FireTrigger.PressedEvent.Subscribe(PlayCinematic))}
-
Quando un giocatore esce da
DoorVolume
, devi smettere di tracciare la sottoscrizione perFireTrigger.PressedEvent
, poiché il giocatore dovrebbe 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
.# Annulla la registrazione dell'agente a FireTrigger quando esce da DoorVolume. OnPlayerExitsVolume(Agent:agent):void=
-
In
OnPlayerExitsVolume()
, prima annulla la registrazione dell'agente aFireTrigger
con Unregister(), poi recupera la sottoscrizione all'interno diFireSubscription
e annullala. Il metodoOnPlayerExitsVolume()
completato dovrebbe avere l'aspetto seguente:# Annulla la registrazione dell'agente a FireTrigger quando esce da DoorVolume. OnPlayerExitsVolume(Agent:agent):void= Logger.Print("L'agente è uscito da DoorVolume") FireTrigger.Unregister(Agent) # Annulla la sottoscrizione a 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 unagente
nella definizione della classedoor_open_cinematic_manager
. All'interno diGrantItem()
, chiamaGrantItem
sull'agente che è stato passato e attiva l'indicatore di obiettivo. Il metodoGrantItem()
completato dovrebbe essere simile a questo:# Assegna all'agente un oggetto quando interagisce con ItemGrantButton # e attiva 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.InteractedWithEvent
alla funzioneGrantItem()
. Quindi sottoscrivi siaDoorVolume.AgentEntersEvent
cheDoorVolume.AgentExitsEvent
alle funzioni associate. La funzioneOnBegin()
dovrebbe essere simile a questa:# Viene eseguito quando il dispositivo viene avviato in un gioco in esecuzione OnBegin<override>()<suspends>:void= # Sottoscrive ogni evento alla funzione associata. ItemGrantButton.InteractedWithEvent.Subscribe(GrantItem) DoorVolume.AgentEntersEvent.Subscribe(OnPlayerEntersVolume) DoorVolume.AgentExitsEvent.Subscribe(OnPlayerExitsVolume)
-
Salva il codice e compilalo.
-
In UEFN, seleziona il dispositivo DoorOpenCinematicManager nel livello. Nell'Outliner, assegna ogni riferimento modificabile al dispositivo nel livello.
Fai clic sull'immagine per ingrandirla.
-
Fai clic su Avvia 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 }
# Visita https://dev.epicgames.com/documentation/en-us/uefn/create-your-own-device-in-verse per maggiori informazioni sulla creazione di un dispositivo Verse.
door_open_log := class(log_channel){}
door_open_cinematic_manager := class(creative_device):
Logger:log = log{Channel := door_open_log}
# L'attivatore di input che ascolta il giocatore che muove l'arma
# quando si trova all'interno di DoorVolume.
@editable
FireTrigger:input_trigger_device = input_trigger_device{}
# Il dispositivo Sequenza cinematica che riproduce il filmato quando si apre la porta.
@editable
CinematicSequence:cinematic_sequence_device = cinematic_sequence_device{}
# Il Pulsante oggetto condizionale che controlla che il giocatore abbia l'arma corretta.
@editable
ConditionalButton:conditional_button_device = conditional_button_device{}
# Il dispositivo Blocco che impedisce l'apertura della porta.
@editable
Door:lock_device = lock_device{}
# Il volume all'interno del quale deve trovarsi il giocatore per aprire la porta.
@editable
DoorVolume:volume_device = volume_device{}
# La visuale rotante che simula una visuale in prima persona.
@editable
FPSCamera:gameplay_camera_orbit_device = gameplay_camera_orbit_device{}
# Il dispositivo Assegnatore oggetti che assegna al giocatore l'arma di cui ha bisogno.
@editable
ItemGranter:item_granter_device = item_granter_device{}
# Il pulsante che attiva ItemGranter.
@editable
ItemGrantButton:button_device = button_device{}
# Il dispositivo Indicatore mappa che mostra la posizione della porta.
@editable
ObjectiveMarker:map_indicator_device = map_indicator_device{}
# Una variabile che controlla se la porta è già aperta.
var IsDoorOpen:logic = false
# Una sottoscrizione annullabile al dispositivo FireTrigger.
var FireSubscription:?cancelable = false
# Viene eseguito quando il dispositivo viene avviato in un gioco in esecuzione
OnBegin<override>()<suspends>:void=
# Sottoscrive ogni evento alla funzione associata.
ItemGrantButton.InteractedWithEvent.Subscribe(GrantItem)
DoorVolume.AgentEntersEvent.Subscribe(OnPlayerEntersVolume)
DoorVolume.AgentExitsEvent.Subscribe(OnPlayerExitsVolume)
# Registra l'agente a FireTrigger quando entra in DoorVolume.
OnPlayerEntersVolume(Agent:agent):void=
Logger.Print("L'agente è entrato in DoorVolume")
FireTrigger.Register(Agent)
# Sottoscrive l'evento PressedEvent a PlayCinematic e memorizza la sottoscrizione in FireSubscrition.
set FireSubscription = option{(FireTrigger.PressedEvent.Subscribe(CheckCinematic))}
# Annulla la registrazione dell'agente a FireTrigger quando esce da DoorVolume.
OnPlayerExitsVolume(Agent:agent):void=
Logger.Print("L'agente è uscito da DoorVolume")
FireTrigger.Unregister(Agent)
# Annulla la sottoscrizione a FireSubscription.
if (SubscriptionToCancel := FireSubscription?):
SubscriptionToCancel.Cancel()
# Assegna all'agente un oggetto quando interagisce con ItemGrantButton
# e attiva ObjectiveMarker.
GrantItem(Agent:agent):void=
ItemGranter.GrantItem(Agent)
ObjectiveMarker.Enable()
# Controlla se il giocatore ha l'oggetto richiesto e se la porta non è già aperta.
CheckCinematic(Agent:agent):void=
if:
ConditionalButton.IsHoldingItem[Agent] and not IsDoorOpen?
then:
spawn{PlayCinematic(Agent)}
# Riproduce un filmato e sblocca la porta.
PlayCinematic(Agent:agent)<suspends>:void=
Logger.Print("Il giocatore ha in mano un oggetto; riproduzione del filmato...")
CinematicSequence.Play()
# Sblocca la porta, quindi la apre.
Door.Unlock(Agent)
Door.Open(Agent)
set IsDoorOpen = true
# Aggiunge la visuale in prima persona all'agente. Quando il filmato termina,
# l'agente sarà nella visuale in prima persona.
FPSCamera.AddTo(Agent)
Logger.Print("Visuale modificata")
# Disabilita l'Indicatore obiettivo
ObjectiveMarker.Disable()
In autonomia
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, ad esempio passare a una visuale a scorrimento laterale?
-
Che ne dici 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, ad esempio sfidando i giocatori a superare una sezione senza saltare e riproducendo un filmato se falliscono?