Wykonując ten krok w samouczku Łamigłówka z otagowanymi światłami, nauczysz się wykorzystywać tagi rozgrywki do wyszukiwania aktorów oznaczonych konkretnym tagiem, gdy gra jest uruchomiona. Tagi rozgrywki umożliwiają pracę z wieloma urządzeniami bez konieczności konfigurowania ich odwołań w edytorze. Daje to możliwość tworzenia interesujących rozgrywek, w których na przykład kod zmienia dynamicznie aktywne urządzenia w miarę postępów gracza w grze.
Aby utworzyć nowy tag rozgrywki i przypisać go do wszystkich świateł danego poziomu w łamigłówce, wykonaj następujące instrukcje:
- Otwórz Eksplorator Verse i kliknij dwukrotnie plik tagged_lights_puzzle.verse, aby otworzyć skrypt w Visual Studio Code.
- U góry pliku z kodem:
- Dodaj wiersz
using { /Verse.org/Simulation/Tags }, aby utworzyć odwołanie do klasytagi użyć funkcjiGetCreativeObjectsWithTag(). - Dodaj wiersz
using { /Verse.org/Simulation }, aby ustawić możliwość edycji właściwości.
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){} - Dodaj wiersz
-
Nad klasą
log_tagged_lights_puzzledodaj nową podklasę o nazwiepuzzle_light, która będzie dziedziczyć z klasytag. Nazwa dziedziczonej klasy stanie się niestandardowym tagiem rozgrywki, który będzie można zastosować do dowolnego urządzenia w trybie kreatywnym.# Wyprowadź z klasy `tag` w module Verse.org/Simulation/Tags, aby utworzyć nowy tag rozgrywki. puzzle_light := class(tag){} log_tagged_lights_puzzle := class(log_channel){} - Na pasku narzędzi UEFN kliknij opcję Kompiluj skrypty Verse, aby skompilować swój kod oraz nowy tag rozgrywki
puzzle_lightdo swojego projektu. - W obszarze Outliner w UEFN wybierz opcję Urządzenie konfigurowalnego światła, aby otworzyć jego panel Szczegóły.
- W panelu Szczegóły:
- Kliknij opcję Dodaj nowy komponent i wybierz pozycję Znacznik tagu Verse.
- Wybierz komponent VerseTagMarkup, aby wyświetlić jego ustawienia w panelu Szczegóły.
- W obszarze Tagi rozgrywki edytuj właściwość Tagi i dodaj tag
puzzle_light.

