Completando questo passaggio del tutorial Puzzle delle luci con tag, imparerai a utilizzare i Tag di gameplay per individuare gli attori contrassegnati da un tag specifico, mentre la partita è in corso. I tag di gameplay ti consentono di lavorare con più dispositivi, senza doverne impostare i riferimenti nell'editor. Ciò può comportare interessanti opportunità di gameplay in cui, ad esempio, il codice cambia dinamicamente i dispositivi attivi, man mano che il giocatore avanza nel gioco.
Per creare un nuovo Tag di gameplay e assegnarlo a tutte le luci del livello per il puzzle, attieniti ai passaggi seguenti:
- Apri Verse Explorer e fai doppio clic su tagged_lights_puzzle.verse per aprire lo script in Visual Studio Code.
- All'inizio del file di codice:
- Aggiungi
using { /Verse.org/Simulation/Tags }per fare riferimento alla classetage utilizzare la funzioneGetCreativeObjectsWithTag(). - Aggiungi
using { /Verse.org/Simulation }per poter rendere modificabili le proprietà.
using { /Fortnite.com/Devices } using { /Verse.org/Native } using { /UnrealEngine.com/Temporary/Diagnostics } using { /Verse.org/Simulation/Tags } using { /Verse.org/Simulation } log_tagged_lights_puzzle := class(log_channel){} - Aggiungi
-
Sopra la classe
log_tagged_lights_puzzle, aggiungi una nuova sottoclasse denominatapuzzle_light, che eredita dalla classetag. Il nome della classe ereditata diventa un tag di gameplay personalizzato, che puoi utilizzare su qualsiasi dispositivo creativo.# Deriva dalla classe `tag` del modulo Verse.org/Simulation/Tags per creare un nuovo tag di gameplay. puzzle_light := class(tag){} log_tagged_lights_puzzle := class(log_channel){} - Nella barra degli strumenti UEFN, fai clic su Compila gli script di Verse per compilare il codice e il nuovo tag di gameplay
puzzle_lightnel tuo progetto. - In Outliner di UEFN, seleziona un Dispositivo luce personalizzabile per aprire il relativo pannello Dettagli.
- Nel pannello Dettagli:
- Fai clic su Aggiungi nuovo componente e scegli Tag markup Verse.
- Seleziona il componente VerseTagMarkup per visualizzare le relative impostazioni nel pannello Dettagli.
- In Tag di gameplay, modifica la proprietà Tag e aggiungi il tag
puzzle_light.

