Dans cette étape du tutoriel Créer un jeu de casse-tête avec séquences de lumières balisées, vous apprendrez à utiliser l'API Étiquettes de jeu pour rechercher les acteurs portant une balise spécifique pendant le jeu. Les étiquettes de jeu vous permettent d'utiliser plusieurs appareils sans avoir à configurer leurs références dans l'éditeur. Elles vous ouvrent donc des possibilités de jeu intéressantes en vous permettant notamment de programmer le code de façon à modifier les appareils actifs à mesure que le joueur progresse dans le jeu.
Procédez comme suit pour créer une nouvelle étiquette de jeu et l'attribuer à toutes les lumières du niveau pour le jeu de casse-tête :
- Ouvrez l'explorateur Verse et double-cliquez sur tagged_lights_puzzle.verse pour ouvrir le script dans Visual Studio Code.
- Dans la partie supérieure du fichier de code :
- Ajoutez
using { /Verse.org/Simulation/Tags }pour référencer la classetaget utilisez la fonctionGetCreativeObjectsWithTag(). - Ajoutez
using { /Verse.org/Simulation }de façon à pouvoir créer des propriétés modifiables.
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){} - Ajoutez
-
Au-dessus de la classe
log_tagged_lights_puzzle, ajoutez une nouvelle sous-classe nomméepuzzle_lightqui hérite de la classetag. Le nom de la classe héritée est converti en balise de jeu personnalisée que vous pouvez utiliser sur tout appareil du mode Créatif.# Dérivez la classe `tag` du module Verse.org/Simulation/Tags pour créer une nouvelle étiquette de jeu. puzzle_light := class(tag){} log_tagged_lights_puzzle := class(log_channel){} - Dans la barre d'outils d'UEFN, cliquez sur Générer les scripts Verse pour compiler votre code et votre nouvelle étiquette de jeu
puzzle_lightdans votre projet. - Dans l’organiseur d'UEFN, sélectionnez un appareil Lumière personnalisable pour ouvrir le panneau Détails correspondant.
- Dans le panneau Détails :
- Cliquez sur Ajouter un nouveau composant et choisissez Marquage de balises Verse.
- Sélectionnez le composant VerseTagMarkup pour afficher ses paramètres dans le panneau Détails.
- Sous Étiquettes de jeu, modifiez la propriété Balises et ajoutez la balise
puzzle_light.

