Cómo configurar el nivel
Para empezar, inicializa un nuevo proyecto a partir de la plantilla de isla Inicio de Fall Guys. Esta isla inicial incluye un curso prediseñado por el que podrás navegar, y en este tutorial aprenderás a personalizarlo con movimientos.
Cómo definir elementos que se mueven
Antes de empezar a mover los elementos, debes definir qué es un elemento que se puede mover. Podrías utilizar un dispositivo de Verse para mover un elemento directamente, pero podría resultar complicado en el caso de que quisieras mover varios elementos a la vez. En su lugar, definirás una clase movable_prop abstracta. Esta contendrá el objeto que quieres mover y algunos otros valores que utilizarás para personalizar la lógica y el tiempo del movimiento.
Sigue los pasos que se indican a continuación para definir el elemento que se puede mover:
Crea una nueva clase de Verse con el nombre
movable_proputilizando el explorador de Verse. Como se trata de una clase de Verse y no de un dispositivo, crea este archivo utilizando Crear desde cero. Y como esta será la clase abstracta de la que subclasificarás los diferentes tipos de elementos móviles, añade el especificador<abstract>a esta clase. Para aprender a crear una nueva clase en Verse, consulta Cómo modificar y ejecutar tu primer programa en 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
using { /Fortnite.com/Devices },using { /Verse.org/Simulation }yusing { /UnrealEngine.com/Temporary/SpatialMath }al principio de tu archivo. Necesitarás importar estos módulos para poder controlar las matemáticas que permiten el movimiento de los elementos.Cada uno de los campos de esta clase también incluirá un mensaje de tipo
ToolTip. Al añadir un mensaje de tipoToolTipa los campos editables, aparecerá un consejo al pasar el ratón por encima del campo en UEFN. A continuación se incluyen todos los consejos utilizados en esta clase. Puedes copiar y pegar estos consejos o definir los tuyos propios.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 necesita cada elemento que se puede mover. En la definición de la clase
movable_prop, añade los siguientes campos:Un
creative_propeditable con el nombreRootProp. Este es el elemento 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 con el nombreMoveDuration. Es la cantidad de tiempo que tarda el elemento en 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 con el nombreMoveStartDelay. Es el tiempo en segundos que espera el elemento antes de moverse.Verse# The duration in seconds to wait before movement begins. @editable {ToolTip := MoveStartDelayTip} MoveStartDelay:float = 0.0Un
floateditable con el nombreMoveEndDelay. Es el tiempo en segundos que espera el elemento después de moverse.Verse# The duration in seconds to wait after movement ends. @editable {ToolTip := MoveEndDelayTip} MoveEndDelay:float = 0.0Un
logiceditable con el nombreMoveOnceAndStop. Esto controla si el elemento solo se mueve una vez o si repite el movimiento una vez finalizado.Verse# Whether the RootProp should stop in place when it finishes moving. @editable {ToolTip := MoveOnceAndStopTip} MoveOnceAndStop:logic = falseUn
logiceditable con el nombreShouldReset. Controla si el elemento vuelve a su posición original una vez finalizado el movimiento.Verse# Whether the RootProp should reset back to the starting position when it # finishes moving. @editable {ToolTip := ShouldResetTip} ShouldReset:logic = falseUna variable transform denominada
StartingTransform. Esta es la transformación en la que se encuentra elRootPropcuando inicia el movimiento.Verse# The starting transform of the RootProp. var StartingTransform:transform = transform{}
La definición final de la clase debería tener este aspecto:
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 el elemento se mueva, necesita saber desde dónde lo hace. Para ello, definirás una nueva función para establecer
StartingTransformantes del movimiento:Añade un nuevo método
SetStartingTransform()a la definición de tu clasemovable_prop.Dentro de
SetStartingTransform(), estableceStartingTransformcomo la transformación deRootProputilizandoGetTransform().Tu función
SetStartingTransform()completa debería tener este aspecto:Verse# Sets the StartingTransform to the current transform of the RootProp. SetStartingTransform():void= set StartingTransform = RootProp.GetTransform()
Para empezar a mover el elemento, definirás una nueva función
Move():Añade un nuevo método
Move()a la definición de tu clasemovable_prop.Añade el modificador
<suspends>para que esta función se pueda ejecutar de forma asíncrona. Como esta es la versión de la clase base de esta función y no se utilizará, simplemente vuelve mediantereturninmediatamente.Tu función
Move()completa debería tener este aspecto: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 el elemento se restablezca al finalizar su movimiento, tendrás que teletransportarlo a su posición inicial. Para controlarlo, añade un nuevo método
Reset()a la definición de tu clasemovable_prop:Añade los modificadores
<decides><transacts>a esta función para permitir que se revierta en caso de que falle el restablecimiento. Esto podría ocurrir si el elemento se elimina durante el juego.Dentro de
Reset(), teletransportaRootPropde vuelta a suStartingTransformmedianteTeleportTo[].Tu función
Reset()completa debería tener el siguiente aspecto:Verse# Reset the RootProp by teleporting it back to its Starting Transform. Reset()<decides><transacts>:void= RootProp.TeleportTo[StartingTransform]
Ahora que has definido un montón de funciones, ha llegado el momento de unirlas. Para controlar las diferentes funciones de movimiento, añade un nuevo método,
ManageMovement(), a la definición de tu clasemovable_prop. Añade el modificador<suspends>para que esta función se pueda ejecutar 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=ManageMovement(), crea una expresiónloopque se encarga de gestionar el movimiento. Dentro del bucle, primero añadeSleep()duranteMoveStartDelaysegundos, y después 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()Una vez que la plataforma finaliza su movimiento, tiene que seguir avanzando, volver a su posición o detenerse en el sitio. Para controlar la detención, en una expresión
if, comprueba si se activaMoveOnceAndStop. Si es así, sal del bucle conbreak. Cuando el movimiento se detiene,Sleep()se activa duranteMoveEndDelaysegundos. Por último, en otra expresiónif, comprueba siShouldResetse activa y llama aReset[]en caso de ser así. Tu funciónManageMovement()completa debería tener este aspecto: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 no existe la función
OnBegin()en esta clase, necesitas una forma para que otras clases puedan llamar aManageMovement()para empezar a mover la plataforma. Añade una nueva funciónSetup()a la definición de tu clasemovable_prop. Dentro deSetup(), primero llama aSetStartingTransform()y después genera una funciónManageMovement()para poner en marcha la plataforma. Tu funciónSetup()completa debería tener este aspecto:Verse# Set the StartingTransform, then begin movement by spawning ManageMovement. Setup():void= SetStartingTransform() spawn{ManageMovement()}
Siguiente
Ahora que ya has completado tu clase abstracta, en el siguiente paso descubrirás cómo hacer que se muevan con animaciones.
Código completo
A continuación encontrarás el código completo creado 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."