Ein weiteres Plattformhindernis, das in diesem Genre häufig vorkommt, sind sich drehende Objekte, wie drehende Plattformen, auf denen man sich ständig bewegen muss, oder ein Balken, der sich vor und zurück bewegt, über den man springen muss.
Die zweite Komponente der Transformation eines Objekts ist seine Rotation. Du kannst ein Objekt so bearbeiten, dass es sich um eine Achse dreht. Es gibt verschiedene Methoden, wie du die Rotation einsetzen kannst, um einmalige Plattformherausforderungen zu schaffen. In diesem Abschnitt erfährst du, wie du sie programmierst.
Erstellen von Props, die sich drehen
Befolge diese Schritte, um Code zu erstellen, der deine Props dreht:
-
Erstelle mit den Verse-Explorer eine neue Verse-Klasse mit der Bezeichnung
rotating_prop, die vonmovable_properbt. Füge dieser Klasse den Bezeichner<concrete>hinzu, um ihre Eigenschaften für UEFN freizugeben.# Ein Prop, das sich um eine zusätzliche Rotation dreht oder passend zur # Rotation eines Kreativmodus-Prop dreht rotating_prop<public> := class<concrete>(movable_prop): -
Füge die Anweisungen
using { /Fortnite.com/Devices/CreativeAnimation }undusing { /UnrealEngine.com/Temporary/SpatialMath }ganz oben zu deiner Datei hinzu, um diese Module zu importieren. Du benötigst diese, um dein Prop zu animieren. Die in diesem Abschnitt verwendeten Tooltipps sind hier ebenfalls enthalten.using { /Fortnite.com/Devices } using { /Fortnite.com/Devices/CreativeAnimation } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/SpatialMath } AdditionalRotationTip<localizes>:message = "Die Rotation, die auf das RootProp angewendet wird" ShouldRotateForeverTip<localizes>:message = "Ob sich das RootProp ewig drehen soll" MatchRotationTargetTip<localizes>:message = "Das optionale Prop, zu dessen Rotation sich das RootProp drehen soll. Verwende dies, wenn du keine zusätzliche Rotation festlegen möchtest." # Ein Prop, das sich um eine zusätzliche Rotation dreht oder passend zur # Rotation eines Kreativmodus-Prop dreht rotating_prop<public> := class<concrete>(movable_prop): - Füge oben in der Klassendefinition von
rotating_propdie folgenden Felder hinzu.-
Eine bearbeitbare
rotationmit der BezeichnungAdditionalRotation. Dies ist die Rotation, die auf das Prop angewendet wird. NachdemMove()abgeschlossen ist, wird die Rotation dieses Prop um diesen Wert versetzt.# Die zusätzliche Rotation, die auf das RootProp angewendet wird @editable {ToolTip := AdditionalRotationTip} AdditionalRotation:rotation = rotation{} -
Eine bearbeitbare
logicmit der BezeichnungShouldRotateForever. Dies gibt an, ob sich das Prop immer weiter drehen soll, ohne dass es zurückgesetzt wird.# Ob sich das RootProp ewig drehen soll @editable {ToolTip := ShouldRotateForeverTip} ShouldRotateForever:logic = true -
Ein bearbeitbares optionales
creative_propmit der BezeichnungMatchRotationTarget. Wenn du möchtest, dass sich dein Prop passend zur Rotation eines anderen Prop dreht, kannst du diesen Wert festlegen, stattAdditionalRotationzu verwenden.# Das optionale Prop, an dessen Rotation RootProp angepasst werden soll. Verwende dies, wenn du # keine zusätzliche Rotation festlegen möchtest. @editable {ToolTip := MatchRotationTargetTip} MatchRotationTarget:?creative_prop = false -
Eine
rotation-Variable mit der BezeichnungTargetRotation. Dies ist die Rotation, in deren Richtung sich das Prop aktuell dreht.# Die Rotation, in deren Richtung sich das Prop aktuell dreht var TargetRotation:rotation = rotation{}
-
-
Deine endgültige Klassendefinition sollte wie folgt aussehen:
using { /Fortnite.com/Devices } using { /Fortnite.com/Devices/CreativeAnimation } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/SpatialMath } AdditionalRotationTip<localizes>:message = "Die Rotation, die auf das RootProp angewendet wird" ShouldRotateForeverTip<localizes>:message = "Ob sich das RootProp ewig drehen soll" MatchRotationTargetTip<localizes>:message = "Das optionale Prop, zu dessen Rotation sich das RootProp drehen soll. Verwende dies, wenn du keine zusätzliche Rotation festlegen möchtest." # Ein Prop, das sich um eine zusätzliche Rotation dreht oder passend zur # Rotation eines Kreativmodus-Prop dreht rotating_prop<public> := class<concrete>(movable_prop): # Die zusätzliche Rotation, die auf das RootProp angewendet wird @editable {ToolTip := AdditionalRotationTip} AdditionalRotation:rotation = rotation{} # Ob sich das RootProp ewig drehen soll @editable {ToolTip := ShouldRotateForeverTip} ShouldRotateForever:logic = true # Das optionale Prop, an dessen Rotation RootProp angepasst werden soll. Verwende dies, wenn du # keine zusätzliche Rotation festlegen möchtest. @editable {ToolTip := MatchRotationTargetTip} MatchRotationTarget:?creative_prop = false # Die Rotation, die deren Richtung sich das Prop aktuell dreht var TargetRotation:rotation = rotation{} -
Da du bereits die
Move()-Funktion eingerichtet hast, die dein Prop inmovable_propbewegt, kannst du sie in dieser Klasse außer Kraft setzen. Setze dieMove()-Funktion in deinerrotating_prop-Klasse außer Kraft. Prüfe inMove()zuerst, ob dasMatchRotationTargetfestgelegt ist, und speichere es in einerRotationToMatch-Variable. Wenn dies der Fall ist, setzeTargetRotationaufRotationToMatch. Setze es andernfalls aufAdditionalRotation.# Drehe das RootProp, indem du die TargetRotation anwendest, oder in Richtung von MoveTarget, wenn es festgelegt ist. Move<override>()<suspends>:void= # Setze TargetRotation auf die Rotation von MoveTarget, wenn das MoveTarget festgelegt ist. if: RotationToMatch := MatchRotationTarget?.GetTransform().Rotation then: set TargetRotation = RotationToMatch else: set TargetRotation = AdditionalRotation - Lege wie bei
translating_propden Animationsmodus für die wiederzugebende Animation fest. Initialisiere eine neueanimation_mode-Variable mit der BezeichnungAnimationModeaufanimation_mode.OneShot. Das bedeutet, dass deine Animation stoppt, sobald dein Objekt sein Ziel erreicht. Wenn sich das Prop nicht auf ewig drehen soll oder nicht einmal bewegen und stoppen soll, setze den Animationsmodus auf Ping-Pong. Mit Ping-Pong kannst du Objekte erstellen, die vor und zurück oszillieren, wie der Stab eines Metronoms oder eine Brücke, die sich hebt und senkt.# Lege den Standardanimationsmodus für die Wiedergabe fest. # Der OneShot-Animationsmodus gibt die Animation einmal wieder. var AnimationMode:animation_mode := animation_mode.OneShot # Wenn das RootProp nicht zurückgesetzt werden und nicht stoppen soll, wenn es die Rotation beendet hat, # setze den Animationsmodus auf PingPong. if: not ShouldRotateForever? and not MoveOnceAndStop? then: set AnimationMode = animation_mode.PingPongWenn du
ShouldResetauf false undShouldRotateForeverauf true setzt, sollte dein Prop seine Position nach jeder Animation beibehalten, während weiterhin eine Schleife vonMove()ausgeführt wird. -
Rufe die Rotation für dein Stamm-Prop, in deren Richtung es sich drehen soll, in einer neuen Variable mit der Bezeichnung
RotateByMoveRotationab, indem duRotateBy()auf dieStartingTransformaufrufst undTargetRotationübergibst. Rufe dannMoveToEase()auf. Deine vollständigeMove()-Funktion sollte wie folgt aussehen.# Drehe das RootProp, indem du die TargetRotation anwendest, oder in Richtung von MoveTarget, wenn es festgelegt ist. Move<override>()<suspends>:void= # Setze TargetRotation auf die Rotation von MoveTarget, wenn das MoveTarget festgelegt ist. if: RotationToMatch := MatchRotationTarget?.GetTransform().Rotation then: set TargetRotation = RotationToMatch else: set TargetRotation = AdditionalRotation # Lege den Standardanimationsmodus für die Wiedergabe fest. # Der OneShot-Animationsmodus gibt die Animation einmal wieder. var AnimationMode:animation_mode := animation_mode.OneShot # Wenn das RootProp nicht zurückgesetzt werden und nicht stoppen soll, wenn es die Rotation beendet hat, # setze den Animationsmodus auf PingPong. if: not ShouldRotateForever? and not MoveOnceAndStop? then: set AnimationMode = animation_mode.PingPong # Rufe die Rotation ab, in deren Richtung die Rotation erfolgen soll, indem du StartingTransform # um AdditionalRotation drehst. Starte dann die Rotation. RotateByTargetRotation := StartingTransform.Rotation.RotateBy(TargetRotation) RootProp.MoveToEase(RotateByTargetRotation, MoveDuration, MoveEaseType, AnimationMode) -
Füge in deiner
prop_animator-Geräteklasse ein neues bearbeitbares Array vonrotating_propmit der BezeichnungRotatingPropshinzu. Füge einen weiterenfor-Ausdruck zuOnBegin()hinzu, der eine Schleife durch alle sich drehenden Props ausführt undSetup()auf sie aufruft. Deine aktualisierteprop_animator-Klasse sollte wie folgt aussehen:using { /Fortnite.com/Devices } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/Diagnostics } TranslatingPropsTip<localizes>:message = "Die Props, die eine Verschiebung (Bewegung) über eine Animation ausführen" RotatingPropsTip<localizes>:message = "Die Props, die über eine Animation gedreht werden" # Koordiniere die Bewegung der Props im Verlauf der Animation durch Aufrufen der Setup()-Methode jedes Prop. prop_animator := class(creative_device): # Das Array der Props, die eine Verschiebung durch eine Animation ausführen @editable TranslatingProps:[]translating_prop = array{} @editable RotatingProps:[]rotating_prop = array{} # Wird ausgeführt, wenn das Gerät in einem laufenden Spiel gestartet wird OnBegin<override>()<suspends>:void= # Rufe für jedes Prop Setup() auf, um die Animation zu beginnen. for: Prop:TranslatingProps do: Prop.Setup() for: Prop:RotatingProps do: Prop.Setup() - Speichere deinen Code und kompiliere ihn.
Verknüpfen von Props mit Geräten
Lösche zurück im Editor einige der Props nach dem Abschnitt zum Verschieben der Props, um eine weitere Lücke zu erzeugen. Füge ein FG01 Turntable base und ein FG01 SpinningBar Double S zu deinem Level hinzu. Nenne die Basis RotatingBase und den Balken Spinning Bar. Positioniere den Balken über der Basis und platziere beide Props über der Lücke.
Konfiguration der beiden sich drehenden Props. Sowohl der sich drehende Balken als auch die sich drehende Basis drehen sich mit unterschiedlichen Geschwindigkeiten in die gleiche Richtung.
Wähle deinen prop animator im Outliner und füge für jedes deiner sich drehenden Props ein Array-Element zu RotatingProps hinzu. Weise jedem Prop die folgenden Werte zu:
| Option | Wert | Beschreibung |
|---|---|---|
| AdditionalRotation | Z, 90,0 | Dieses Prop macht jedes Mal eine 90-Grad-Drehung um die Z-Achse. |
| RootProp | Weise dies dem Prop zu, das du animierst. | Dies ist das Prop, das du animierst. |
| MoveDuration | 2,0, 3,0 | Weise einem der Props eine kürzere Dauer zu, sodass sie sich mit unterschiedlichen Geschwindigkeiten drehen. |
| MoveEaseType | Linear | Das animiert deine Props mit einer konstanten Geschwindigkeit. |
Übergib deine Änderungen und sieh dir dann deine Props an. Versuche, die verschiedenen Werte zu variieren, um verschiedene Rotationen zu erzielen, und versuche, eine Rotation in jeder der verschiedenen Dimensionen auszuführen, um verschieden Hindernisarten zu erzeugen.
Nächster Schritt
Im nächsten Abschnitt kombinierst du die Bewegung und Rotation, um Props zu erzeugen, die beides machen.
Vollständiger Code
Dies ist der vollständige Code, der in diesem Teil erstellt wurde:
rotating_prop.verse
using { /Fortnite.com/Devices }
using { /Fortnite.com/Devices/CreativeAnimation }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/SpatialMath }
AdditionalRotationTip<localizes>:message = "Die Rotation, die auf das RootProp angewendet wird"
ShouldRotateForeverTip<localizes>:message = "Ob sich das RootProp ewig drehen soll"
MatchRotationTargetTip<localizes>:message = "Das optionale Prop, zu dessen Rotation sich das RootProp drehen soll. Verwende dies, wenn du keine zusätzliche Rotation festlegen möchtest."
# Ein Prop, das sich um eine zusätzliche Rotation dreht oder passend zur
# Rotation eines Kreativmodus-Prop dreht
rotating_prop<public> := class<concrete>(movable_prop):
# Die zusätzliche Rotation, die auf das RootProp angewendet wird
@editable {ToolTip := AdditionalRotationTip}
AdditionalRotation:rotation = rotation{}
# Ob sich das RootProp ewig drehen soll
@editable {ToolTip := ShouldRotateForeverTip}
ShouldRotateForever:logic = true
# Das optionale Prop, an dessen Rotation RootProp angepasst werden soll. Verwende dies, wenn du
# keine zusätzliche Rotation festlegen möchtest.
@editable {ToolTip := MatchRotationTargetTip}
MatchRotationTarget:?creative_prop = false
# Die Rotation, die deren Richtung sich das Prop aktuell dreht
var TargetRotation:rotation = rotation{}
# Drehe das RootProp, indem du die TargetRotation anwendest, oder in Richtung von MoveTarget, wenn es festgelegt ist.
Move<override>()<suspends>:void=
# Setze die TargetRotation auf die RotationToMatch, wenn sie festgelegt ist. Setze sie andernfalls
# auf AdditionalRotation.
if:
RotationToMatch := MatchRotationTarget?.GetTransform().Rotation
then:
set TargetRotation = RotationToMatch
else:
set TargetRotation = AdditionalRotation
# Lege den Standardanimationsmodus für die Wiedergabe fest.
# Der OneShot-Animationsmodus gibt die Animation einmal wieder.
var AnimationMode:animation_mode := animation_mode.OneShot
# Wenn das RootProp nicht zurückgesetzt werden und nicht stoppen soll, wenn es die Rotation beendet hat,
# setze den Animationsmodus auf PingPong.
if:
not ShouldRotateForever? and not MoveOnceAndStop?
then:
set AnimationMode = animation_mode.PingPong
# Rufe die Rotation ab, in deren Richtung die Rotation erfolgen soll, indem du StartingTransform
# um AdditionalRotation drehst. Starte dann die Rotation.
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 = "Die Props, die eine Verschiebung (Bewegung) über eine Animation ausführen"
RotatingPropsTip<localizes>:message = "Die Props, die über eine Animation gedreht werden"
# Koordiniere die Bewegung der Props im Verlauf der Animation durch Aufrufen der Setup()-Methode jedes Prop.
prop_animator := class(creative_device):
# Das Array der Props, die eine Verschiebung durch eine Animation ausführen
@editable
TranslatingProps:[]translating_prop = array{}
@editable
RotatingProps:[]rotating_prop = array{}
# Wird ausgeführt, wenn das Gerät in einem laufenden Spiel gestartet wird
OnBegin<override>()<suspends>:void=
# Rufe für jedes Prop Setup() auf, um die Animation zu beginnen.
for:
Prop:TranslatingProps
do:
Prop.Setup()
for:
Prop:RotatingProps
do:
Prop.Setup()