Configurer le niveau
Pour commencer, initialisez un nouveau projet à partir du modèle d’île de démarrage Fall Guys. Cette île de départ contient un cours prêt à l'emploi que vous pouvez consulter et personnaliser avec les mouvements dans ce tutoriel.
Définir des accessoires qui bougent
Avant de commencer à faire bouger vos accessoires, vous devez définir ce qu'est un accessoire mobile. Vous pouvez utiliser un appareil Verse pour déplacer directement un accessoire, mais cela peut s'avérer délicat si vous souhaitez déplacer plusieurs accessoires à la fois. Au lieu de cela, vous définirez une classe movable_prop abstraite. Elle contient l'accessoire que vous voulez déplacer et plusieurs autres valeurs que vous utiliserez pour personnaliser la logique et la synchronisation de votre mouvement.
Procédez comme suit pour définir votre accessoire mobile :
Créez une nouvelle classe Verse nommée
movable_propà l'aide de l'explorateur Verse. Étant donné qu'il s'agit d'une classe Verse et non d'un appareil, créez ce fichier en utilisant l'option Créer un fichier vide. Et puisque cette classe servira de classe abstraite à partir de laquelle vous dériverez différents types d’accessoires mobiles, ajoutez le spécificateur<abstract>à cette classe. Pour apprendre à créer une nouvelle classe dans Verse, consultez la rubrique Modifier et exécuter votre premier programme Verse.Verse# Defines a Creative prop that moves to a target or location using animation. movable_prop<public> := class<abstract>():Ajoutez les chemins d'importation
using { /Fortnite.com/Devices },using { /Verse.org/Simulation }etusing { /UnrealEngine.com/Temporary/SpatialMath }en haut de votre fichier. Vous devrez importer ces modules pour gérer les calculs qui font bouger vos accessoires.Chacun des champs de cette classe comprendra également une
infobulle. Ajouter un message d’infobulleà un champ modifiable permet d’afficher une infobulle au survol de la souris dans l'UEFN. Toutes les infobulles utilisées dans cette classe sont répertoriées ci-dessous. Vous pouvez copier et coller ces infobulles ou définir les vôtres.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."Définissez les champs dont chaque accessoire mobile a besoin. Dans la définition de la classe
movable_prop, ajoutez les champs suivants :Un accessoire
creative_propmodifiable nomméRootProp. Il s'agit de l'accessoire en mode Créatif que vous déplacerez au cours du jeu.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{}Un
floatmodifiable nomméMoveDuration. Il s'agit du temps que met l'accessoire pour atteindre sa destination.Verse# The duration in seconds it takes for the prop to move to its destination. @editable {ToolTip := MoveDurationTip} MoveDuration:float = 3.0Un
floatmodifiable nomméMoveStartDelay. Il s'agit de la durée d'attente en secondes de l'accessoire avant son déplacement.Verse# The duration in seconds to wait before movement begins. @editable {ToolTip := MoveStartDelayTip} MoveStartDelay:float = 0.0Un
floatmodifiable nomméMoveEndDelay. Il s'agit du temps d'attente en secondes de l'accessoire après son déplacement.Verse# The duration in seconds to wait after movement ends. @editable {ToolTip := MoveEndDelayTip} MoveEndDelay:float = 0.0Une
logiquemodifiable nomméeMoveOnceAndStop. Elle permet de déterminer si l'accessoire ne se déplace qu'une seule fois ou s'il répète le mouvement une fois celui-ci terminé.Verse# Whether the RootProp should stop in place when it finishes moving. @editable {ToolTip := MoveOnceAndStopTip} MoveOnceAndStop:logic = falseUne
logiquemodifiable nomméeShouldReset. Cette fonction permet de déterminer si l'accessoire reprend sa position initiale une fois qu'il a fini de se déplacer.Verse# Whether the RootProp should reset back to the starting position when it # finishes moving. @editable {ToolTip := ShouldResetTip} ShouldReset:logic = falseUne variable transform nommée
StartingTransform. Il s'agit de la transformation de l’accessoireRootProplorsqu'il commence à se déplacer.Verse# The starting transform of the RootProp. var StartingTransform:transform = transform{}
La définition finale de votre classe devrait ressembler à ceci :
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."Avant de se déplacer, votre accessoire doit connaître son point de départ. Pour ce faire, vous allez créer une nouvelle fonction pour définir la
StartingTransform(transformation de départ) avant le mouvement :Ajoutez une nouvelle méthode
SetStartingTransform()à la définition de votre classemovable_prop.Dans
SetStartingTransform(), définissez laStartingTransformsur la transformation deRootPropà l'aide deGetTransform().Votre fonction
SetStartingTransform()complète devrait ressembler à ceci :Verse# Sets the StartingTransform to the current transform of the RootProp. SetStartingTransform():void= set StartingTransform = RootProp.GetTransform()
Pour commencer à déplacer votre accessoire, vous allez définir une nouvelle fonction
Move():Ajoutez une nouvelle méthode
Move()à la définition de votre classemovable_prop.Ajoutez le modificateur
<suspends>afin que cette fonction puisse s'exécuter de manière asynchrone. Étant donné qu’il s’agit de la version de base de cette fonction et qu’elle ne sera pas utilisée, effectuez simplement unreturnimmédiat.Votre fonction
`Move()`complète devrait ressembler à ceci :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
Si vous voulez que votre accessoire se réinitialise lorsqu'il a fini de se déplacer, vous devez le téléporter à sa position de départ. Pour gérer cela, ajoutez une nouvelle méthode
Reset()à la définition de votre classemovable_prop:Ajoutez les modificateurs
<decides><transacts>à cette fonction pour lui permettre d’annuler l’opération en cas d'échec de la réinitialisation. Cela peut se produire si votre accessoire a été mis au rebut pendant le jeu.Dans
Reset(), ramenez leRootPropà saStartingTransformen utilisantTeleportTo[].Votre fonction
Reset()complète devrait ressembler à ceci :Verse# Reset the RootProp by teleporting it back to its Starting Transform. Reset()<decides><transacts>:void= RootProp.TeleportTo[StartingTransform]
Vous avez défini de nombreuses fonctions, et il est maintenant temps de les lier toutes ensemble. Pour gérer toutes les différentes fonctions de mouvement, ajoutez une nouvelle méthode
ManageMovement()à la définition de votre classemovable_prop. Ajoutez le modificateur<suspends>pour permettre à cette fonction de s’exécuter de manière asynchrone.Verse# Loops moving the RootProp to its target by calling Move(), and handles # any logic when the movement begins and ends. ManageMovement()<suspends>:void=Dans
ManageMovement(), créez une expressionloopqui gère le mouvement. À l’intérieur de la boucle, commencez par exécuterSleep()pendantMoveStartDelaysecondes, puis appelezMove().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()Lorsque votre plateforme a fini de se déplacer, elle doit continuer à avancer, réinitialiser sa position ou s'arrêter sur place. Pour gérer l'arrêt, dans une expression
if, vérifiez siMoveOnceAndStopest activé. Le cas échéant, utilisezbreakpour sortir de la boucle. Une fois le mouvement terminé, exécutezSleep()pendantMoveEndDelaysecondes. Enfin, dans une autre expressionif, vérifiez siShouldResetest activé et appelezReset[]si c'est le cas. Votre fonctionManageMovement()complète devrait ressembler à ceci :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:Étant donné qu'il n'y a pas de fonction
OnBegin()dans cette classe, il vous faut un moyen permettant à d'autres classes d'appelerManageMovement()pour commencer à déplacer votre plateforme. Ajoutez une nouvelle fonctionSetup()à la définition de votre classemovable_prop. DansSetup(), appelez d'abordSetStartingTransform(), puis créez une fonctionManageMovement()pour faire bouger votre plateforme. Votre fonctionSetup()complète devrait ressembler à ceci :Verse# Set the StartingTransform, then begin movement by spawning ManageMovement. Setup():void= SetStartingTransform() spawn{ManageMovement()}
Suivant
Votre classe abstraite étant terminée, l'étape suivante consistera à trouver un moyen de la faire bouger grâce à l'animation !
Code complet
Voici le code complet généré dans cette section :
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."