Ta strona poprowadzi cię przez proces tworzenia nowego komponentu Scene Graph o nazwie puzzle_component, który zarządza łamigłówką zbudowaną z jednostek Scene Graph. Po utworzeniu umieść puzzle_component na jednostce Scene Graph, aby ustalić, czy łamigłówka składająca się z jednostek potomnych Scene Graph z aktywowanymi komponentami określonymi jako elementy łamigłówki została rozwiązana.
Na przykład poniższy obraz przedstawia prostą łamigłówkę, którą utworzysz w ostatniej sekcji tego samouczka.
Outliner odpowiadający tej łamigłówce pokazano na kolejnej ilustracji.
Każda jednostka potomna Prefab_PuzzleManager jest częścią łamigłówki, zarządzaną przez odpowiadający jej puzzle_component komponentu Prefab_PuzzleManager. puzzle_component:
Odbiera zdarzenia, gdy element łamigłówki zostaje przełączony na konfigurację rozwiązania.
Określa, kiedy łamigłówka zostaje rozwiązana.
Po rozwiązaniu łamigłówki wysyła zdarzenia w dół hierarchii Scene Graph, aby aktywować działania odpowiadające rozwiązaniu.
Gdy gracz stanie na platformach i włączy oba światła, siatka zostanie animowana i ulegnie przekształceniu.
Aby dowiedzieć się więcej na temat funkcji języka Verse używanych na tej stronie, patrz:
Definiowanie zdarzenia rozwiązania łamigłówki
Aby rozpocząć, przejdź do Eksploratora Verse, kliknij prawym przyciskiem myszy nazwę projektu i wybierz opcję Dodaj nowy plik Verse do projektu.
Wybierz szablon komponentu Scene Graph i zmień nazwę komponentu na puzzle_component.
Zdefiniuj
puzzle_solved_event. Jest to zdarzenie, które jest transmitowane przez hierarchię Scene Graph po rozwiązaniu łamigłówki, aby uruchomić akcję, taką jak otwarcie bramy lub wydłużenie mostu, dzięki czemu gracz może wyjść poza obszar ogrodzony łamigłówką. Zdefiniujpuzzle_solved_eventjako klasę pochodnąscene_event. To zdarzenie nie wymaga żadnych parametrów przekazywanych w dół hierarchii.Versepuzzle_solved_event<public> := class(scene_event){}
Definiowanie komponentu łamigłówki
Następnie zdefiniuj puzzle_component z polami i funkcjami w celu zarządzania łamigłówką i określenia, czy została ona rozwiązana.
Dodaj pola, aby śledzić, czy łamigłówka została rozwiązana, określić tablicę wskazującą, które elementy łamigłówki są w konfiguracji rozwiązanej łamigłówki, a także to, czy elementy łamigłówki nadal się aktywują po rozwiązaniu łamigłówki:
Versepuzzle_component := class<final_super>(component): # Is this puzzle component solved var<private> Solved<public>:logic = false # Map of puzzle pieces and whether they have been "solved" var<private> TriggerableEntities<private>:[]entity = array{} # Disable puzzle pieces triggering once puzzle is solved @editableDodaj funkcję o nazwie
InitializeTriggerableDescendantEntitiesdo inicjowania listy wszystkich elementów łamigłówki będących częścią tej łamigłówki. Funkcja ta wykonuje przejście w dół hierarchii Scene Graph, aby wyszukać wszystkie jednostki możliwe do aktywowania, oznaczone jako element łamigłówki, i dodaje je do tablicyTriggerableEntities.Verse# Initialize array of triggerable entities InitializeTriggereableDescendantEntities<private>()<transacts>:void= for: DescendantEntity : Entity.FindDescendantEntities(entity) DescendantEntityComponent : DescendantEntity.GetComponents() CastToTriggerable := triggerable[DescendantEntityComponent] CastToTriggerable.PuzzlePiece? do: set TriggerableEntities += array{DescendantEntity}Dodaj funkcję o nazwie
DisableTriggerableComponents, aby wyłączyć wszelkie możliwe do aktywowania komponenty jednostek potomnych.Verse# Disable puzzle pieces DisableTriggerableComponents<private>():void= for: DescendantEntity : Entity.FindDescendantEntities(entity) DescendantEntityComponent : DescendantEntity.GetComponents() CastToTriggerable := triggerable[DescendantEntityComponent] CastToTriggerable.PuzzlePiece? CastToEnableable := enableable[DescendantEntityComponent] do: CastToEnableable.Disable()Dodaj funkcję o nazwie
IsPuzzleSolved, która decyduje, czy łamigłówka jest rozwiązana. Odbywa się to poprzez iterację po wszystkich wcześniej znalezionych jednostkach potomnych za pomocą komponentu implementującego interfejsz możliwością aktywowania, sprawdzając, czy powiązana jednostka jest oznaczona jako element łamigłówki oraz czy stan komponentu jednostki, implementującyaktywowanyinterfejs, znajduje się w stanie rozwiązanym.Verse# Decides whether puzzle is solved IsPuzzleSolved<private>()<decides><transacts>:void= for: TriggerableEntity : TriggerableEntities TriggerableEntityComponent : TriggerableEntity.GetComponents() CastToTriggerable := triggerable[TriggerableEntityComponent] CastToTriggerable.PuzzlePiece? do: CastToTriggerable.InSolvedState[]Dodaj funkcję o nazwie
HandlePuzzleSolved, która będzie wykonywać wszystkie niezbędne akcje po ustaleniu, że łamigłówka została rozwiązana. Obejmuje to ustawienie polaRozwiązanedla tej klasy, wyłączenie aktywowanych elementów łamigłówki na podstawie pola klasyDisablePuzzleTriggerablesWithSolvedoraz wysłanie zdarzeniapuzzle_solved_eventw dół hierarchii Scene Graph.Verse# Handle all necessary actions once puzzle is known to be solved HandlePuzzleSolved<private>():void= set Solved = true if (DisablePuzzleTriggerablesWhenSolved?): DisableTriggerableComponents() Entity.SendDown(puzzle_solved_event{})Następnie dodaj funkcję o nazwie
CheckPuzzleSolution. Jest to asynchroniczna funkcja otoki, która określa, czy łamigłówka została rozwiązana za pomocą funkcjiIsPuzzleSolved,a jeśli tak, wywołuje również funkcjęHandlePuzzleSolvedw celu wykonania niezbędnych działań po rozwiązaniu łamigłówki.Verse# Async wrapper for determining whether puzzle is solved CheckPuzzleSolved()<suspends>:void= Sleep(0.25) if (not Solved?, IsPuzzleSolved[]): HandlePuzzleSolved()Dodaj zastąpienie dla funkcji
OnReceiveklasy komponentu Scene Graph.Verse# Handle triggered events sent through the Scene Graph hierarchy OnReceive<override>(SceneEvent:scene_event):logic= if (TriggeredEvent := triggered_event[SceneEvent], TriggeredEntity := TriggeredEvent.TriggeredEntity?): spawn{CheckPuzzleSolved()} true falseDodaj wywołanie
InitializeTriggerableDescendantEntitiesdo funkcji komponentuOnBeginSimulation.Verse# Runs when the component should start simulating in a running game. OnBeginSimulation<override>():void = # Run OnBeginSimulation from the parent class before # running this component's OnBeginSimulation logic (super:)OnBeginSimulation() InitializeTriggereableDescendantEntities()
Kolejne kroki
Następnie utwórz komponent aktywatora i komponenty z możliwością aktywowania, które zaimplementują interfejs z możliwością aktywowania.
Kod końcowy Puzzle.verse
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Verse.org/SceneGraph }
using { Logging }
puzzle_solved_event<public> := class(scene_event){}
# Scene Graph component handling puzzle component triggered events and when the puzzle is solved.
puzzle_component := class<final_super>(component):