Otro obstáculo de plataformas habitual en el género son los objetos que giran, como por ejemplo una plataforma giratoria sobre la que tienes que moverte constantemente, o una barra que se mueve de un lado a otro y sobre la que tienes que saltar.
El segundo componente de la transformación de un objeto es su rotación y puedes manipular un objeto para que gire alrededor de un eje. Existen varias formas diferentes de utilizar la rotación para crear desafíos de plataformas únicos. En esta sección aprenderás a crearlos.
Cómo crear elementos que giran
Sigue los pasos que se indican a continuación para crear un código que permita girar los elementos:
-
Crea una nueva clase de Verse con el nombre
rotating_propque herede demovable_propmediante el explorador de Verse. Añade el especificador<concrete>a esta clase para exponer sus propiedades a UEFN.# Un elemento que gira con una rotación adicional o que gira para coincidir # con la rotación de un elemento del modo Creativo. rotating_prop<public> := class<concrete>(movable_prop): -
Añade las sentencias
using { /Fortnite.com/Devices/CreativeAnimation }yusing { /UnrealEngine.com/Temporary/SpatialMath }en la parte superior del archivo para importar estos módulos. Necesitarás estos módulos para animar el elemento. También se incluyen aquí los consejos utilizados en esta sección.using { /Fortnite.com/Devices } using { /Fortnite.com/Devices/CreativeAnimation } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/SpatialMath } AdditionalRotationTip<localizes>:message = "La rotación que se va a aplicar al RootProp." ShouldRotateForeverTip<localizes>:message = "Indica si el RootProp debería rotar para siempre." MatchRotationTargetTip<localizes>:message = "El elemento opcional cuya rotación debería seguir el RootProp. Utilízalo si no quieres establecer una rotación adicional." # Un elemento que gira con una rotación adicional o que gira para coincidir # con la rotación de un elemento del modo Creativo. rotating_prop<public> := class<concrete>(movable_prop): - En la parte superior de la definición de la clase
rotating_prop, añade los siguientes campos.-
Una
rotationeditable con el nombreAdditionalRotation. Esta es la rotación que se va a aplicar al elemento. Una vez que se completaMove(), la rotación del elemento será desfasada por este valor.# Rotación adicional que se va a aplicar al RootProp. @editable {ToolTip := AdditionalRotationTip} AdditionalRotation:rotation = rotation{} -
Una
logiceditable con el nombreShouldRotateForever. Esto especifica si el elemento debe seguir en rotación sin reiniciarse.# Indica si el RootProp debería rotar para siempre. @editable {ToolTip := ShouldRotateForeverTip} ShouldRotateForever:logic = true -
Un editable opcional
creative_propcon el nombreMatchRotationTarget. Si quieres que tu elemento gire para coincidir con la rotación de otro elemento, puedes establecer este valor en vez de utilizarAdditionalRotation.# Elemento opcional que debería rotar RootProp para coincidir con su rotación. Utilízalo si no # no quieres establecer una rotación adicional. @editable {ToolTip := MatchRotationTargetTip} MatchRotationTarget:?creative_prop = false -
Una
rotationvariable con el nombreTargetRotation. Es la rotación hacia la que está girando el elemento en ese momento.# La rotación hacia la que está girando actualmente el elemento. var TargetRotation:rotation = rotation{}
-
-
La definición final de la clase debería tener este aspecto:
using { /Fortnite.com/Devices } using { /Fortnite.com/Devices/CreativeAnimation } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/SpatialMath } AdditionalRotationTip<localizes>:message = "La rotación que se va a aplicar al RootProp." ShouldRotateForeverTip<localizes>:message = "Indica si el RootProp debería rotar para siempre." MatchRotationTargetTip<localizes>:message = "El elemento opcional cuya rotación debería seguir el RootProp. Utilízalo si no quieres establecer una rotación adicional." # Un elemento que gira con una rotación adicional o que gira para coincidir # con la rotación de un elemento del modo Creativo. rotating_prop<public> := class<concrete>(movable_prop): # Rotación adicional que se va a aplicar al RootProp. @editable {ToolTip := AdditionalRotationTip} AdditionalRotation:rotation = rotation{} # Indica si el RootProp debería rotar para siempre. @editable {ToolTip := ShouldRotateForeverTip} ShouldRotateForever:logic = true # Elemento opcional que debería rotar RootProp para coincidir con su rotación. Utilízalo si no # no quieres establecer una rotación adicional. @editable {ToolTip := MatchRotationTargetTip} MatchRotationTarget:?creative_prop = false # La rotación hacia la que está girando actualmente el elemento. var TargetRotation:rotation = rotation{} -
Dado que ya configuraste la función
Move()que mueve tu elemento demovable_prop, puedes anularla en esta clase. Anula la funciónMove()en tu claserotating_prop. EnMove(), primero comprueba si se ha establecido elMatchRotationTargety guárdalo en una variableRotationToMatch. Si es así, establece laTargetRotationa laRotationToMatch. En caso contrario, establécela enAdditionalRotation.# Gira el RootProp aplicando la TargetRotation o hacia el MoveTarget, si se ha establecido. Move<override>()<suspends>:void= # Establece la TargetRotation a la rotación de MoveTarget, si se ha establecido el MoveTarget. if: RotationToMatch := MatchRotationTarget?.GetTransform().Rotation then: set TargetRotation = RotationToMatch else: set TargetRotation = AdditionalRotation - Al igual que con
translating_prop, especifica el modo de animación para reproducir la animación. Inicializa una nueva variableanimation_modecon el nombreAnimationModecon el valoranimation_mode.OneShot. Esto significa que la animación se detendrá una vez que el objeto alcance el objetivo. Si el elemento no debería girar eternamente o no moverse una vez y detenerse, establece el modo de animación en ping pong. El modo de animación ping pong te permitirá crear objetos que oscilen hacia delante y hacia atrás, como la barra de un metrónomo o un puente que sube y baja.# Establece el modo de animación predeterminado de reproducción. # El modo de animación OneShot reproducirá la animación una vez. var AnimationMode:animation_mode := animation_mode.OneShot # Si quieres que el RootProp no se reinicie y no se detenga cuando finalice su rotación, # establece el modo de animación en PingPong. if: not ShouldRotateForever? and not MoveOnceAndStop? then: set AnimationMode = animation_mode.PingPongSi estableces
ShouldResetcomo false yShouldRotateForevercomo true, tu elemento debería mantener su posición después de cada animación mientras continúa el bucleMove(). -
Consigue la rotación del elemento raíz en una nueva variable con el nombre
RotateByMoveRotationllamando aRotateBy()enStartingTransform, pasando el valorTargetRotation. Después llama aMoveToEase(). Tu función completaMove()debería tener este aspecto.# Gira el RootProp aplicando la TargetRotation o hacia el MoveTarget, si se ha establecido. Move<override>()<suspends>:void= # Establece la TargetRotation a la rotación de MoveTarget, si se ha establecido el MoveTarget. if: RotationToMatch := MatchRotationTarget?.GetTransform().Rotation then: set TargetRotation = RotationToMatch else: set TargetRotation = AdditionalRotation # Establece el modo de animación predeterminado de reproducción. # El modo de animación OneShot reproducirá la animación una vez. var AnimationMode:animation_mode := animation_mode.OneShot # Si quieres que el RootProp no se reinicie y no se detenga cuando finalice su rotación, # establece el modo de animación en PingPong. if: not ShouldRotateForever? and not MoveOnceAndStop? then: set AnimationMode = animation_mode.PingPong # Obtén la rotación hacia la que rotar mediante la rotación de StartingTransform # por AdditionalRotation. Después, inicia la rotación. RotateByTargetRotation := StartingTransform.Rotation.RotateBy(TargetRotation) RootProp.MoveToEase(RotateByTargetRotation, MoveDuration, MoveEaseType, AnimationMode) -
En tu clase de dispositivo
prop_animator, añade una nueva matriz editable derotating_propcon el nombreRotatingProps. Añade otra expresiónforenOnBegin()que recorra todos los elementos que rotan y llama aSetup()en ellos. Tu claseprop_animatoractualizada debería tener el siguiente aspecto:using { /Fortnite.com/Devices } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/Diagnostics } TranslatingPropsTip<localizes>:message = "Los elementos que se trasladan (mueven) con animación." RotatingPropsTip<localizes>:message = "Los elementos que giran con animación." # Coordina los elementos móviles a lo largo de la animación llamando al método Setup() de cada elemento. prop_animator := class(creative_device): # Matriz de elementos que se trasladan mediante animación. @editable TranslatingProps:[]translating_prop = array{} @editable RotatingProps:[]rotating_prop = array{} # Se ejecuta cuando se inicia el dispositivo en un juego en ejecución OnBegin<override>()<suspends>:void= # Para cada elemento, llama a Setup() para iniciar la animación. for: Prop:TranslatingProps do: Prop.Setup() for: Prop:RotatingProps do: Prop.Setup() - Guarda el código y compílalo.
Cómo vincular elementos a dispositivos
De vuelta en el editor, elimina algunos de los elementos que se encuentran después de la sección de traslación de elementos para crear otro espacio. Añade un FG01 Turntable base (base giratoria) y un FG01 SpinningBar Double S (barra giratoria doble S) a tu nivel. Ponle a la base el nombre RotatingBase y a la barra Spinning Bar. Posiciona la barra sobre la base y coloca ambos elementos por encima del espacio.
Configuración de los dos elementos giratorios. La barra giratoria y la base giratoria giran en la misma dirección a diferentes velocidades.
Selecciona el prop animator en el Esquematizador y añade un elemento de matriz a RotatingProps para cada uno de los elementos giratorios. Asigna a cada elemento los siguientes valores:
| Opción | Valor | Explicación |
|---|---|---|
| Rotación adicional | Z, 90.0 | Este elemento hará una rotación de 90 grados alrededor del eje Z cada vez. |
| Elemento raíz | Asigna al elemento que estás animando | Este es el elemento que estás animando. |
| Duración de movimiento | 2.0, 3.0 | Asigna a uno de los elementos una duración más corta para que giren a velocidades diferentes. |
| Tipo de aceleración de movimiento | Lineal | Esto animará los elementos a una velocidad constante. |
Aplica los cambios y comprueba los elementos. Intenta variar los diferentes valores para conseguir diferentes rotaciones, e intenta rotar en cada una de las diferentes dimensiones para crear diferentes tipos de obstáculos.
A continuación
En la siguiente sección combinarás el movimiento y la rotación para crear elementos que puedan hacer ambas cosas.
Código completo
A continuación encontrarás el código completo creado en esta sección:
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 rotación que se va a aplicar al RootProp."
ShouldRotateForeverTip<localizes>:message = "Indica si el RootProp debería rotar para siempre."
MatchRotationTargetTip<localizes>:message = "El elemento opcional cuya rotación debería seguir el RootProp. Utilízalo si no quieres establecer una rotación adicional."
# Un elemento que gira con una rotación adicional o que gira para coincidir
# con la rotación de un elemento del modo Creativo.
rotating_prop<public> := class<concrete>(movable_prop):
# Rotación adicional que se va a aplicar al RootProp.
@editable {ToolTip := AdditionalRotationTip}
AdditionalRotation:rotation = rotation{}
# Indica si el RootProp debería rotar para siempre.
@editable {ToolTip := ShouldRotateForeverTip}
ShouldRotateForever:logic = true
# Elemento opcional que debería rotar RootProp para coincidir con su rotación. Utilízalo si no
# no quieres establecer una rotación adicional.
@editable {ToolTip := MatchRotationTargetTip}
MatchRotationTarget:?creative_prop = false
# La rotación hacia la que está girando actualmente el elemento.
var TargetRotation:rotation = rotation{}
# Gira el RootProp aplicando la TargetRotation o hacia el MoveTarget, si se ha establecido.
Move<override>()<suspends>:void=
# Establece la TargetRotation a la RotationToMatch, si se ha definido. En caso contrario,
# establécela en AdditionalRotation.
if:
RotationToMatch := MatchRotationTarget?.GetTransform().Rotation
then:
set TargetRotation = RotationToMatch
else:
set TargetRotation = AdditionalRotation
# Establece el modo de animación predeterminado de reproducción.
# El modo de animación OneShot reproducirá la animación una vez.
var AnimationMode:animation_mode := animation_mode.OneShot
# Si quieres que el RootProp no se reinicie y no se detenga cuando finalice su rotación,
# establece el modo de animación en PingPong.
if:
not ShouldRotateForever? and not MoveOnceAndStop?
then:
set AnimationMode = animation_mode.PingPong
# Obtén la rotación hacia la que rotar mediante la rotación de StartingTransform
# por AdditionalRotation. Después, inicia la rotación.
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 = "Los elementos que se trasladan (mueven) con animación."
RotatingPropsTip<localizes>:message = "Los elementos que giran con animación."
# Coordina los elementos móviles a lo largo de la animación llamando al método Setup() de cada elemento.
prop_animator := class(creative_device):
# Matriz de elementos que se trasladan mediante animación.
@editable
TranslatingProps:[]translating_prop = array{}
@editable
RotatingProps:[]rotating_prop = array{}
# Se ejecuta cuando se inicia el dispositivo en un juego en ejecución
OnBegin<override>()<suspends>:void=
# Para cada elemento, llama a Setup() para iniciar la animación.
for:
Prop:TranslatingProps
do:
Prop.Setup()
for:
Prop:RotatingProps
do:
Prop.Setup()