Vous pouvez ajouter plusieurs balises à un même appareil, de sorte que chaque appareil peut appartenir à plusieurs groupes en même temps. Par exemple, un appareil avec les balises
tag1ettag2est détecté lors de l'appel deGetCreativeObjectsWithTag(tag1{})ouGetCreativeObjectsWithTag(tag2{}). - Dans la définition de classe
tagged_lights_puzzle, ajoutez deux champs de matrice de variables :- Une matrice de variables
logicmodifiable nomméeLightsStatepour représenter l'état actuel de toutes les lumières (éteintes ou allumées). Cette matrice étant également utilisée pour définir l'état initial des lumières, le nombre de ses éléments doit correspondre au nombre de lumières portant la balisepuzzle_light. Dans cet exemple, toutes les lumières sont éteintes par défaut ; par conséquent, la valeur de départ pour toutes les lumières estfalse.@editable var LightsState : []logic = array{false, false, false, false} - Une matrice de variables
customizable_light_devicemodifiable nomméeLightspour stocker tous les appareils Lumière personnalisable portant l’étiquette de jeupuzzle_light.@editable var Lights : []customizable_light_device = array{}
- Une matrice de variables
- Lorsque le jeu commence, l'appareil doit configurer les lumières en fonction de la configuration initiale spécifiée dans la matrice
LightsState, et enregistrer les références dans la matriceLightsafin qu'elles puissent être mises à jour lors du changement d’état du jeu. Cette tâche est confiée à une méthodeSetupPuzzleLights() : void, appelée dans la méthodeOnBegin()pour que les lumières soient configurées au début du jeu.SetupPuzzleLights() : void = Logger.Print(“Setting up in-game lights”) OnBegin<override>()<suspends> : void = SetupPuzzleLights() - Dans
SetupPuzzleLights(), recherchez tous les appareils avec la balisepuzzle_lighten appelantGetCreativeObjectsWithTag(puzzle_light{}), puis enregistrez-les dans une matrice appeléeTaggedActors. Dans la mesure oùTaggedActorsest une matrice de constante dont l’étendue est locale à la méthodeSetupPuzzleLights(), vous n'avez pas besoin de spécifier explicitement un type pour la matrice, car il peut être déduit dans ce contexte.SetupPuzzleLights() : void = Logger.Print("Setting up in-game lights") TaggedActors := GetCreativeObjectsWithTag(puzzle_light{})Des appels différents de la fonction
GetCreativeObjectsWithTag()peuvent placer les appareils dans des ordres différents dans le résultat de la matrice, car aucun ordre n'est garanti lors de la récupération d’acteurs avec des étiquettes de jeu. - Maintenant que vous avez collecté tous les appareils dotés de la balise
puzzle_light, assurez-vous que chaque lumière correspond à l'état de départ spécifié par la matriceLightsState. Vous pouvez utiliser une boucleforpour itérer tous les appareils balisés.for: ActorIndex -> TaggedActor : TaggedActors do: TaggedActor - La fonction
GetCreativeObjectsWithTag()renvoie une matrice de typecreative_object_interface. Dans cet exemple, vous souhaitez interagir avec chaque appareilTaggedActoren tant qu'appareilcustomizable_light_devicepour pouvoir allumer ou éteindre la lumière.- Vous pouvez convertir une classe en l'une de ses sous-classes (processus appelé conversion de type(verse-glossary#type-casting)) en utilisant la syntaxe
NewDeviceReference := device_type_to_cast_to[DeviceReference], oùdevice_type_to_cast_tocorrespond au type d'appareil que vous demandez, en l'occurrencecustomizable_light_device. Cette expression est faillible, car la conversion de type échoue s'il s'avère impossible de convertir l'appareil en ce type (par exemple, s'il s'agit d'un autre type d'appareil).LightDevice := customizable_light_device[TaggedActor]
La fonction
GetCreativeObjectsWithTag()a le type de retour[]creative_object_interface, car la fonction peut renvoyer différents types d’acteurs ; son type de retour est donc l’interface que tous les acteurs doivent implémenter pour être renvoyés parGetCreativeObjectsWithTag(). Consultez la rubrique Étiquettes de jeu pour en savoir plus.- Avec les expressions
for, vous pouvez utiliser des expressions faillibles comme filtre et créer de nouvelles variables pour pouvoir les utiliser ensuite dans le bloc de codefor. Dans ce cas, ajoutez la conversion de typecustomizable_light_devicede l'étape précédente à l'expression d'itération.for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] do: LightDevice - La dernière expression d'un bloc de code est le résultat du bloc de code. L'expression
forrenvoie le résultat du bloc de code de chaque itération dans une matrice ; par conséquent, le résultat de cette expressionforest une matrice de référencescustomize_light_devicequi ont été balisées avecpuzzle_light. Cela signifie que vous pouvez mettre à jour la matriceLightsavec le résultat de l'expressionfordirectement.set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] do: LightDevice - Cette boucle
fordoit également appelerTurnOn()/TurnOff()sur les lumières pour correspondre à leur configurationLightsStateinitiale dans l'éditeur. L'expressionforpeut renvoyer l'index utilisé pour obtenir l'appareil balisé actuel (ActorIndexdans cet exemple), que vous pouvez utiliser pour l'indexer dans la matriceLightsStateafin de savoir si la lumière doit être allumée ou éteinte.set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] ShouldLightBeOn:= LightsState[ActorIndex] do: LightDevice - Ensuite, appelez
TurnOn()/TurnOff()selon queShouldLightBeOnesttrue/false. Vous pouvez utiliser une expressionifpour exécuter différentes expressions en fonction d'une condition (plus précisément, une expression faillible). Dans ce cas, l'expression faillible peut utiliser l'opérateur de requête?avecIsLightOn, qui réussit siShouldLightBeOnesttrue(donc, appelerTurnOn()), et échoue siShouldLightBeOnestfalse(donc, appelerTurnOff()).set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] ShouldLightBeOn := LightsState[ActorIndex] do: if (ShouldLightBeOn?) then LightDevice.TurnOn() else LightDevice.TurnOff() LightDevice - Il est également recommandé d'imprimer l'index de la lumière et sa valeur de départ afin de vérifier que votre code fonctionne comme prévu et de le comparer à ce que vous voyez dans le niveau.
- Lorsque vous utilisez
{}au milieu d'une chaîne, l'expression entre{}est évaluée en premier et sa valeur est ajoutée à la chaîne. Vous pouvez donc utiliser une expressionifau milieu d'une chaîne pour ajouter des valeurs de manière conditionnelle.set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[ActorIndex] ShouldLightBeOn := LightsState[ActorIndex] do: Logger.Print("Adding Light at index {ActorIndex} with State:{if (ShouldLightBeOn?) then "On" else "Off"}") if (ShouldLightBeOn?) then LightDevice.TurnOn() else LightDevice.TurnOff() LightDevice
- Vous pouvez convertir une classe en l'une de ses sous-classes (processus appelé conversion de type(verse-glossary#type-casting)) en utilisant la syntaxe
- Votre méthode
SetupPuzzleLights()doit maintenant être similaire à ceci :SetupPuzzleLights() : void = TaggedActors := GetCreativeObjectsWithTag(puzzle_light{}) <# Pour chaque appareil avec la balise puzzle_light, vérifiez s'il s'agit d'un appareil customizable_light_device en essayant de le convertir en ce type. S'il est converti, obtenez son état LightState initial pour allumer (TurnOn()) ou éteindre (TurnOff()) l'appareil LightDevice. Enregistrez tous les appareils customizable_light_device balisés dans la matrice Lumières. #> set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] ShouldLightBeOn := LightsState[ActorIndex] do: Logger.Print("Adding Light at index {ActorIndex} with State:{if (ShouldLightBeOn?) then "On" else "Off"}") if (ShouldLightBeOn?) then LightDevice.TurnOn() else LightDevice.TurnOff() LightDevice - Enregistrez le script dans Visual Studio Code.
- Dans la barre d'outils de l'UEFN, cliquez sur Générer les scripts Verse pour compiler votre code.
- Cliquez sur Jouer dans la barre d'outils de l'UEFN pour tester le niveau.
Lorsque vous testez votre niveau, chaque lumière ajoutée à la matrice Lights ainsi que son état initial doivent s'afficher dans le journal de sortie.
Étape suivante
Dans l'étape suivante de ce tutoriel, vous apprendrez à activer/désactiver un ensemble spécifique de lumières lorsque le joueur appuie sur les boutons.