Les objets qui tournent constituent un autre obstacle des plateformes, comme une plateforme tournante sur laquelle l'on doit constamment se déplacer, ou une barre qui se déplace d'avant en arrière et que l'on doit enjamber.
La deuxième composante de la transformation d'un objet est sa rotation. Vous pouvez manipuler un objet pour le faire tourner autour d'un axe. Il existe plusieurs façons d'utiliser la rotation pour créer des défis de plateforme uniques, et vous apprendrez à les coder dans cette section.
Créer des accessoires qui tournent
Procédez comme suit pour créer un code qui fait tourner vos accessoires :
-
Créez une nouvelle classe Verse nommée
rotating_propqui hérite demovable_propà l'aide de l'explorateur Verse. Ajoutez le spécificateur<concrete>à cette classe pour exposer ses propriétés à l'UEFN.# Un accessoire qui tourne avec une rotation supplémentaire ou qui tourne pour correspondre à # à la rotation d'un accessoire en mode Créatif. rotating_prop<public> := class<concrete>(movable_prop): -
Ajoutez les instructions
using { /Fortnite.com/Devices/CreativeAnimation }etusing { /UnrealEngine.com/Temporary/SpatialMath }au début du fichier pour importer ces modules. Vous en aurez besoin pour animer votre accessoire. Les infobulles utilisées dans cette section sont également répertoriées ici.using { /Fortnite.com/Devices } using { /Fortnite.com/Devices/CreativeAnimation } using { /Verse.org/Simulation } } using { /UnrealEngine.com/Temporary/SpatialMath } AdditionalRotationTip<localizes>:message = "La rotation à appliquer au RootProp." ShouldRotateForeverTip<localizes>:message = "Si le RootProp doit tourner indéfiniment". MatchRotationTargetTip<localizes>:message = "L'accessoire facultatif dont la rotation doit être appliquée au RootProp. Utilisez-le si vous ne souhaitez pas définir de rotation supplémentaire." # Un accessoire qui tourne avec une rotation supplémentaire ou qui tourne pour correspondre à # à la rotation d'un accessoire en mode Créatif. rotating_prop<public> := class<concrete>(movable_prop): - Ajoutez les champs suivants en haut de la définition de la classe
rotating_prop.-
Une
rotationmodifiable nomméeAdditionalRotation. Il s'agit de la rotation à appliquer à l'accessoire. Une fois la fonctionMove()terminée, la rotation de l'accessoire sera décalée de cette valeur.# La rotation supplémentaire à appliquer au RootProp. @editable {ToolTip := AdditionalRotationTip} AdditionalRotation:rotation = rotation{} -
Une
logicmodifiable nomméeShouldRotateForever. Ce paramètre indique si l'accessoire doit continuer à tourner sans être réinitialisé.# Si le RootProp doit tourner indéfiniment. @editable {ToolTip := ShouldRotateForeverTip} ShouldRotateForever:logic = true -
Un
creative_propfacultatif et modifiable nomméMatchRotationTarget. Si vous voulez que votre accessoire tourne en fonction de la rotation d'un autre accessoire, vous pouvez définir cette valeur plutôt qu'utiliserAdditionalRotation.# L'accessoire facultatif dont la rotation doit être appliquée à RootProp. Utilisez-la si vous # ne souhaitez pas définir de rotation supplémentaire. @editable {ToolTip := MatchRotationTargetTip} MatchRotationTarget:?creative_prop = false -
Une variable
rotationnomméeTargetRotation. Il s'agit de la rotation vers laquelle l'accessoire tend.# La rotation vers laquelle l'accessoire tend. var TargetRotation:rotation = rotation{}
-
-
La définition finale de votre classe devrait ressembler à ceci :
using { /Fortnite.com/Devices } using { /Fortnite.com/Devices/CreativeAnimation } using { /Verse.org/Simulation } } using { /UnrealEngine.com/Temporary/SpatialMath } AdditionalRotationTip<localizes>:message = "La rotation à appliquer au RootProp." ShouldRotateForeverTip<localizes>:message = "Si le RootProp doit tourner indéfiniment". MatchRotationTargetTip<localizes>:message = "L'accessoire facultatif dont la rotation doit être appliquée au RootProp. Utilisez-le si vous ne souhaitez pas définir de rotation supplémentaire." # Un accessoire qui tourne avec une rotation supplémentaire ou qui tourne pour correspondre à # à la rotation d'un accessoire en mode Créatif. rotating_prop<public> := class<concrete>(movable_prop): # La rotation supplémentaire à appliquer au RootProp. @editable {ToolTip := AdditionalRotationTip} AdditionalRotation:rotation = rotation{} # Si le RootProp doit tourner indéfiniment. @editable {ToolTip := ShouldRotateForeverTip} ShouldRotateForever:logic = true # L'accessoire facultatif dont la rotation doit être appliquée à RootProp. Utilisez-la si vous # ne souhaitez pas définir de rotation supplémentaire. @editable {ToolTip := MatchRotationTargetTip} MatchRotationTarget:?creative_prop = false # La rotation vers laquelle l'accessoire tend. var TargetRotation:rotation = rotation{} -
Puisque vous avez déjà configuré la fonction
Move()qui déplace votre accessoire dansmovable_prop, vous pouvez la remplacer dans cette classe. Remplacez la fonctionMove()dans votre classerotating_prop. DansMove(), on vérifie d'abord si laMatchRotationTargetest définie et on l'enregistre dans la variableRotationToMatch. Si tel est le cas, définissez laTargetRotationsur laRotationToMatch. Dans le cas contraire, il faut la définir surAdditionalRotation.# Faire tourner le RootProp en appliquant la TargetRotation, ou vers la MoveTarget si elle est définie. Move<override>()<suspends>:void= # Définir la TargetRotation sur la rotation de la MoveTarget si la MoveTarget est définie. if: RotationToMatch := MatchRotationTarget?.GetTransform().Rotation then: set TargetRotation = RotationToMatch else: set TargetRotation = AdditionalRotation - Comme pour
translating_prop, spécifiez le mode d'animation pour que votre animation soit jouée. Initialisez une nouvelle variableanimation_modenomméeAnimationModeàanimation_mode.OneShot. Cela signifie que votre animation s'arrêtera une fois que votre objet aura atteint sa cible. Si l'accessoire ne doit pas tourner indéfiniment ni bouger une fois et s'arrêter, réglez le mode d'animation sur ping-pong. L'utilisation du mode ping-pong permet de créer des objets qui oscillent d'avant en arrière, comme la barre d'un métronome ou un pont qui s'élève et s'abaisse.# Définir le mode d'animation par défaut. # Le mode d'animation OneShot joue l'animation une seule fois. var AnimationMode:animation_mode := animation_mode.OneShot # Si le RootProp ne doit pas se réinitialiser ni s'arrêter lorsqu'il a fini de tourner, # définir le mode d'animation sur PingPong. if: not ShouldRotateForever? and not MoveOnceAndStop? then: set AnimationMode = animation_mode.PingPongSi vous définissez
ShouldResetsur désactivé etShouldRotateForeversur activé, votre accessoire devrait conserver sa position après chaque animation tout en continuant à exécuterMove()en boucle. -
Obtenez la rotation que votre accessoire racine doit atteindre dans une nouvelle variable nommée
RotateByMoveRotationen appelantRotateBy()sur laStartingTransformet en transmettant laTargetRotation. Appelez ensuiteMoveToEase(). Votre fonctionMove()complète devrait ressembler à ceci.# Faire tourner le RootProp en appliquant la TargetRotation, ou vers la MoveTarget si elle est définie. Move<override>()<suspends>:void= # Définir la TargetRotation sur la rotation de la MoveTarget si la MoveTarget est définie. if: RotationToMatch := MatchRotationTarget?.GetTransform().Rotation then: set TargetRotation = RotationToMatch else: set TargetRotation = AdditionalRotation # Définir le mode d'animation par défaut. # Le mode d'animation OneShot joue l'animation une seule fois. var AnimationMode:animation_mode := animation_mode.OneShot # Si le RootProp ne doit pas se réinitialiser ni s'arrêter lorsqu'il a fini de tourner, # définir le mode d'animation sur PingPong. if: not ShouldRotateForever? and not MoveOnceAndStop? then: set AnimationMode = animation_mode.PingPong # Obtenir la rotation à atteindre en faisant pivoter la StartingTransform # en fonction de la AdditionalRotation. Lancez ensuite la rotation. RotateByTargetRotation := StartingTransform.Rotation.RotateBy(TargetRotation) RootProp.MoveToEase(RotateByTargetRotation, MoveDuration, MoveEaseType, AnimationMode) -
Dans votre classe d'appareil
prop_animator, ajoutez une nouvelle matrice modifiable derotating_propnomméeRotatingProps. Ajoutez une autre expressionforàOnBegin()qui passe en boucle tous les accessoires rotatifs et appelleSetup()sur eux. Votre classeprop_animatormise à jour devrait ressembler à ceci :using { /Fortnite.com/Devices } using { /Verse.org/Simulation } } using { /UnrealEngine.com/Temporary/Diagnostics } TranslatingPropsTip<localizes>:message = "Les accessoires qui se déplacent grâce à l'animation." RotatingPropsTip<localizes>:message = "Les accessoires qui tournent grâce à l'animation". # Coordonne le déplacement des accessoires grâce à l'animation en appelant la méthode Setup() de chaque accessoire. prop_animator := class(creative_device): # La matrice des accessoires qui se déplacent grâce à l'animation. @editable TranslatingProps:[]translating_prop = array{} @editable RotatingProps:[]rotating_prop = array{} # S'exécute à l'activation de l'appareil dans une partie en cours. OnBegin<override>()<suspends>:void= # Pour chaque accessoire, appeler Setup() pour commencer l'animation. for: Prop:TranslatingProps do: Prop.Setup() for: Prop:RotatingProps do: Prop.Setup() - Enregistrez votre code et compilez-le.
Lier des accessoires à des appareils
De retour dans l'éditeur, supprimez certains des accessoires après la section des accessoires en mouvement afin de créer un autre espace libre. Ajoutez une FG01 Base de plaque tournante et une FG01 SpinningBar Double S à votre niveau. Nommez la base RotatingBase et la Barre tournante. Placez la barre au-dessus de la base et placez les deux accessoires au-dessus de l'espace vide.
Configuration des deux accessoires rotatifs. La barre tournante et la base rotative tournent toutes deux dans la même direction à des vitesses différentes.
Sélectionnez votre animateur d'accessoire dans l'organiseur, et ajoutez un élément de matrice à RotatingProps pour chacun de vos accessoires rotatifs. Assignez à chaque accessoire les valeurs suivantes :
| Option | Valeur | Explication |
|---|---|---|
| Rotation supplémentaire | Z, 90.0 | Cet accessoire effectuera à chaque fois une rotation de 90 degrés autour de l'axe Z. |
| RootProp | Assigner à l'accessoire que vous animez | Il s'agit de l'accessoire que vous animez. |
| Durée du déplacement | 2.0, 3.0 | Assigner une durée plus courte à l'un des accessoires afin qu'ils tournent à des vitesses différentes. |
| Type d'assouplissement du déplacement | Linéaire | Ce type permet d'animer vos accessoires à une vitesse constante. |
Appliquez vos modifications, puis extrayez vos accessoires ! Essayez de varier les différentes valeurs pour obtenir des rotations différentes, et essayez d'appliquer la rotation dans chacune des différentes dimensions pour créer différents types d'obstacles.
Étape suivante
Dans la section suivante, vous combinerez le mouvement et la rotation pour créer des accessoires capables de bouger et de tourner !
Code complet
Voici le code complet généré dans cette section :
rotating_prop.verse
using { /Fortnite.com/Devices }
using { /Fortnite.com/Devices/CreativeAnimation }
using { /Verse.org/Simulation } }
using { /UnrealEngine.com/Temporary/SpatialMath }
AdditionalRotationTip<localizes>:message = "La rotation à appliquer au RootProp."
ShouldRotateForeverTip<localizes>:message = "Si le RootProp doit tourner indéfiniment".
MatchRotationTargetTip<localizes>:message = "L'accessoire facultatif dont la rotation doit être appliquée au RootProp. Utilisez-le si vous ne souhaitez pas définir de rotation supplémentaire."
# Un accessoire qui tourne avec une rotation supplémentaire ou qui tourne pour correspondre à
# à la rotation d'un accessoire en mode Créatif.
rotating_prop<public> := class<concrete>(movable_prop):
# La rotation supplémentaire à appliquer au RootProp.
@editable {ToolTip := AdditionalRotationTip}
AdditionalRotation:rotation = rotation{}
# Si le RootProp doit tourner indéfiniment.
@editable {ToolTip := ShouldRotateForeverTip}
ShouldRotateForever:logic = true
# L'accessoire facultatif dont la rotation doit être appliquée à RootProp. Utilisez-la si vous
# ne souhaitez pas définir de rotation supplémentaire.
@editable {ToolTip := MatchRotationTargetTip}
MatchRotationTarget:?creative_prop = false
# La rotation vers laquelle l'accessoire tend.
var TargetRotation:rotation = rotation{}
# Faire tourner le RootProp en appliquant la TargetRotation, ou vers la MoveTarget si elle est définie.
Move<override>()<suspends>:void=
# Définir la TargetRotation à la RotationToMatch si elle est définie. Sinon, la définir
# sur la AdditionalRotation.
if:
RotationToMatch := MatchRotationTarget?.GetTransform().Rotation
then:
set TargetRotation = RotationToMatch
else:
set TargetRotation = AdditionalRotation
# Définir le mode d'animation par défaut.
# Le mode d'animation OneShot joue l'animation une seule fois.
var AnimationMode:animation_mode := animation_mode.OneShot
# Si le RootProp ne doit pas se réinitialiser ni s'arrêter lorsqu'il a fini de tourner,
# définir le mode d'animation sur PingPong.
if:
not ShouldRotateForever? and not MoveOnceAndStop?
then:
set AnimationMode = animation_mode.PingPong
# Obtenir la rotation à atteindre en faisant pivoter la StartingTransform
# en fonction de la AdditionalRotation. Lancez ensuite la 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 = "Les accessoires qui se déplacent grâce à l'animation."
RotatingPropsTip<localizes>:message = "Les accessoires qui tournent grâce à l'animation".
# Coordonne le déplacement des accessoires grâce à l'animation en appelant la méthode Setup() de chaque accessoire.
prop_animator := class(creative_device):
# La matrice des accessoires qui se déplacent grâce à l'animation.
@editable
TranslatingProps:[]translating_prop = array{}
@editable
RotatingProps:[]rotating_prop = array{}
# S'exécute à l'activation de l'appareil dans une partie en cours.
OnBegin<override>()<suspends>:void=
# Pour chaque accessoire, appeler Setup() pour commencer l'animation.
for:
Prop:TranslatingProps
do:
Prop.Setup()
for:
Prop:RotatingProps
do:
Prop.Setup()