Configuración del nivel
Para comenzar, inicializa un proyecto nuevo desde la plantilla de isla de inicio de Fall Guys. Esta isla de inicio contiene una pista ya creada para que la explores; la personalizarás con movimiento en este tutorial.
Cómo definir utilerías que se mueven
Antes de que puedas comenzar a mover tu utilería, debes definir qué es una utilería movible. Podrías utilizar un dispositivo de Verse para mover una utilería directamente, pero esto podría complicarse si quisieras mover varias utilerías a la vez. En su lugar, definirás una clase abstracta movible_prop. Esta contendrá la utilería que quieres mover y otros valores que usarás para personalizar la lógica y la sincronización de tu movimiento.
Sigue los pasos a continuación para definir tu utilería movible:
Crea una nueva clase de Verse llamada
movable_propcon el explorador de Verse. Dado que esta es una clase de Verse y no un dispositivo, crea este archivo con Crear vacío. Y como esta será la clase abstracta a partir de la cual crearás una subclase de los diferentes tipos de utilerías móviles, añade el especificador<abstract>a esta clase. Para obtener más información sobre cómo crear una nueva clase en Verse, consulta Modifica y ejecuta tu primer programa de Verse.Verse# Defines a Creative prop that moves to a target or location using animation. movable_prop<public> := class<abstract>():Añade las rutas de importación
que usen { /Fortnite.com/Devices },que usen { /Verse.org/Simulation }yque usen { /UnrealEngine.com/Temporary/SpatialMath }a la parte superior del archivo. Deberás importar estos módulos para manejar la matemática que hace que tus utilerías se muevan.Cada uno de los campos en esta clase también incluirá un
ToolTip. Si añades un mensajeToolTipa tus campos editables, se mostrará un texto emergente cuando el ratón se pose sobre el campo en UEFN. Todos los textos emergentes que se usan en esta clase se incluyen abajo. Puedes copiar y pegar estos textos emergentes o definir los tuyos.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."Define los campos que cada utilería movible necesita. Añade los siguientes campos a la definición de tu clase
movable_prop:Un
creative_propeditable denominadoRootProp. Esta es la utilería del modo Creativo que moverás durante el juego.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
floateditable denominadoMoveDuration. Este es el tiempo que le lleva a la utilería llegar a su destino.Verse# The duration in seconds it takes for the prop to move to its destination. @editable {ToolTip := MoveDurationTip} MoveDuration:float = 3.0Un
floateditable denominadoMoveStartDelay. Este es el tiempo en segundos que la utilería espera antes de moverse.Verse# The duration in seconds to wait before movement begins. @editable {ToolTip := MoveStartDelayTip} MoveStartDelay:float = 0.0Un
floateditable denominadoMoveEndDelay. Este es el tiempo en segundos que la utilería espera después de moverse.Verse# The duration in seconds to wait after movement ends. @editable {ToolTip := MoveEndDelayTip} MoveEndDelay:float = 0.0Un
logiceditable denominadoMoveOnceAndStop. Controla si tu utilería solo se mueve una vez o si repite el movimiento después de terminar.Verse# Whether the RootProp should stop in place when it finishes moving. @editable {ToolTip := MoveOnceAndStopTip} MoveOnceAndStop:logic = falseUn
logiceditable denominadoShouldReset. Controla si tu utilería se restablece a su posición original después de que termina de moverse.Verse# Whether the RootProp should reset back to the starting position when it # finishes moving. @editable {ToolTip := ShouldResetTip} ShouldReset:logic = falseUna transformación variable denominada
StartingTransform. Esta es la transformación donde está laRootPropcuando comienza el movimiento.Verse# The starting transform of the RootProp. var StartingTransform:transform = transform{}
La definición final de la clase debería verse así:
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 que tu utilería se mueva, debe saber desde dónde se está moviendo. Para lograrlo, definirás una nueva función para establecer la
StartingTransformantes del movimiento:Añade un nuevo método
SetStartingTransform()a la definición de clasemovable_prop.Dentro de
SetStartingTransform(), establece laStartingTransformen la transformación de laRootPropmedianteGetTransform().La función
SetStartingTransform()completa debería verse de la siguiente manera:Verse# Sets the StartingTransform to the current transform of the RootProp. SetStartingTransform():void= set StartingTransform = RootProp.GetTransform()
Para comenzar a mover tu utilería, definirás una nueva función
Move():Añade un nuevo método
Move()a la definición de clasemovable_prop.Añade el modificador
<suspends>para que esta función se pueda ejecutar de forma asíncrona. Dado que esta es la versión de clase base de esta función y no se utilizará, simplementereturnde inmediato.La función
Move()completa debería verse de la siguiente manera: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 quieres que tu utilería se restablezca cuando termine de moverse, debes teletransportarla de vuelta a su posición inicial. Para controlarlo, añade un nuevo método
Reset()a la definición de clasemovable_prop:Añade los modificadores
<decides><transacts>a esta función para permitir que se revierta en caso de que no se pueda realizar el restablecimiento. Esto podría ocurrir si la utilería se desecha durante el juego.Dentro de
Reset(), teletransportaRootPropde vuelta a suStartingTransformmedianteTeleportTo[].La función
Reset()completa debería verse de la siguiente manera:Verse# Reset the RootProp by teleporting it back to its Starting Transform. Reset()<decides><transacts>:void= RootProp.TeleportTo[StartingTransform]
Definiste muchas funciones; ahora es el momento de unirlas todas. Para administrar todas las diferentes funciones de movimiento, añade un nuevo método,
ManageMovement(), a tu definición de clasemovable_prop. Añade el modificador<suspends>para permitir que esta función se ejecute de forma así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=En
ManageMovement(), crea una expresiónloopque controle el movimiento. Dentro del bucle, primero ejecutaSleep()duranteMoveStartDelaysegundos, luego llama aMove().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()Cuando tu plataforma termine de moverse, debe continuar, restablecer su posición o detenerse en el sitio. Para controlar la detención, en una expresión
if, verifica siMoveOnceAndStopes verdadero. Si es así, sal del bucle conbreak. Después de que el movimiento se detenga,Sleep()duranteMoveEndDelaysegundos. Finalmente, en otra expresiónif, verifica siShouldResetes verdadero y llama aReset[]de ser así. La funciónManageMovement()completa debería verse de la siguiente manera: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:Dado que no hay una función
OnBegin()en esta clase, necesitas una manera de que otras clases llamen aManageMovement()para comenzar a mover tu plataforma. Añade una nueva funciónSetup()a tu definición de clasemovable_prop. Dentro deSetup(), primero llama aSetStartingTransform(), luego genera una funciónManageMovement()para poner en marcha tu plataforma. La funciónSetup()completa debería verse de la siguiente manera:Verse# Set the StartingTransform, then begin movement by spawning ManageMovement. Setup():void= SetStartingTransform() spawn{ManageMovement()}
A continuación
Con tu clase abstracta completa, en el siguiente paso, entenderás cómo hacerlas mover mediante animación.
Código completo
Esa es la versión completa del código en esta sección:
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."