Como configurar o nível
Para começar, inicialize um novo projeto do modelo de Ilha Inicial Fall Guys. Essa ilha inicial contém uma pista pronta para uso para você percorrer, e você a personalizará com movimento neste tutorial.
Como definir adereços que se movem
Antes de começar a adicionar movimento aos seus adereços, você precisa definir o que um adereço móvel é. Você poderia usar um dispositivo Verse para mover um adereço diretamente, mas isso pode se tornar complicado caso você queira mover vários adereços ao mesmo tempo. Em vez disso, você definirá uma classe abstract movable_prop. Isso conterá o adereço que você quer mover e diversos outros valores que você usará para personalizar a lógica e o tempo do seu movimento.
Siga os passos abaixo para definir seu adereço móvel:
Crie uma nova classe Verse chamada
movable_propusando o Explorador do Verse. Como esta é uma classe Verse e não um dispositivo, crie este arquivo usando Criar Vazio. E como esta será a classe abstract da qual você criará subclasses para diferentes tipos de adereços móveis, adicione o especificador<abstract>a esta classe. Para aprender a criar uma nova classe em Verse, confira Como modificar e executar seu primeiro programa em Verse.Verse# Defines a Creative prop that moves to a target or location using animation. movable_prop<public> := class<abstract>():Adicione os caminhos de importação
using { /Fortnite.com/Devices },using { /Verse.org/Simulation }eusing { /UnrealEngine.com/Temporary/SpatialMath }à parte superior do seu arquivo. Você precisará importar esses módulos para lidar com os cálculos que fazem seus adereços se moverem.Cada um dos campos nesta classe também incluirá uma
ToolTip. Adicionar uma mensagem deToolTipaos seus campos editáveis exibe uma dica quando você passa o mouse sobre o campo no UEFN. Todas as dicas usadas nesta classe estão inclusas abaixo. Você pode copiar e colar essas dicas, ou definir suas próprias.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."Defina os campos de que cada adereço móvel precisa. Na sua definição de classe
movable_prop, adicione os seguintes campos:Um
creative_propeditável chamadoRootProp. Este é o adereço de Modo Criativo que você moverá durante o jogo.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{}Um
floateditável chamadoMoveDuration. É a quantidade de tempo que o adereço leva para chegar ao seu destino.Verse# The duration in seconds it takes for the prop to move to its destination. @editable {ToolTip := MoveDurationTip} MoveDuration:float = 3.0Um
floateditável chamadoMoveStartDelay. Este é o tempo, em segundos, que o adereço aguarda antes de se mover.Verse# The duration in seconds to wait before movement begins. @editable {ToolTip := MoveStartDelayTip} MoveStartDelay:float = 0.0Um
floateditável chamadoMoveEndDelay. Este é o tempo, em segundos, que o adereço aguarda após se mover.Verse# The duration in seconds to wait after movement ends. @editable {ToolTip := MoveEndDelayTip} MoveEndDelay:float = 0.0Um
logiceditável chamadoMoveOnceAndStop. Controla se o seu adereço se move apenas uma vez ou se repete o movimento após finalizar.Verse# Whether the RootProp should stop in place when it finishes moving. @editable {ToolTip := MoveOnceAndStopTip} MoveOnceAndStop:logic = falseUm
logiceditável chamadaShouldReset. Controla se o seu adereço é restaurado para sua posição inicial após o término do movimento.Verse# Whether the RootProp should reset back to the starting position when it # finishes moving. @editable {ToolTip := ShouldResetTip} ShouldReset:logic = falseUma variável transform chamada
StartingTransform. Este é o transformar em que oRootPropestá quando começa o movimento.Verse# The starting transform of the RootProp. var StartingTransform:transform = transform{}
A sua definição de classe final deve ficar assim:
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."Antes de o seu adereço se mover, ele precisa saber de onde está se movendo. Para fazer isso, você criará uma nova função para definir o
StartingTransformantes do movimento:Adicione um novo método
SetStartingTransform()à sua definição de classemovable_prop.Em
SetStartingTransform(), definaStartingTransformcomo o transformar doRootPropusandoGetTransform().A função completa
SetStartingTransform()deve ficar assim:Verse# Sets the StartingTransform to the current transform of the RootProp. SetStartingTransform():void= set StartingTransform = RootProp.GetTransform()
Para começar a mover seu adereço, você definirá uma nova função
Move():Adicione um novo método
Move()à sua definição de classemovable_prop.Adicione o modificador
<suspends>a essa função para permitir que ela possa ser executada de maneira assíncrona. Como esta é a versão de classe base dessa função e ela não será usada, apenas usereturnimediatamente.A função completa
Move()deve ficar assim: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
Se você quer que seu adereço seja restaurado quando ele terminar o movimento, precisa teletransportá-lo de volta para sua posição inicial. Para fazer isso, adicione um novo método
Reset()à sua definição de classemovable_prop:Adicione os modificadores
<decides><transacts>a esta função para permitir que ela seja revertida caso o reset falhe. Isso pode ocorrer se o seu adereço for descartado durante o jogo.Em
Reset(), teletransporte oRootPropde volta à suaStartingPositionusandoTeleportTo[].A função completa
Reset()deve ficar assim:Verse# Reset the RootProp by teleporting it back to its Starting Transform. Reset()<decides><transacts>:void= RootProp.TeleportTo[StartingTransform]
Você definiu várias funções e agora é hora de conectá-las umas às outras. Para gerenciar todas as diferentes funções de movimento, adicione um novo método,
ManageMovement(), à sua definição de classemovable_prop. Adicione o modificador<suspends>para permitir que a função seja executada de forma assíncrona.Verse# Loops moving the RootProp to its target by calling Move(), and handles # any logic when the movement begins and ends. ManageMovement()<suspends>:void=Em
ManageMovement(), crie uma expressão deloopque gerencia o movimento. Dentro do loop, primeiro adicioneSleep()porMoveStartDelaysegundos e, em seguida, chameMove().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()Quando sua plataforma termina o movimento, ela precisa continuar se movendo, restaurar sua posição ou parar no lugar. Para cuidar da ação de parar, em uma expressão
if, verifique seMoveOnceAndStopé true. Caso seja,interrompao loop. Após o término do movimento, adicioneSleep()duranteMoveEndDelaysegundos. Por fim, em outra expressãoif, verifique seShouldReseté true e chameReset[]caso seja. A função completaManageMovement()deve ficar assim: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:Como não há uma função
OnBegin()nesta classe, você precisa de uma maneira para outras classes chamaremManageMovement()para começar a mover sua plataforma. Adicione uma nova funçãoSetup()à sua definição de classemovable_prop. EmSetup(), primeiro chameSetStartingTransform()e, em seguida, invoque uma funçãoManageMovement()para fazer a plataforma funcionar. A funçãoSetup()completa deve ficar assim:Verse# Set the StartingTransform, then begin movement by spawning ManageMovement. Setup():void= SetStartingTransform() spawn{ManageMovement()}
A seguir
Com sua classe abstract completa, no próximo passo, você descobrirá como fazer com que se movam por meio de animação.
Código completo
Aqui está o código completo feito nesta seção:
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."