Wenn du diesen Schritt im Tagged Lights Puzzle Tutorial abschließt, lernst du, wie du Gameplay-Tags verwenden kannst, um Actors zu finden, die mit einem bestimmten Tag markiert sind, während das Spiel läuft. Mit Gameplay-Tags kannst du mit mehreren Geräten arbeiten, ohne dass du ihre Referenzen im Editor einrichten musst. So können sich interessante Spielgelegenheiten ergeben, indem dein Code beispielsweise dynamisch ändert, welche Geräte aktiv sind, während der Spieler im Spiel voranschreitet.
Befolge diese Schritte, um ein neues Gameplay-Tag zu erstellen und es für das Rätsel allen Lichtern im Level zuzuweisen:
- Öffne den Verse-Explorer und klicke doppelt auf tagged_lights_puzzle.verse, um das Script in Visual Studio Code zu öffnen.
- Oben in der Codedatei:
- Füge
using { /Verse.org/Simulation/Tags }hinzu, um die Klassetagzu referenzieren und die FunktionGetCreativeObjectsWithTags()zu verwenden. - Füge
using { /Verse.org/Simulation }hinzu, um bearbeitbare Eigenschaften erstellen zu können.
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){} - Füge
-
Füge über der Klasse
log_tagged_lights_puzzleeine neue Subklasse mit dem Namenpuzzle_lighthinzu, die von der Klassetagerbt. Der geerbte Klassenname wird zu einem benutzerdefinierten Gameplay-Tag, das du auf jedem Kreativgerät verwenden kannst.# Leite die `tag`-Klasse im Verse.org/Simulation/Tags-Modul ab, um ein neues Gameplay-Tag zu erstellen. puzzle_light := class(tag){} log_tagged_lights_puzzle := class(log_channel){} - Klicke in der UEFN-Symbolleiste auf Build Verse Scripts, um deinen Code und dein neues
puzzle_lightGameplay-Tag in dein Projekt zu kompilieren. - Wähle im Outliner von UEFN ein Benutzerdefiniertes-Licht-Gerät aus, um sein Detail-Panel zu öffnen.
- Im Detail-Panel:
- Klicke auf Neue Komponente hinzufügen und wähle Verse Tag Markup.
- Wähle die Komponente VerseTagMarkup aus, um ihre Einstellungen im Tab „Details“ anzuzeigen.
- Bearbeite unter Gameplay Tags die Eigenschaft Tags und füge den Tag
puzzle_lighthinzu.