Do jednego urządzenia można dodać wiele tagów, dlatego każde urządzenie może równocześnie należeć do wielu grup. Na przykład urządzenie oznaczone tagami
tag1itag2zostanie znalezione w przypadku wywołania zarówno funkcjiGetCreativeObjectsWithTag(tag1{}), jak i funkcjiGetCreativeObjectsWithTag(tag2{}). - W definicji klasy
tagged_lights_puzzledodaj dwa pola tablicy zmiennych:- Edytowalna tablica zmiennych
logico nazwieLightsState, która będzie odzwierciedlać bieżący stan wszystkich świateł (ich włączenia lub wyłączenia). Posłuży ona również do ustalenia stanu początkowego świateł, tak aby liczba zawartych w nich elementów była zgodna z liczbą świateł oznaczonych tagiempuzzle_light. W tym przykładzie wszystkie światła są domyślnie wyłączone, dlatego wartością początkową wszystkich świateł jestfalse.@editable var LightsState : []logic = array{false, false, false, false} - Edytowalna tablica zmiennych
customizable_light_deviceo nazwieLights, w której przechowywane będą wszystkie urządzenia konfigurowalnego światła oznaczone tagiem rozgrywkipuzzle_light.@editable var Lights : []customizable_light_device = array{}
- Edytowalna tablica zmiennych
- Po rozpoczęciu gry urządzenie powinno ustawić światła zgodnie z początkową konfiguracją zdefiniowaną w tablicy
LightsStatei zapisać odwołania w tablicyLights, aby można je było aktualizować w przypadku zmian stanu gry. Praca ta będzie realizowana w metodzieSetupPuzzleLights() : voidi wywoływana w metodzieOnBegin(), aby światła zostały ustawione, gdy gra się rozpocznie.SetupPuzzleLights() : void = Logger.Print(“Konfigurowanie świateł w grze”) OnBegin<override>()<suspends> : void = SetupPuzzleLights() - W metodzie
SetupPuzzleLights()wyszukaj wszystkie urządzenia oznaczone tagiempuzzle_light, wywołując funkcjęGetCreativeObjectsWithTag(puzzle_light{}), i zapisz je w tablicy o nazwieTaggedActors. TablicaTaggedActorsjest tablicą stałą, której zakres jest lokalny względem metodySetupPuzzleLights(), dlatego nie musisz w sposób jawny określać typu tablicy, ponieważ w tym kontekście zostanie on domniemany.SetupPuzzleLights() : void = Logger.Print("Konfigurowanie świateł w grze") TaggedActors := GetCreativeObjectsWithTag(puzzle_light{})Różne wywołania funkcji
GetCreativeObjectsWithTag()mogą zwracać tablice wynikowe zawierające urządzenia w różnej kolejności, ponieważ przy pobieraniu aktorów za pomocą tagów rozgrywki kolejność nie jest gwarantowana. - Po zebraniu wszystkich urządzeń oznaczonych tagiem
puzzle_lightupewnij się, że każde światło jest zgodne ze stanem początkowym określonym za pomocą tablicyLightsState. Użycie pętliforpozwala na iterowanie przez wszystkie otagowane urządzenia.for: ActorIndex -> TaggedActor : TaggedActors do: TaggedActor - Funkcja
GetCreativeObjectsWithTag()zwraca tablicę typucreative_object_interface. W tym przykładzie chcesz wejść w interakcję z każdym obiektemTaggedActorbędącym obiektem typucustomizable_light_device, aby móc włączać i wyłączać światło.- Możesz skonwertować klasę na jedną z jej podklas (operacja nazywana rzutowaniem typu), wykorzystując składnię
NewDeviceReference := device_type_to_cast_to[DeviceReference], w którejdevice_type_to_cast_tojest pożądanym typem urządzenia, czyli w tym przykładziecustomizable_light_device. Jest to wyrażenie zawodne, ponieważ konwersja typu nie powiedzie się, jeśli nie można skonwertować urządzenia do tego typu (na przykład w przypadku urządzenia innego typu).LightDevice := customizable_light_device[TaggedActor]
Funkcja
GetCreativeObjectsWithTag()zawiera typ informacji zwrotnej[]creative_object_interface, ponieważ funkcja może zwracać różne typy aktorów, zatem typem zwracanej przez nią informacji jest interfejs, jaki muszą implementować wszyscy aktorzy, aby byli zwracani po wywołaniu funkcjiGetCreativeObjectsWithTag(). Aby dowiedzieć się więcej, patrz tagi rozgrywki.- Wyrażenia
forpozwalają użyć wyrażeń zawodnych jako filtra i tworzyć nowe zmienne, które następnie można wykorzystać w bloku kodufor. W tym przypadku dodaj konwersję typu docustomizable_light_devicez poprzedniego kroku do wyrażenia iteracyjnego.for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] do: LightDevice - Ostatnie wyrażenie w bloku kodu jest wynikiem bloku kodu. Wyrażenie
forzwraca wynik bloku kodu z każdej iteracji w tablicy, więc wynik tego wyrażeniaforjest tablicą odwołań do obiektówcustomize_light_deviceoznaczonych tagiempuzzle_light. To oznacza, że można zaktualizować tablicęLightsbezpośrednio o wynik wyrażeniafor.set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] do: LightDevice - Ta pętla
forpowinna również wywoływać funkcjeTurnOn()/TurnOff()w odniesieniu do świateł zgodnie z ich ustawieniem początkowymLightsStatew edytorze. Wyrażenieformoże zwrócić indeks używany do pobierania bieżącego urządzenia oznaczonego tagiem (w tym przykładzieActorIndex), który można wykorzystać do indeksowania w tablicyLightsStatew celu sprawdzenia, czy światło można włączyć lub wyłączyć.set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] ShouldLightBeOn:= LightsState[ActorIndex] do: LightDevice - Następnie wywołaj funkcję
TurnOn()/TurnOff()w zależności od tego, czyShouldLightBeOnprzyjmuje wartośćtrueczyfalse. Wyrażeniaifmożna używać do wykonywania różnych wyrażeń w zależności od stanu (a zwłaszcza wyrażenia zawodnego). W tym przypadku w wyrażeniu zawodnym można zastosować operator zapytania?w połączeniu z wyrażeniemIsLightOn, które powiedzie się, gdyShouldLightBeOnprzyjmie wartośćtrue(wywołując funkcjęTurnOn()), i zakończy się niepowodzeniem, gdyShouldLightBeOnprzyjmie wartośćfalse(wywołując funkcjęTurnOff()).set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] ShouldLightBeOn := LightsState[ActorIndex] do: if (ShouldLightBeOn?) then LightDevice.TurnOn() else LightDevice.TurnOff() LightDevice - Dobrym rozwiązaniem jest wygenerowanie indeksu światła wraz z jego wartością początkową za pomocą polecenia print w celu sprawdzenia, czy kod działa zgodnie z oczekiwaniami i porównania go z efektem widocznym w poziomie.
- Zastosowanie nawiasu
{}w środku ciągu tekstowego sprawi, że wyrażenie w nawiasie{}zostanie poddane ocenie jako pierwsze, a jego wartość zostanie dodana do ciągu tekstowego. Możesz zatem zastosować wyrażenieifw środku ciągu tekstowego, aby warunkowo dodać wartości.set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[ActorIndex] ShouldLightBeOn := LightsState[ActorIndex] do: Logger.Print("Dodawanie światła pod indeksem {ActorIndex} ze stanem:{if (ShouldLightBeOn?) then "On" else "Off"}") if (ShouldLightBeOn?) then LightDevice.TurnOn() else LightDevice.TurnOff() LightDevice
- Możesz skonwertować klasę na jedną z jej podklas (operacja nazywana rzutowaniem typu), wykorzystując składnię
- Otrzymana metoda
SetupPuzzleLights()powinna wyglądać następująco:SetupPuzzleLights() : void = TaggedActors := GetCreativeObjectsWithTag(puzzle_light{}) <# Dla każdego urządzenia oznaczonego tagiem puzzle_light, sprawdź, czy jest ono obiektem typu customizable_light_device, wykonując próbę rzutowania go do tego typu. Jeśli tak, pobierz jego stan LightState, aby włączyć za pomocą funkcji TurnOn() lub wyłączyć za pomocą funkcji TurnOff() urządzenie LightDevice. Zapisz wszystkie obiekty customizable_light_device oznaczone tagiem w tablicy świateł Lights. #> set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] ShouldLightBeOn := LightsState[ActorIndex] do: Logger.Print("Dodawanie światła pod indeksem {ActorIndex} ze stanem:{if (ShouldLightBeOn?) then "On" else "Off"}") if (ShouldLightBeOn?) then LightDevice.TurnOn() else LightDevice.TurnOff() LightDevice - Zapisz skrypt w Visual Studio Code.
- Na pasku narzędzi UEFN kliknij opcję Kompiluj skrypty Verse, aby skompilować swój kod.
- Na pasku narzędzi UEFN kliknij przycisk Odtwórz, aby przetestować poziom w grze.
W trakcie wykonywania testu gry poziomu każde światło dodane do tablicy Lights wraz ze stanem początkowym powinno zostać wyświetlone w rejestrze wyjściowym.
Następny krok
W kolejnym kroku tego samouczka dowiesz się, jak przełączać konkretny zbiór świateł, gdy gracz naciska przyciski.