Generowanie unikalnej sekwencji siatki platform, w której gracz może skoczyć tylko na kilka platform w każdym rzędzie, stosuje się powszechnie w modyfikacjach gier bazujących na wykorzystaniu platform. Gracze muszą więc zwolnić tempo i rozgryźć sekwencję.
Ten samouczek pokazuje, jak wygenerować siatkę platform, w której w każdym rzędzie losowo wybrane platformy mają kolizję i wyróżniający je jasny kolor, podczas gdy reszta nie ma tych cech.
Tworzenie gotowca platformy
Postępuj zgodnie z poniższymi instrukcjami, aby utworzyć gotowiec platformy, który będziesz spawnować z Verse:
Umieść nową jednostkę i przekształć ją na gotowiec o nazwie choose_one_platform_prefab. Instrukcje znajdują się w sekcji Instancje gotowców i gotowców.
W Edytorze gotowców dodaj następujące komponenty do jednostki:
transform_component: Komponent Przekształć do pozycjonowania Platformy.
mesh_component: Komponent siatki do ustawiania statycznej siatki platformy. W tym przykładzie użyto siatki SM_block_02 z zasobu Pakietu świata stylizowanego Egiptu na rynku Fab.
Collision_component: Komponent kolizji do włączania i wyłączania kolizji na platformie.
parent_constraint_component: Nadrzędny komponent ograniczenia do łatwego ustawiania przekształcenia względem jednostki nadrzędnej podczas spawnowania tego gotowca w świecie przy użyciu Verse.
Dodaj jednostkę podrzędną i nazwij ją Light.
Dodaj następujące komponenty do jednostki podrzędnej Light:
Przekształć komponent: Komponent Przekształć, który pozycjonuje Jednostkę nad Platformą.
point_light_component: Komponent światła punktowego, który dodaje źródło światła zmieniające kolory w zależności od tego, czy platforma ma kolizję.
parent_constraint_component: Komponent ograniczający parent entity, który ogranicza przekształcenie tej jednostki względem jednostki nadrzędnej.
Zapisz gotowiec.
Gotowiec pojawi się teraz w pliku Assets.digest.verse jako klasa o takiej samej nazwie jak gotowiec, choose_one_platform_prefab.
Spawnowanie siatki platform
Postępuj zgodnie z poniższą instrukcją, aby zespawnować siatkę utworzoną z gotowca platformy:
Utwórz komponent Verse o nazwie select_one_component. Informacje na temat tworzenia komponentu Verse zawiera temat Tworzenie własnego komponentu Verse
Dodaj następujące edytowalne właściwości:
Pole wektora 2D liczby całkowitej
vector2io nazwieGridSizew celu określenia liczby platform w siatce. X to liczba rzędów, a Y to liczba kolumn w siatce.Pole zmiennoprzecinkowe
vector22D o nazwiePlatformSpacingsłużące do określania odstępów między platformami w wierszach i kolumnach.~~~(verse) GridSizeTip<localizes>:komunikat = "Rozmiar siatki, przy czym siatka ma szerokość X jednostek i głębokość Y jednostek." PlatformSpacingTip<localizes>:komunikat = "Odległość między każdą Platformą na siatce."
choose_one_component<public> := class(component):
# Rozmiar siatki, gdzie szerokość siatki wynosi X jednostek, a głębokość Y jednostek. @editable_vector_number(int): ToolTip := GridSizeTip MinComponentValue := option{0} GridSize:vector2i = vector2i{X := 3, Y := 10}
# Odległość między platformami na siatce. @editable_vector_number(float): ToolTip := PlatformSpacingTip MinComponentValue := option{0.0} PlatformSpacing:vector2 = vector2{X := 256.0, Y := 256.0} ~~~
W funkcji
OnSimulatewykonaj iterację po wektorzeGridSize, aby dowiedzieć się, ile platform zespawnować. W pętli utwórz instancję klasy gotowca i dodaj ją do jednostki, do której dołączony jest komponent Verse, aby zespawnować gotowca w świecie.~~~(verse) GridSizeTip<localizes>:komunikat = "Rozmiar siatki, przy czym siatka ma szerokość X jednostek i głębokość Y jednostek." PlatformSpacingTip<localizes>:komunikat = "Odległość między każdą Platformą na siatce."
choose_one_component<public> := class(component):
# Rozmiar siatki, gdzie szerokość siatki wynosi X jednostek, a głębokość Y jednostek. @editable_vector_number(int): ToolTip := GridSizeTip MinComponentValue := option{0} GridSize:vector2i = vector2i{X := 3, Y := 10}
# Odległość między platformami na siatce. @editable_vector_number(float): ToolTip := PlatformSpacingTip MinComponentValue := option{0.0} PlatformSpacing:vector2 = vector2{X := 256.0, Y := 256.0}
OnSimulate<override>()<suspends>:void= # Spawnuj platformy, aby utworzyć siatkę. for (Column := 0..GridSize.Y - 1): for (Row := 0..GridSize.X - 1): # Utworzenie instancji gotowca i dodanie jej do istniejącej jednostki spowoduje zespawnowanie gotowca w świecie. ChooseOnePlatform := choose_one_platform_prefab{} Jednostka.AddEntities(array{ChooseOnePlatform}) ~~~
Jeśli wykonasz kod teraz, wszystkie platformy zostaną zespawnowane w tej samej lokalizacji. Gotowiec zawiera komponent transformacji oraz komponent ograniczenia nadrzędnego, dlatego można ustawić właściwość InitialRelativeTransform jego komponentu transformacji w taki sposób, aby tworzył gotowiec z przesunięciem względem lokalizacji jednostki, do której jest dodawany gotowiec. Bez nadrzędnego komponentu ograniczenia na jednostce, którą spawnujesz, konieczne byłoby określenie lokalizacji w przestrzeni świata (a nie względem jednostki głównej).
VerseGridSizeTip<localizes>:message = "Size of the grid, where the grid is X units wide by Y units deep." PlatformSpacingTip<localizes>:message = "The distance between each platform on the grid." choose_one_component<public> := class(component): # Size of the grid, where the grid is X units wide by Y units deep. @editable_vector_number(int): ToolTip := GridSizeTip MinComponentValue := option{0} GridSize:vector2i = vector2i{X := 3, Y := 10}Zapisz i skompiluj swój kod.
Jeśli dołączysz ten komponent Verse do jednostki i uruchomisz sesję, siatka platform pojawi się w lokalizacji tej jednostki.
Losowe wybieranie prawidłowych platform
Teraz, gdy masz już siatkę platform zespawnowaną w świecie, możesz dodać do niej więcej funkcji. Poniższa instrukcja pokazuje, jak losowo wybierać platformy do kolizji, aby wygenerować unikalną i zmieniającą się sekwencję platform, przez które gracz może przeskakiwać.
Postępuj zgodnie z poniższą instrukcją, aby losowo wybrać prawidłowe platformy w siatce:
Dodaj następujące edytowalne właściwości do komponentu Verse:
Zmienna liczby całkowitej o nazwie
MinCorrectPlatformsPerRoww celu określenia minimalnej liczby platform, które mają kolizję.Zmienna z liczbą całkowitą o nazwie
MaxCorrectPlatformsPerRowokreślająca maksymalną liczbę platform, w których występuje kolizja.Zmienna koloru o nazwie
ChosenColordo ustawiania koloru platformy, jeśli włączona jest kolizja.Zmienna koloru o nazwie
NotChosenColordo ustawiania koloru Platformy, jeśli kolizja nie jest włączona.Verseusing { /UnrealEngine.com/Temporary/SceneGraph } using { /UnrealEngine.com/Temporary/SpatialMath } using { /Verse.org } using { /Verse.org/Colors } using { /Verse.org/Native } using { /Verse.org/Random } using { /Verse.org/Simulation } GridSizeTip<localizes>:message = "Size of the grid, where the grid is X units wide by Y units deep." PlatformSpacingTip<localizes>:message = "The distance between each platform on the grid."
Wynikiem wyrażenia
forjest tablica każdej iteracji. Zapisz wszystkie platformy zespawnowane dla rzędu w tablicy i przekaż tę tablicę do funkcji losowego ustawiania platform o nazwieRandomizeCollidablePlatformsPerRow().VerseOnSimulate<override>()<suspends>:void= # For each row, spawn multiple platforms and pick a number of them to have collision while the others don't. # The platforms with collision will have the Chosen color for their light component. # The platforms without collision will have the NotChosen color for their light component. for (Row := 0..GridSize.Y - 1): EntitiesInRow := for (Column := 0..GridSize.X - 1): # The prefab has a parent constraint component so set the InitialRelative Transform # on the transform component to offset each platform relative to this entity. # This means the platform prefabs will spawn same distance from each other # but moving the root entity will change where the platforms originate.Utwórz funkcję o nazwie
RandomizeCollidablePlatformsPerRow, która powinna losowo wybierać Jednostki, by miały kolizję, a następnie wyłączać kolizję dla wszystkich Jednostek. Światło punktowe component znajduje się na jednostce podrzędnej gotowca, dlatego możesz użyćFindComponentsdo wyszukania wśród jednostek podrzędnych jednostki pod kątem zmiany koloru światła punktowego.Verse# Randomly choose platforms to have collision in the row. RandomizeCollidablePlatformsPerRow(Entities:[]entity):void= # Disable all the entities before choosing which ones to enable. # It disables an entity by disabling the collision on the entity, # and finding a point light in its child entities to change its color. for: EntityPlatform : Entities Collision := EntityPlatform.GetComponents(collision_component)[0] Light := EntityPlatform.FindComponents(point_light_component)[0] do:Utwórz metodę rozszerzającą dla tablic o nazwie
SelectOne,aby wybrać losowy element z tablicy. Wynikiem jest krotka zawierająca zarówno wybrany element, jak i tablicę ze wszystkimi innymi elementami, które nie zostały wybrane.Verse# An extension method for an array to get a randomly selected element from the array. (Input:[]t where t:subtype(comparable)).ChooseOne()<decides><transacts>:tuple(t, []t)= ChosenElement := Input[GetRandomInt(0, Input.Length - 1)] NotChosenElements := Input.RemoveFirstElement[ChosenElement] (ChosenElement, NotChosenElements)Wywołaj metodę
SelectOnezRandomizeCollidablePlatformsPerRow, aby wybrać jednostkę, w której występuje kolizja, i zmienić jej kolor.Verse# Randomly choose platforms to have collision in the row. RandomizeCollidablePlatformsPerRow(Entities:[]entity):void= # Disable all the entities before choosing which ones to enable. # It disables an entity by disabling the collision on the entity, # and finding a point light in its child entities to change its color. for: EntityPlatform : Entities Collision := EntityPlatform.GetComponents(collision_component)[0] Light := EntityPlatform.FindComponents(point_light_component)[0] do:Zaktualizuj
RandomizeCollidablePlatformsPerRow, aby wybrać wiele jednostek do kolizji na podstawie edytowalnych właściwości. Najpierw pobierz losową wartość pomiędzy minimalną i maksymalną liczbą poprawnych platform na wiersz, po czym wybierz jednostkę tyle razy, a następnie usuń wybraną jednostkę z listy kolejnych kandydatów do wyboru.Verse# Randomly choose platforms to have collision in the row. RandomizeCollidablePlatformsPerRow(Entities:[]entity):void= # Disable all the entities before choosing which ones to enable. # It disables an entity by disabling the collision on the entity, # and finding a point light in its child entities to change its color. for: EntityPlatform : Entities Collision := EntityPlatform.GetComponents(collision_component)[0] Light := EntityPlatform.FindComponents(point_light_component)[0] do:Zapisz i skompiluj swój kod.
Jeśli teraz uruchomisz sesję, w świecie zespawnowana zostanie siatka platform z unikalną sekwencją platform, które mają kolizję i wybrany kolor.
Kompletny skrypt
using { /UnrealEngine.com/Temporary/SceneGraph }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Verse.org }
using { /Verse.org/Colors }
using { /Verse.org/Native }
using { /Verse.org/Random }
using { /Verse.org/Simulation }
GridSizeTip<localizes>:message = "Size of the grid, where the grid is X units wide by Y units deep."
PlatformSpacingTip<localizes>:message = "The distance between each platform on the grid."