Einem Gerät können mehrere Tags hinzugefügt werden, sodass jedes Gerät zu mehreren Gruppen zugleich gehören kann. Zum Beispiel wird ein Gerät mit
tag1undtag2gefunden, wenn entwederGetCreativeObjectsWithTag(tag1{})oderGetCreativeObjectsWithTag(tag2{})aufgerufen wird. - Füge in der Klassendefinition
tagged_lights_puzzlezwei variable Matrix-Felder hinzu:- Eine bearbeitbare
Logik-Variablen-Matrix mit dem NamenLightsState, um den aktuellen Zustand aller Lichter darzustellen (ob sie ein- oder ausgeschaltet sind). Es wird auch verwendet, um den Anfangszustand der Lichter festzulegen, daher sollte die Anzahl der Elemente mit der Anzahl der Lichter übereinstimmen, die mit dem Tagpuzzle_lightgekennzeichnet sind. In diesem Beispiel sind standardmäßig alle Lichter ausgeschaltet, sodass der Startwert für alle Lichterfalseist.@editable var LightsState : []logic = array{false, false, false, false} - Ein bearbeitbares
customizable_light_device-Variablen-Array namensLights, um alle Benutzerdefiniertes-Licht-Geräte zu speichern, die mit dem Gameplay-Tagpuzzle_lightgekennzeichnet sind.@editable var Lights : []customizable_light_device = array{}
- Eine bearbeitbare
- Bei Spielbeginn sollte das Gerät die Lichter entsprechend der Anfangskonfiguration einrichten, die im
LightsState-Array angegeben ist, und die Referenzen imLights-Array speichern, damit sie aktualisiert werden können, wenn sich der Spielzustand ändert. Dies wird mit einer Methode namensSetupPuzzleLights() : voiderreicht und in der MethodeOnBegin()aufgerufen, sodass die Lichter bei Spielbeginn eingerichtet sind.SetupPuzzleLights() : void = Logger.Print(“Setting up in-game lights”) OnBegin<override>()<suspends> : void = SetupPuzzleLights() - Finde in
SetupPuzzleLights()alle Geräte mit dem Tagpuzzle_light, indem duGetCreativeObjectsWithTag(puzzle_light{})aufrufst und speichere sie in einem Array namensTaggedActors. DaTaggedActorsein konstantes Array ist, das nur für die MethodeSetupPuzzleLights()gilt, musst du nicht explizit einen Typ für das Array angeben, da er in diesem Kontext abgeleitet werden kann.SetupPuzzleLights() : void = Logger.Print("In-game-Lichter werden eingerichtet") TaggedActors := GetCreativeObjectsWithTag(puzzle_light{})Verschiedene Aufrufe der Funktion
GetCreativeObjectsWithTag()können die Geräte in unterschiedlicher Reihenfolge im Array-Ergebnis platzieren, da es beim Abrufen von Actors mit Gameplay-Tags keine garantierte Reihenfolge gibt. - Nachdem du nun alle Geräte mit dem Tag
puzzle_lightgesammelt hast, stelle sicher, dass jedes Licht dem Anfangszustand entspricht, der durch die MatrixLightsStateangegeben ist. Du kannst einefor-Schleife verwenden, um alle getaggten Geräte zu iterieren.for: ActorIndex -> TaggedActor : TaggedActors do: TaggedActor - Die Funktion
GetCreativeObjectsWithTag()gibt ein Array vom Typcreative_object_interfacezurück. In diesem Beispiel möchtest du mit jedemTaggedActoralscustomizable_light_deviceinteragieren, damit du das Licht ein- oder ausschalten kannst.- Du kannst eine Klasse in eine ihrer Subklassen konvertieren (das nennt man Typecasting), indem du die Syntax
NewDeviceReference := device_type_to_cast_to[DeviceReference]verwendest, wobeidevice_type_to_cast_toder gewünschte Gerätetyp ist, der in diesem Beispielcustomizable_light_deviceist. Dies ist ein fehlbarer Ausdruck, da die Typ-Umwandlung fehlschlägt, wenn das Gerät nicht in diesen Typ umgewandelt werden kann (z. B. wenn es sich um einen anderen Gerätetyp handelt).LightDevice := customizable_light_device[TaggedActor]
Die Funktion
GetCreativeObjectsWithTag()hat den Rückgabetyp[]creative_object_interface, weil die Funktion verschiedene Typen von Actors zurückgeben kann. Ihr Rückgabetyp ist also das interface, das alle Actors implementieren müssen, um vonGetCreativeObjectsWithTag()zurückgegeben zu werden. Siehe Gameplay-Tags, um mehr zu erfahren.- Mit
for-Ausdrücken kannst du fehlbare Ausdrücke als Filter verwenden und neue Variable erstellen, die du dann imfor-Codeblock verwenden kannst. Füge in diesem Fall die Typkonvertierung zucustomizable_light_deviceaus dem vorherigen Schritt zum Iterationsausdruck hinzu.for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] do: LightDevice - Der letzte Ausdruck in einem Codeblock ist das Ergebnis des Codeblocks. Der
for-Ausdruck gibt das Ergebnis des Codeblocks jeder Iteration in einer Matrix zurück, sodass das Ergebnis diesesfor-Ausdrucks eine Matrix voncustomize_light_device-Verweisen ist, die mitpuzzle_lightgetaggt wurden. Das bedeutet, dass du die MatrixLightsdirekt mit dem Ergebnis desfor-Ausdrucks aktualisieren kannst.set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] do: LightDevice - Diese
for-Schleife sollte für die Lichter auchTurnOn()bzw.TurnOff()aufrufen, damit sie mit ihremLightsState-Anfangszustand im Editor übereinstimmen. Der Ausdruckforkann den Index zurückgeben, der verwendet wird, um das aktuelle getaggte Gerät zu erhalten (ActorIndexim Beispiel), das du verwenden kannst, um in das ArrayLightsStatezu indizieren, um zu sehen, ob das Licht an oder aus sein soll.set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] ShouldLightBeOn:= LightsState[ActorIndex] do: LightDevice - Rufe als nächstes
TurnOn()/TurnOff()ab je nachdem, obShouldLightBeOnden Werttrueoderfalseaufweist. Du kannst einenif-Ausdruck verwenden, um verschiedene Ausdrücke auf Basis einer Bedingung (spezifisch eines fehlbaren Ausdrucks) auszuführen. In diesem Fall kann der fehlbare Ausdruck den Abfrageoperator?mitIsLightOnverwenden, was erfolgreich sein wird, wennShouldLightBeOnTrueist (also rufeTurnOn()auf), und der fehlschlägt, wennShouldLightBeOnFalseist (also rufeTurnOff()auf)set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] ShouldLightBeOn := LightsState[ActorIndex] do: if (ShouldLightBeOn?) then LightDevice.TurnOn() else LightDevice.TurnOff() LightDevice - Es ist eine gute Idee, außerdem Index und Startwert des Lichts auszudrucken, damit du überprüfen kannst, ob dein Code wie erwartet funktioniert, und ihn mit der Situation im Level vergleichen kannst.
- Wenn du
{}in der Mitte eines Strings verwendest, wird der Ausdruck in{}zuerst ausgewertet, und sein Wert wird dem String hinzugefügt. Du kannst also einenif-Ausdruck in der Mitte eines Strings verwenden, um Werte bedingt hinzuzufügen.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
- Du kannst eine Klasse in eine ihrer Subklassen konvertieren (das nennt man Typecasting), indem du die Syntax
- Deine
SetupPuzzleLights()-Methode sollte jetzt wie folgt aussehen:SetupPuzzleLights() : void = TaggedActors := GetCreativeObjectsWithTag(puzzle_light{}) <# Überprüfe bei jedem Gerät mit dem puzzle_light-Tag, ob es sich um ein customizable_light_device handelt, indem du versuchst, es auf diesen Typen anzuwenden. Ist dies der Fall, rufe seinen Anfangs-LightState ab, um TurnOn() oder TurnOff() auf das LightDevice anzuwenden. Speichere alle gekennzeichneten customizable_light_device im Lights-Array. #> 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 - Speichere das Script in Visual Studio Code.
- Klicke in der UEFN-Symbolleiste auf Build Verse Scripts (Verse-Scripte erstellen), um deinen Code zu kompilieren.
- Klicke in der UEFN-Symbolleiste auf Spielen, um das Level zu testen.
Wenn du dein Level testest, solltest du sehen, dass jedes Licht im Lights-Array mit seinem Anfangszustand im Output-Log gedruckt wird.
Nächster Schritt
Im nächsten Schritt dieses Tutorials erfährst du, wie du eine bestimmte Gruppe von Lichtern umschaltest, wenn der Spieler die Schaltflächen klickt.