W grach platformowych zdarzają się przeszkody, które zmieniają rozmiary. Mogą to być platformy, które się powiększają i kurczą lub robią wyższe i niższe wzdłuż jakiejś osi. Taka modyfikacja wymiarów obiektów nazywa się modyfikacją skali.
Skala obiektu mówi nam, o ile pomnożyć każdy jego wymiar względem samego siebie. Normalna skala obiektu to {X := 1.0, Y := 1.0, Z := 1.0}. Jeśli podwoimy wartość Z skali obiektu, stanie się dwukrotnie wyższy. Jeśli zmniejszymy tę wartość o połowę, obiekt będzie o połowę niższy.
Skala to ostatnia część zabawy z przekształcaniem. W tej sekcji dowiesz się, jak manipulować skalą, aby tworzyć obiekty, które powiększają się i kurczą do różnych rozmiarów.
Tworzenie rekwizytów, które się skalują
Wykonaj poniższe kroki, aby napisać kod, który skaluje rekwizyty:
-
Przy użyciu Eksploratora Verse utwórz nową klasę Verse o nazwie
scaling_prop, która dziedziczy zmovable_prop. Do tej klasy dodaj specyfikator<concrete>, aby uwidocznić jej właściwości dla UEFN.# Rekwizyt, który się skaluje do danej skali lub do skali rekwizytu Trybu kreatywnego. scaling_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 } MatchScaleTargetTip<localizes>:message = "Opcjonalna pozycja w przestrzeni świata, do której ma być wykonany ruch. Użyj jej, jeśli nie chcesz ustawiać MoveTarget." # Rekwizyt, który się skaluje do danej skali lub do skali rekwizytu Trybu kreatywnego. scaling_prop<public> := class<concrete>(movable_prop): -
Na początku definicji klasy
scaling_propdodaj następujące pola:-
Edytowalna tablica
vector3o nazwieScaleTargets. Są to skale, zgodnie z którymi rekwizyt będzie się powiększał i kurczył. Po ukończeniuMove()skala rekwizytu zostanie pomnożona o tę wartość.# Tablica docelowych vector3, do których ma się skalować RootProp. @editable {ToolTip := MoveTargetsTip} var ScaleTargets:[]vector3= array{} -
Edytowalny opcjonalny
creative_propo nazwieMatchScaleTarget. Jeśli rekwizyt ma się skalować tak zgodnie ze skalą innego rekwizytu, ustaw tę wartość, zamiast używaćScaleTargets. Możesz tego użyć na przykład wówczas, gdy chcesz utworzyć szereg platform, które przed zresetowaniem rozrastają się do tego samego rozmiaru.# Opcjonalny rekwizyt Trybu kreatywnego, do którego skali ma się dopasować RootProp. @editable {ToolTip := MatchScaleTargetTip} var MatchScaleTarget:?creative_prop = false -
Zmienna
rotationo nazwieTargetScale. Jest to skala, do której aktualnie skaluje się rekwizyt.# Skala, do której aktualnie skaluje się rekwizyt. var TargetScale:vector3 = vector3{}
-
-
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 } MatchScaleTargetTip<localizes>:message = "Opcjonalna pozycja w przestrzeni świata, do której ma być wykonany ruch. Użyj jej, jeśli nie chcesz ustawiać MoveTarget." # Rekwizyt, który się skaluje do danej skali lub do skali rekwizytu trybu kreatywnego. scaling_prop<public> := class<concrete>(movable_prop): # Tablica docelowych vector3, do których ma się skalować RootProp. @editable {ToolTip := MoveTargetsTip} var ScaleTargets:[]vector3= array{} # Opcjonalny rekwizyt trybu kreatywnego, do którego skali ma się dopasować RootProp. @editable {ToolTip := MatchScaleTargetTip} var MatchScaleTarget:?creative_prop = false # Skala, do której aktualnie skaluje się rekwizyt. var TargetScale:vector3 = vector3{} -
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 klasiescaling_prop. WMove()najpierw sprawdź, czyMatchScaleTargetjest ustawione i zapisz je w zmiennejScaleToMatch. W takim przypadku ustawTargetScalenaScaleToMatch, a następnie wywołajMoveToEase(), przekazującTargetScale,MoveDuration,MoveEaseTypeianimation_mode.OneShot. Jest to przeciążona wcześniej funkcjaMoveToEase(), która modyfikuje jedynie skalę.# Przeskaluj RootProp do ScaleTarget lub MatchScaleTarget, jeśli jest ustawione. Move<override>()<suspends>:void= # Ustaw TargetScale na MatchScaleTarget, jeśli jest ustawione. if: ScaleToMatch := MatchScaleTarget?.GetTransform().Scale then: set TargetScale = ScaleToMatch # Wywołaj MoveToEase, aby zacząć skalować rekwizyt. Tryb animacji OneShot odtworzy animację jeden raz. RootProp.MoveToEase(MoveDuration, TargetScale, MoveEaseType, animation_mode.OneShot) -
Jeśli
MatchScaleTargetnie jest ustawione, musisz wykonać iterację przez tablicęScaleTargets. W wyrażeniuforpowtórz każdyScaleTargetwScaleTargetsi ustawTargetScalenaScaleTarget. Następnie wywołajMoveToEase(), przekazując te same wartości, co poprzednio. Gotowa funkcjaMove()powinna wyglądać następująco:# Przeskaluj RootProp do ScaleTarget lub MatchScaleTarget, jeśli jest ustawione. Move<override>()<suspends>:void= # Ustaw TargetScale na MatchScaleTarget, jeśli jest ustawione. if: ScaleToMatch := MatchScaleTarget?.GetTransform().Scale then: set TargetScale = ScaleToMatch # Wywołaj MoveToEase, aby zacząć skalować rekwizyt. Tryb animacji OneShot odtworzy animację jeden raz. RootProp.MoveToEase(MoveDuration, TargetScale, MoveEaseType, animation_mode.OneShot) else: # W przeciwnym razie przeskaluj do każdego celu w tablicy ScaleTargets. for: ScaleTarget:ScaleTargets do: set TargetScale = ScaleTarget # Wywołaj MoveToEase, aby zacząć skalować rekwizyt. Tryb animacji OneShot odtworzy animację jeden raz. RootProp.MoveToEase(MoveDuration, TargetScale, MoveEaseType, animation_mode.OneShot) -
W klasie urządzenia
prop_animatordodaj nową edytowalną tablicęscaling_propo nazwieScalingProps. Dodaj kolejne wyrażeniefordoOnBegin(), które przechodzi w pętli przez wszystkie skalują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." ScalingPropsTip<localizes>:message = "Rekwizyty, które skalują 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 movable_props, które podlegają translacji przy użyciu animacji. @editable {ToolTip := TranslatingPropsTip} TranslatingProps:[]translating_prop = array{} # Tablica rekwizytów movable_props, które obracają się przy użyciu animacji. @editable {ToolTip := RotatingPropsTip} RotatingProps:[]rotating_prop = array{} # Tablica rekwizytów movable_props, które skalują się przy użyciu animacji. @editable {ToolTip := ScalingPropsTip} ScalingProps:[]scaling_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() for: Prop:ScalingProps do: Prop.Setup() -
Zapisz kod i skompiluj go.
Łączenie rekwizytów z urządzeniami
Wróć do edytora i usuń część rekwizytów po sekcji obracania rekwizytów, ale przed podniesionymi blokami, aby utworzyć kolejną lukę. Do poziomu dodaj FG01 Punch Glove. Nadaj rękawicy nazwę ScalingGlove. Ustaw rękawicę pośrodku luki i obróć ją tak, aby była skierowana w górę.
Konfiguracja uderzającej rękawicy. Rękawica skaluje się w górę, aby utworzyć windę, która podnosi graczy.
Wybierz animatora rekwizytu w Outlinerze i dodaj element tablicy do ScalingProps dla rękawicy. Rekwizytowi przypisz następujące wartości:
| Opcja | Wartość | Wyjaśnienie |
|---|---|---|
| ScaleTargets | {1.0, 2.0, 1.0}, {1.0, 1.0, 1.0} | Rekwizyt będzie się skalował do dwukrotności swojego rozmiaru wzdłuż osi Y, a następnie z powrotem do rozmiarów początkowych. Rekwizyt jest obrócony, dlatego oś Y jest teraz lokalną osią "w górę" rekwizytu. |
| RootProp | Przypisz do rekwizytu, który animujesz. | Jest to rekwizyt, który animujesz. |
Wypchnij zmiany i wyprowadź rekwizyty! Spróbuj zmieniać skale, aby uzyskać różne rozmiary, oraz skalować inne rekwizyty, aby tworzyć różne scenariusze!
Co dalej
W kolejnej sekcji połączysz ruch, obrót i skalę, aby utworzyć rekwizyty, które robią wszystko naraz!
%animating-prop-movement-6-combining-movement-rotation-and-scale-in-verse:topic%
Kompletny kod
Oto kompletny kod utworzony w tej sekcji:
scaling_prop.verse
using { /Fortnite.com/Devices }
using { /Fortnite.com/Devices/CreativeAnimation }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/SpatialMath }
MatchScaleTargetTip<localizes>:message = "Opcjonalna pozycja w przestrzeni świata, do której ma być wykonany ruch. Użyj jej, jeśli nie chcesz ustawiać MoveTarget."
# Rekwizyt, który się skaluje do danej skali lub do skali rekwizytu trybu kreatywnego.
scaling_prop<public> := class<concrete>(movable_prop):
# Tablica docelowych vector3, do których ma się skalować RootProp.
@editable {ToolTip := MoveTargetsTip}
var ScaleTargets:[]vector3= array{}
# Opcjonalny rekwizyt trybu kreatywnego, do którego skali ma się dopasować RootProp.
@editable {ToolTip := MatchScaleTargetTip}
var MatchScaleTarget:?creative_prop = false
# Skala, do której aktualnie skaluje się rekwizyt.
var TargetScale:vector3 = vector3{}
# Przeskaluj RootProp do ScaleTarget lub MatchScaleTarget, jeśli jest ustawione.
Move<override>()<suspends>:void=
# Ustaw TargetScale na MatchScaleTarget, jeśli jest ustawione.
if:
ScaleToMatch := MatchScaleTarget?.GetTransform().Scale
then:
set TargetScale = ScaleToMatch
# Wywołaj MoveToEase, aby zacząć skalować rekwizyt. Tryb animacji OneShot odtworzy animację jeden raz.
RootProp.MoveToEase(MoveDuration, TargetScale, MoveEaseType, animation_mode.OneShot)
else:
# W przeciwnym razie przeskaluj do każdego celu w tablicy ScaleTargets.
for:
ScaleTarget:ScaleTargets
do:
set TargetScale = ScaleTarget
# Wywołaj MoveToEase, aby zacząć skalować rekwizyt. Tryb animacji OneShot odtworzy animację jeden raz.
RootProp.MoveToEase(MoveDuration, TargetScale, MoveEaseType, animation_mode.OneShot)
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."
ScalingPropsTip<localizes>:message = "Rekwizyty, które skalują 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 movable_props, które podlegają translacji przy użyciu animacji.
@editable {ToolTip := TranslatingPropsTip}
TranslatingProps:[]translating_prop = array{}
# Tablica rekwizytów movable_props, które obracają się przy użyciu animacji.
@editable {ToolTip := RotatingPropsTip}
RotatingProps:[]rotating_prop = array{}
# Tablica rekwizytów movable_props, które skalują się przy użyciu animacji.
@editable {ToolTip := ScalingPropsTip}
ScalingProps:[]scaling_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()
for:
Prop:ScalingProps
do:
Prop.Setup()