Puoi aggiungere più tag allo stesso dispositivo, in modo che ogni dispositivo possa appartenere a più gruppi contemporaneamente. Ad esempio, un dispositivo con
tag1etag2verrà trovato quando si chiamaGetCreativeObjectsWithTag(tag1{})oGetCreativeObjectsWithTag(tag2{}). - Nella definizione della classe
tagged_lights_puzzle, aggiungi due campi di array di variabili:- Una variabile di array modificabile
logic, denominataLightsState, per rappresentare lo stato attuale di tutte le luci (se sono spente o accese). Dal momento che viene utilizzata anche per impostare lo stato iniziale delle luci, il suo numero di elementi deve corrispondere al numero di luci con il tagpuzzle_light. In questo esempio, tutte le luci sono spente per impostazione predefinita, quindi il valore iniziale per tutte le luci èfalse.@editable var LightsState : []logic = array{false, false, false, false} - Una variabile di array modificabile
customizable_light_devicedenominataLightsper memorizzare tutti i dispositivi Luce personalizzabili contrassegnati con il tag di gameplaypuzzle_light.@editable var Lights : []customizable_light_device = array{}
- Una variabile di array modificabile
- Quando inizia la partita, il dispositivo deve impostare le luci in modo che corrispondano alla configurazione iniziale specificata nell'array
LightsStatee salvare i riferimenti nell'arrayLights, in modo che possano essere aggiornati quando cambia lo stato del gioco. Questo lavoro sarà svolto in un metodo chiamatoSetupPuzzleLights() : voide richiamato nel metodoOnBegin(), in modo che le luci siano impostate all'avvio del gioco.SetupPuzzleLights() : void = Logger.Print(“Configurazione delle luci in gioco”) OnBegin<override>()<suspends> : void = SetupPuzzleLights() - In
SetupPuzzleLights(), trova tutti i dispositivi con il tagpuzzle_lightchiamandoGetCreativeObjectsWithTag(puzzle_light{})e salvali in un array denominatoTaggedActors. PoichéTaggedActorsè un array costante il cui ambito è locale al metodoSetupPuzzleLights(), non è necessario specificare esplicitamente un tipo per l'array, perché può essere dedotto in questo contesto.SetupPuzzleLights() : void = Logger.Print("Configurazione delle luci in gioco") TaggedActors := GetCreativeObjectsWithTag(puzzle_light{})Chiamate diverse della funzione
GetCreativeObjectsWithTag()possono posizionare i dispositivi in ordini diversi nell'array dei risultati, perché non esiste un ordine garantito quando si recuperano attori con tag di gameplay. - Ora che hai raccolto tutti i dispositivi che hanno il tag
puzzle_light, assicurati che ogni luce corrisponda allo stato iniziale specificato dall'arrayLightsState. Puoi utilizzare un loopforper scorrere tutti i dispositivi contrassegnati.for: ActorIndex -> TaggedActor : TaggedActors do: TaggedActor - La funzione
GetCreativeObjectsWithTag()restituisce un array di tipocreative_object_interface. In questo esempio, vuoi interagire con ogniTaggedActorcome uncustomizable_light_device, in modo da poter accendere o spegnere la luce.- Puoi convertire una classe in una delle sue sottoclassi (denominata cast di tipo) usando la sintassi
NewDeviceReference := device_type_to_cast_to[DeviceReference], dovedevice_type_to_cast_toè il tipo di dispositivo desiderato, che in questo esempio ècustomizable_light_device. Si tratta di un'espressione fallibile, perché la conversione del tipo fallirà se il dispositivo non può essere convertito in quel tipo (ad esempio se si tratta di un tipo diverso di dispositivo).LightDevice := customizable_light_device[TaggedActor]
La funzione
GetCreativeObjectsWithTag()ha il tipo restituito[]creative_object_interfaceperché la funzione può restituire diversi tipi di attori, quindi il suo tipo restituito è l'interfaccia che tutti gli attori devono implementare per essere restituiti daGetCreativeObjectsWithTag(). Per ulteriori informazioni, vedi Tag di gameplay.- Con le espressioni
for, è possibile utilizzare le espressioni che possono fallire come filtro e creare nuove variabili da usare nel blocco di codicefor. In questo caso, aggiungi all'espressione di iterazione la conversione del tipo incustomizable_light_devicedel passaggio precedente.for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] do: LightDevice - L'ultima espressione di un blocco di codice è il risultato del blocco stesso. L'espressione
forrestituisce il risultato del blocco di codice di ogni iterazione in un array, quindi il risultato di questa espressioneforè un array di riferimenti acustomize_light_deviceche sono stati contrassegnati conpuzzle_light. Ciò significa che è possibile aggiornare direttamente l'arrayLightscon il risultato dell'espressionefor.set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] do: LightDevice - Questo loop
fordovrebbe anche chiamareTurnOn()/TurnOff()sulle luci, in modo che corrispondano al loroLightsStateiniziale impostato nell'editor. L'espressioneforpuò restituire l'indice usato per ottenere il dispositivo con tag corrente (ActorIndex,nell'esempio), che può essere usato per indicizzare l'arrayLightsStateper verificare se la luce deve essere accesa o spenta.set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] ShouldLightBeOn:= LightsState[ActorIndex] do: LightDevice - Quindi, chiama
TurnOn()/TurnOff()a seconda cheShouldLightBeOnsiatrue/false. Puoi utilizzare un'espressioneifper eseguire espressioni diverse in base a una condizione, in particolare un'espressione fallibile. In questo caso, l'espressione fallibile può usare l'operatore di query?conIsLightOn, che riuscirà seShouldLightBeOnètrue, (quindi chiamaTurnOn()) e fallirà seShouldLightBeOnèfalse(quindi chiamaTurnOff()).set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] ShouldLightBeOn := LightsState[ActorIndex] do: if (ShouldLightBeOn?) then LightDevice.TurnOn() else LightDevice.TurnOff() LightDevice - È una buona idea stampare anche l'indice della luce e il relativo valore iniziale, in modo da poter verificare che il codice funzioni come previsto e confrontarlo con ciò che vedi nel livello.
- Quando utilizzi
{}in mezzo a una stringa, l'espressione tra{}viene valutata per prima e il suo valore viene aggiunto alla stringa. È quindi possibile utilizzare un'espressioneifnel mezzo di una stringa per aggiungere valori in modo condizionale.set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[ActorIndex] ShouldLightBeOn := LightsState[ActorIndex] do: Logger.Print("Aggiunta delle luci all'indice {ActorIndex} con stato:{if (ShouldLightBeOn?) then "On" else "Off"}") if (ShouldLightBeOn?) then LightDevice.TurnOn() else LightDevice.TurnOff() LightDevice
- Puoi convertire una classe in una delle sue sottoclassi (denominata cast di tipo) usando la sintassi
- Il metodo
SetupPuzzleLights()dovrebbe ora essere simile a:SetupPuzzleLights() : void = TaggedActors := GetCreativeObjectsWithTag(puzzle_light{}) <# Per ogni dispositivo con il tag puzzle_light, verifica se si tratta di un dispositivo customizable_light_device, provando a eseguirne il cast in quel tipo. Se lo è, ottieni il suo LightState iniziale per eseguire TurnOn() o TurnOff() del LightDevice. Salva tutti i customizable_light_device con tag nell'array Lights. #> set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] ShouldLightBeOn := LightsState[ActorIndex] do: Logger.Print("Aggiunta delle luci all'indice {ActorIndex} con stato:{if (ShouldLightBeOn?) then "On" else "Off"}") if (ShouldLightBeOn?) then LightDevice.TurnOn() else LightDevice.TurnOff() LightDevice - Salva lo script in Visual Studio Code.
- Nella barra degli strumenti UEFN, fai clic su Compila gli script di Verse per compilare il codice.
- Per eseguire il playtest del livello, fai clic su Gioca nella barra degli strumenti UEFN.
Durante il playtest del livello, dovresti vedere ogni luce aggiunta all'array Lights, insieme al relativo stato iniziale, stampata nel registro di output.
Passaggio successivo
Nel passaggio successivo di questo tutorial, imparerai come attivare/disattivare un set specifico di luci quando il giocatore preme i pulsanti.