Inną przeszkodą platformową często spotykaną w tym gatunku gier są obiekty, które się obracają, takie jak wirująca platforma, po której się musisz bez przerwy poruszać, albo poruszająca się do przodu i do tyłu poprzeczka, przez którą musisz przeskoczyć.
Drugim komponentem przekształcenia obiektu jest jego obrót. Można manipulować obiektem tak, aby się obracał wokół jakiejś osi. Możesz wykorzystać obrót na kilka sposobów, aby tworzyć wyjątkowe wyzwania platformowe. W tej sekcji dowiesz się, jak napisać odpowiedni kod.
Tworzenie rekwizytów, które się obracają
Wykonaj poniższe kroki, aby napisać kod, który obraca rekwizyty:
-
Przy użyciu Eksploratora Verse utwórz nową klasę Verse o nazwie
rotating_prop, która dziedziczy zmovable_prop. Do tej klasy dodaj specyfikator<concrete>, aby uwidocznić jej właściwości dla UEFN.# Rekwizyt, który obraca się o dodatkowy obrót lub zgodnie z obrotem # rekwizytu Trybu kreatywnego. rotating_prop<public> := class<concrete>(movable_prop): -
Dodaj instrukcje
using { /Fortnite.com/Devices/CreativeAnimation }iusing { /UnrealEngine.com/Temporary/SpatialMath }na początku pliku, aby zaimportować te moduły. Są one potrzebne, aby animować rekwizyt. W tym miejscu dołączono podpowiedzi użyte w tej sekcji.using { /Fortnite.com/Devices } using { /Fortnite.com/Devices/CreativeAnimation } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/SpatialMath } AdditionalRotationTip<localizes>:message = "Obrót stosowany do RootProp." ShouldRotateForeverTip<localizes>:message = "Określa, czy RootProp ma się obracać bez przerwy." MatchRotationTargetTip<localizes>:message = "Opcjonalny rekwizyt, którego obrót ma stanowić podstawę do ruchu obrotowego RootProp. Użyj go, jeśli nie chcesz ustawiać dodatkowego obrotu." # Rekwizyt, który obraca się o dodatkowy obrót lub zgodnie z obrotem # rekwizytu Trybu kreatywnego. rotating_prop<public> := class<concrete>(movable_prop): - Na początku definicji klasy
rotating_propdodaj następujące pola.-
Edytowalne
rotationo nazwieAdditionalRotation. Jest to obrót, który ma być zastosowany do rekwizytu. Po ukończeniuMove()obrót rekwizytu zostanie przesunięty o tę wartość.# Dodatkowy obrót, który ma być zastosowany do RootProp. @editable {ToolTip := AdditionalRotationTip} AdditionalRotation:rotation = rotation{} -
Edytowalna wartość logiczna
logico nazwieShouldRotateForever. Określa, czy rekwizyt ma się obracać przez cały czas bez resetowania.# Określa, czy RootProp ma się obracać bez przerwy. @editable {ToolTip := ShouldRotateForeverTip} ShouldRotateForever:logic = true -
Edytowalny opcjonalny
creative_propo nazwieMatchRotationTarget. Jeśli rekwizyt ma się obracać zgodnie z obrotem innego rekwizytu, ustaw tę wartość, zamiast używaćAdditionalRotation.# Opcjonalny rekwizyt, którego obrót ma być podstawą do zgodnego obrotu RootProp. Użyj tego, jeśli # nie chcesz ustawiać dodatkowego obrotu. @editable {ToolTip := MatchRotationTargetTip} MatchRotationTarget:?creative_prop = false -
Zmienna
rotationo nazwieTargetRotation. Jest to obrót, w którego kierunku aktualnie obraca się rekwizyt.# Obrót, w którego kierunku aktualnie obraca się rekwizyt. var TargetRotation:rotation = rotation{}
-
-
Gotowa definicja klasy powinna wyglądać następująco:
using { /Fortnite.com/Devices } using { /Fortnite.com/Devices/CreativeAnimation } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/SpatialMath } AdditionalRotationTip<localizes>:message = "Obrót stosowany do RootProp." ShouldRotateForeverTip<localizes>:message = "Określa, czy RootProp ma się obracać bez przerwy." MatchRotationTargetTip<localizes>:message = "Opcjonalny rekwizyt, którego obrót ma stanowić podstawę do ruchu obrotowego RootProp. Użyj go, jeśli nie chcesz ustawiać dodatkowego obrotu." # Rekwizyt, który obraca się o dodatkowy obrót lub zgodnie z obrotem # rekwizytu trybu kreatywnego. rotating_prop<public> := class<concrete>(movable_prop): # Dodatkowy obrót, który ma być zastosowany do RootProp. @editable {ToolTip := AdditionalRotationTip} AdditionalRotation:rotation = rotation{} # Określa, czy RootProp ma się obracać bez przerwy. @editable {ToolTip := ShouldRotateForeverTip} ShouldRotateForever:logic = true # Opcjonalny rekwizyt, którego obrót ma być podstawą do zgodnego obrotu RootProp. Użyj tego, jeśli # nie chcesz ustawiać dodatkowego obrotu. @editable {ToolTip := MatchRotationTargetTip} MatchRotationTarget:?creative_prop = false # Obrót, w którego kierunku aktualnie obraca się rekwizyt. var TargetRotation:rotation = rotation{} -
Funkcja
Move(), która porusza rekwizytem wmovable_prop, jest już skonfigurowana, dlatego w tej klasie możesz ją zastąpić. Zastąp funkcjęMove()w klasierotating_prop. WMove()najpierw sprawdź, czyMatchRotationTargetjest ustawione i zapisz je w zmiennejRotationToMatch. Jeśli tak jest, ustawTargetRotationnaRotationToMatch. W przeciwnym razie ustaw je naAdditionalRotation.# Obróć RootProp, stosując TargetRotation, lub w kierunku MoveTarget, jeśli jest ustawiony. Move<override>()<suspends>:void= # Ustaw TargetRotation na obrót MoveTarget, jeśli MoveTarget jest ustawiony. if: RotationToMatch := MatchRotationTarget?.GetTransform().Rotation then: set TargetRotation = RotationToMatch else: set TargetRotation = AdditionalRotation - Podobnie jak w przypadku
translating_prop, określ tryb odtwarzania animacji. Zainicjuj nową zmiennąanimation_modeo nazwieAnimationModejakoanimation_mode.OneShot. To oznacza, że animacja się zatrzyma, gdy obiekt osiągnie cel. Jeśli rekwizyt nie ma się obracać bez przerwy ani nie ma się poruszyć raz i zatrzymać, ustaw tryb animacji na ping pong. Tryb ping pong umożliwia ustawienie ruchu wahadłowego obiektów do przodu lub do tyłu, tak jak wahadło metronomu lub most, który się podnosi i opuszcza.# Ustaw domyślny tryb odtwarzania animacji. # Tryb animacji OneShot odtworzy animację jeden raz. var AnimationMode:animation_mode := animation_mode.OneShot # Jeśli RootProp nie ma się resetować ani nie ma się zatrzymać, gdy skończy się obracać, # ustaw tryb animacji na PingPong. if: not ShouldRotateForever? and not MoveOnceAndStop? then: set AnimationMode = animation_mode.PingPongJeśli ustawisz
ShouldResetna false, aShouldRotateForeverna true, rekwizyt powinien utrzymywać pozycję po każdej animacji, kontynuując zapętlenieMove(). -
Pobierz obrót dla rekwizytu głównego, w którego kierunku ma się obracać, do nowej zmiennej o nazwie
RotateByMoveRotation, wywołującRotateBy()naStartingTransformi przekazującTargetRotation. Następnie wywołajMoveToEase(). Gotowa funkcjaMove()powinna wyglądać następująco.# Obróć RootProp, stosując TargetRotation, lub w kierunku MoveTarget, jeśli jest ustawiony. Move<override>()<suspends>:void= # Ustaw TargetRotation na obrót MoveTarget, jeśli MoveTarget jest ustawiony. if: RotationToMatch := MatchRotationTarget?.GetTransform().Rotation then: set TargetRotation = RotationToMatch else: set TargetRotation = AdditionalRotation # Ustaw domyślny tryb odtwarzania animacji. # Tryb animacji OneShot odtworzy animację jeden raz. var AnimationMode:animation_mode := animation_mode.OneShot # Jeśli RootProp nie ma się resetować ani nie ma się zatrzymać, gdy skończy się obracać, # ustaw tryb animacji na PingPong. if: not ShouldRotateForever? and not MoveOnceAndStop? then: set AnimationMode = animation_mode.PingPong # Pobierz obrót, w którego kierunku ma być wykonany obrót, obracając StartingTransform # o wartość AdditionalRotation. Następnie rozpocznij obrót. RotateByTargetRotation := StartingTransform.Rotation.RotateBy(TargetRotation) RootProp.MoveToEase(RotateByTargetRotation, MoveDuration, MoveEaseType, AnimationMode) -
W klasie urządzenia
prop_animatordodaj nową edytowalną tablicęrotating_propo nazwieRotatingProps. Dodaj kolejne wyrażeniefordoOnBegin(), które przechodzi w pętli przez wszystkie obracające się rekwizyty i wywołuje na nichSetup(). Zaktualizowana klasaprop_animatorpowinna wyglądać następująco:using { /Fortnite.com/Devices } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/Diagnostics } TranslatingPropsTip<localizes>:message = "Rekwizyty, które podlegają translacji (poruszają się) przy użyciu animacji." RotatingPropsTip<localizes>:message = "Rekwizyty, które obracają się przy użyciu animacji." # Koordynuje ruch rekwizytów w animacji, wywołując metodę Setup() każdego rekwizytu. prop_animator := class(creative_device): # Tablica rekwizytów, które podlegają translacji przy użyciu animacji. @editable TranslatingProps:[]translating_prop = array{} @editable RotatingProps:[]rotating_prop = array{} # Działa po uruchomieniu urządzenia w aktywnej grze OnBegin<override>()<suspends>:void= # Wywołaj Setup() dla każdego rekwizytu, aby rozpocząć animację. for: Prop:TranslatingProps do: Prop.Setup() for: Prop:RotatingProps do: Prop.Setup() - Zapisz kod i skompiluj go.
Łączenie rekwizytów z urządzeniami
Wróć do edytora i usuń część rekwizytów po sekcji translacji rekwizytów, aby utworzyć kolejną lukę. Do poziomu dodaj FG01 Turntable base i FG01 SpinningBar Double S. Podstawę nazwij RotatingBase, a poprzeczkę Spinning Bar. Ustaw poprzeczkę nad podstawą i umieść oba rekwizyty nad luką.
Konfiguracja dwóch obracających się rekwizytów. Zarówno wirująca poprzeczka, jak i obracająca się podstawa wirują w tym samym kierunku z różnymi prędkościami.
Wybierz animatora rekwizytu w Outlinerze i dodaj element tablicy do RotatingProps dla każdego obracającego się rekwizytu. Każdemu rekwizytowi przypisz następujące wartości:
| Opcja | Wartość | Wyjaśnienie |
|---|---|---|
| Dodatkowy obrót | Z, 90.0 | Rekwizyt będzie za każdym razem wykonywał obrót o 90 stopni wokół osi Z. |
| RootProp | Przypisz do rekwizytu, który animujesz | Jest to rekwizyt, który animujesz. |
| Czas trwania ruchu | 2.0, 3.0 | Jednemu z rekwizytów przypisz krótszy czas trwania, aby rekwizyty obracały się z różnymi szybkościami. |
| Typ łagodzenia ruchu | Liniowy | Rekwizyty będą animowane ze stałą szybkością. |
Wypchnij zmiany i wyprowadź rekwizyty! Spróbuj zmieniać wartości, aby uzyskać różne obroty, spróbuj obracać każdy rekwizyt w innym kierunku, aby tworzyć różne typy przeszkód.
Co dalej
W kolejnej sekcji połączysz ruch i obrót, aby utworzyć rekwizyty, które robią jedno i drugie!
Kompletny kod
Oto kompletny kod utworzony w tej sekcji:
rotating_prop.verse
using { /Fortnite.com/Devices }
using { /Fortnite.com/Devices/CreativeAnimation }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/SpatialMath }
AdditionalRotationTip<localizes>:message = "Obrót stosowany do RootProp."
ShouldRotateForeverTip<localizes>:message = "Określa, czy RootProp ma się obracać bez przerwy."
MatchRotationTargetTip<localizes>:message = "Opcjonalny rekwizyt, którego obrót ma stanowić podstawę do ruchu obrotowego RootProp. Użyj go, jeśli nie chcesz ustawiać dodatkowego obrotu."
# Rekwizyt, który obraca się o dodatkowy obrót lub zgodnie z obrotem
# rekwizytu trybu kreatywnego.
rotating_prop<public> := class<concrete>(movable_prop):
# Dodatkowy obrót, który ma być zastosowany do RootProp.
@editable {ToolTip := AdditionalRotationTip}
AdditionalRotation:rotation = rotation{}
# Określa, czy RootProp ma się obracać bez przerwy.
@editable {ToolTip := ShouldRotateForeverTip}
ShouldRotateForever:logic = true
# Opcjonalny rekwizyt, którego obrót ma być podstawą do zgodnego obrotu RootProp. Użyj tego, jeśli
# nie chcesz ustawiać dodatkowego obrotu.
@editable {ToolTip := MatchRotationTargetTip}
MatchRotationTarget:?creative_prop = false
# Obrót, w którego kierunku aktualnie obraca się rekwizyt.
var TargetRotation:rotation = rotation{}
# Obróć RootProp, stosując TargetRotation, lub w kierunku MoveTarget, jeśli jest ustawiony.
Move<override>()<suspends>:void=
# Ustaw TargetRotation na RotationToMatch, jeśli jest ustawiony. W przeciwnym razie ustaw
# go na AdditionalRotation.
if:
RotationToMatch := MatchRotationTarget?.GetTransform().Rotation
then:
set TargetRotation = RotationToMatch
else:
set TargetRotation = AdditionalRotation
# Ustaw domyślny tryb odtwarzania animacji.
# Tryb animacji OneShot odtworzy animację jeden raz.
var AnimationMode:animation_mode := animation_mode.OneShot
# Jeśli RootProp nie ma się resetować ani nie ma się zatrzymać, gdy skończy się obracać,
# ustaw tryb animacji na PingPong.
if:
not ShouldRotateForever? and not MoveOnceAndStop?
then:
set AnimationMode = animation_mode.PingPong
# Pobierz obrót, w którego kierunku ma być wykonany obrót, obracając StartingTransform
# o wartość AdditionalRotation. Następnie rozpocznij obrót.
RotateByTargetRotation := StartingTransform.Rotation.RotateBy(TargetRotation)
RootProp.MoveToEase(RotateByTargetRotation, MoveDuration, MoveEaseType, AnimationMode)
prop_animator.verse
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
TranslatingPropsTip<localizes>:message = "Rekwizyty, które podlegają translacji (poruszają się) przy użyciu animacji."
RotatingPropsTip<localizes>:message = "Rekwizyty, które obracają się przy użyciu animacji."
# Koordynuje ruch rekwizytów w animacji, wywołując metodę Setup() każdego rekwizytu.
prop_animator := class(creative_device):
# Tablica rekwizytów, które podlegają translacji przy użyciu animacji.
@editable
TranslatingProps:[]translating_prop = array{}
@editable
RotatingProps:[]rotating_prop = array{}
# Działa po uruchomieniu urządzenia w aktywnej grze
OnBegin<override>()<suspends>:void=
# Wywołaj Setup() dla każdego rekwizytu, aby rozpocząć animację.
for:
Prop:TranslatingProps
do:
Prop.Setup()
for:
Prop:RotatingProps
do:
Prop.Setup()