Konfigurowanie poziomu
Na początek zainicjuj nowy projekt z szablonu wyspy Fall Guys – starter. Ta wyspa startowa zawiera gotową trasę, po której możesz nawigować. Dzięki informacjom z tego samouczka spersonalizujesz ją, dodając ruch.
Definiowanie ruchomych rekwizytów
Zanim zaczniesz poruszać rekwizytami, musisz zdefiniować, czym jest ruchomy rekwizyt. Możesz użyć Verse, aby bezpośrednio poruszać rekwizytem, ale jeśli chcesz poruszać wieloma rekwizytami naraz, sprawy się komplikują. Zamiast tego zdefiniujesz klasę abstrakcyjną movable_prop. Będzie ona zawierała rekwizyt, który ma się poruszać, i kilka innych wartości, których użyjesz, aby spersonalizować logikę i synchronizację czasową ruchu.
Wykonaj poniższe kroki, aby zdefiniować ruchomy rekwizyt:
Przy użyciu
Eksploratora Verseutwórz nową klasę Verse o nazwie movable_prop. Jest to klasa Verse, a nie urządzenie, dlatego utwórz plik przy użyciu opcji Utwórz pusty. Będzie to klasa abstrakcyjna, z której wyprowadzisz różne typy podklas ruchomych rekwizytów, dlatego dodaj do niej specyfikator<abstract>. Aby dowiedzieć się, jak utworzyć nową klasę w Verse, patrz: Modyfikacja i uruchomienie pierwszego programu Verse.Verse# Defines a Creative prop that moves to a target or location using animation. movable_prop<public> := class<abstract>():Na początku pliku dodaj ścieżki importu
using { /Fortnite.com/Devices },using { /Verse.org/Simulation }iusing { /UnrealEngine.com/Temporary/SpatialMath }. Musisz zaimportować te moduły, aby móc obsługiwać funkcje matematyczne, dzięki którym rekwizyty się poruszają.Każde z pól tej klasy będzie zawierało podpowiedź
ToolTip. Dodanie komunikatuToolTipdo edytowalnych pól powoduje wyświetlanie podpowiedzi, gdy kursor myszy znajduje się nad polem w UEFN. Poniżej znajdują się wszystkie podpowiedzi użyte w tej klasie. Możesz skopiować i wkleić te podpowiedzi lub zdefiniować własne.Verseusing { /Fortnite.com/Devices } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/SpatialMath } MoveDurationTip<localizes>:message = "The amount of time the prop takes to move to its destination." MoveEaseTypeTip<localizes>:message = "The animation easing applied to the movement." MoveEndDelayTip<localizes>:message = "The delay after the movement finishes." MoveOnceAndStopTip<localizes>:message = "Whether the RootProp should stop in place after it finishes moving." MoveStartDelayTip<localizes>:message = "The delay before the movement starts." MoveTargetsTip<localizes>:message = "The array of CreativeProp to move toward. These targets can be children of the RootProp."Zdefiniuj pola, których wymaga każdy ruchomy rekwizyt. Do definicji klasy
movable_propdodaj następujące pola:Edytowalne pole
creative_propo nazwieRootProp. Jest to rekwizyt Trybu kreatywnego, który będzie się poruszał podczas rozgrywki.Verse# The Creative prop associated with this class. # This should be the root prop of the object you want to move. @editable {ToolTip := RootPropTip} RootProp:creative_prop = creative_prop{}Edytowalne pole
float(wartość zmiennopozycyjna) o nazwieMoveDuration. Jest to ilość czasu, jaką zajmuje rekwizytowi przemieszczenie się do miejsca docelowego.Verse# The duration in seconds it takes for the prop to move to its destination. @editable {ToolTip := MoveDurationTip} MoveDuration:float = 3.0Edytowalne pole
float(wartość zmiennopozycyjna) o nazwieMoveStartDelay. Jest to czas w sekundach, przez który rekwizyt czeka, zanim zacznie się poruszać.Verse# The duration in seconds to wait before movement begins. @editable {ToolTip := MoveStartDelayTip} MoveStartDelay:float = 0.0Edytowalne pole
float(wartość zmiennopozycyjna) o nazwieMoveEndDelay. Jest to czas w sekundach, przez który rekwizyt czeka, gdy skończy się poruszać.Verse# The duration in seconds to wait after movement ends. @editable {ToolTip := MoveEndDelayTip} MoveEndDelay:float = 0.0Edytowalne pole
logic(wartość logiczna) o nazwieMoveOnceAndStop. Kontroluje, czy rekwizyt porusza się tylko raz, czy po zakończeniu powtarza ruch.Verse# Whether the RootProp should stop in place when it finishes moving. @editable {ToolTip := MoveOnceAndStopTip} MoveOnceAndStop:logic = falseEdytowalne pole
logic(wartość logiczna) o nazwieShouldReset. Kontroluje, czy rekwizyt powraca do pierwotnej pozycji, gdy skończy się ruszać.Verse# Whether the RootProp should reset back to the starting position when it # finishes moving. @editable {ToolTip := ShouldResetTip} ShouldReset:logic = falsePrzekształcenie zmiennej o nazwie
StartingTransform. Jest to przekształcenie, w którym znajduje sięRootPropw momencie, gdy zaczyna się ruszać.Verse# The starting transform of the RootProp. var StartingTransform:transform = transform{}
Gotowa definicja klasy powinna wyglądać następująco:
Verseusing { /Fortnite.com/Devices } using { /Fortnite.com/Devices/CreativeAnimation } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/SpatialMath } MoveDurationTip<localizes>:message = "The amount of time in seconds the prop takes to move to its destination." MoveEaseTypeTip<localizes>:message = "The animation easing applied to the movement." MoveEndDelayTip<localizes>:message = "The delay after the movement finishes." MoveOnceAndStopTip<localizes>:message = "Whether the RootProp should stop in place after it finishes moving." MoveStartDelayTip<localizes>:message = "The delay before the movement starts."Zanim rekwizyt się poruszy, musi wiedzieć, skąd zaczyna wykonywać ruch. W tym celu zdefiniujesz nową funkcję, aby przed wykonaniem ruchu ustawić
StartingTransform:Dodaj nową metodę
SetStartingTransform()do definicji klasymovable_prop.W
SetStartingTransform()ustawStartingTransformna przekształcenieRootPropprzy użyciuGetTransform().Ukończona funkcja
SetStartingTransform()powinna wyglądać następująco:Verse# Sets the StartingTransform to the current transform of the RootProp. SetStartingTransform():void= set StartingTransform = RootProp.GetTransform()
Aby zacząć poruszać rekwizytem, zdefiniujesz nową funkcję
Move():Dodaj nową metodę
Move()do definicji klasymovable_prop.Dodaj modyfikator
<suspends>, aby ta funkcja mogła działać asynchronicznie. Jest to wersja klasy bazowej tej funkcji i nie będzie używana, dlatego od razu zastosujreturn.Ukończona funkcja
Move()powinna wyglądać następująco:Verse# Move the RootProp to its target. This is the base class # version of this function and should not be used. Move()<suspends>:void= return
Jeśli po zakończeniu ruchu rekwizyt ma się resetować, musisz go teleportować z powrotem do pozycji początkowej. W tym celu dodaj nową metodę
Reset()do definicji klasymovable_prop:Do tej funkcji dodaj modyfikatory
<decides><transacts>, aby umożliwić wycofanie w razie niepowodzenia resetu. Może tak się stać, gdy w trakcie rozgrywki rekwizyt zostanie zniszczony.W
Reset()teleportujRootPropz powrotem doStartingTransformprzy użyciuTeleportTo[].Ukończona funkcja
Reset()powinna wyglądać następująco:Verse# Reset the RootProp by teleporting it back to its Starting Transform. Reset()<decides><transacts>:void= RootProp.TeleportTo[StartingTransform]
Po zdefiniowaniu wielu funkcji czas je wszystkie połączyć. Aby zarządzać wszystkimi różnymi funkcjami ruchu, dodaj nową metodę
ManageMovement()do definicji klasymovable_prop. Dodaj modyfikator<suspends>, aby ta funkcja mogła działać asynchronicznie.Verse# Loops moving the RootProp to its target by calling Move(), and handles # any logic when the movement begins and ends. ManageMovement()<suspends>:void=W
ManageMovement()utwórz wyrażenieloop, które zarządza ruchem. Wewnątrz pętli najpierw wywołajSleep()w celu odczekania liczby sekund określonej wMoveStartDelay, a następnie wywołajMove().Verse# Loops moving the RootProp to its target by calling Move(), and handles # any logic when the movement begins and ends. ManageMovement()<suspends>:void= loop: Sleep(MoveStartDelay) Move()Gdy platforma zakończy ruch, musi się poruszać dalej, zresetować pozycję lub zatrzymać się w miejscu. Aby obsłużyć zatrzymanie, w wyrażeniu
ifsprawdź, czyMoveOnceAndStopma wartość true. Jeśli tak jest, wyjdź z pętli przy użyciu instrukcjibreak. Po zatrzymaniu ruchu wywołajSleep()w celu odczekania liczby sekund określonej wMoveEndDelay. Na koniec w innym wyrażeniuifsprawdź, czyShouldResetma wartość true. Jeśli tak jest, wywołajReset[]. Ukończona funkcjaManageMovement()powinna wyglądać następująco:Verse# Loops moving the RootProp to its target by calling Move(), and handles # any logic when the movement begins and ends. ManageMovement()<suspends>:void= loop: Sleep(MoveStartDelay) Move() # If the prop should only move once and stop, then exit the loop. if:W tej klasie nie ma funkcji
OnBegin(), dlatego potrzebujesz sposobu, który pozwoli innym klasom wywołaćManageMovement(), aby rozpocząć ruch platformy. Dodaj nową funkcjęSetup()do definicji klasymovable_prop. WSetup()najpierw wywołajSetStartingTransform(), a następnie spawnuj funkcjęManageMovement(), aby wprawić platformę w ruch. Ukończona funkcjaSetup()powinna wyglądać następującoVerse# Set the StartingTransform, then begin movement by spawning ManageMovement. Setup():void= SetStartingTransform() spawn{ManageMovement()}
Następne
Klasa abstrakcyjna jest gotowa. W kolejnym kroku dowiesz się, jak użyć animacji, aby wprawić rekwizyt w ruch!
Complete Code
Oto kompletny kod utworzony w tej sekcji:
movable_prop.verse
using { /Fortnite.com/Devices }
using { /Fortnite.com/Devices/CreativeAnimation }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/SpatialMath }
MoveDurationTip<localizes>:message = "The amount of time in seconds the prop takes to move to its destination."
MoveEaseTypeTip<localizes>:message = "The animation easing applied to the movement."
MoveEndDelayTip<localizes>:message = "The delay after the movement finishes."
MoveOnceAndStopTip<localizes>:message = "Whether the RootProp should stop in place after it finishes moving."
MoveStartDelayTip<localizes>:message = "The delay before the movement starts."