Otro obstáculo de plataforma común en el género son los objetos que rotan, como una plataforma giratoria sobre la que te tienes que mover constantemente, o una barra que se mueve hacia adelante y hacia atrás sobre la que tienes que saltar.
El segundo componente de la transformación de un objeto es la rotación, y puedes manipular un objeto para que rote alrededor de un eje. Puedes usar la rotación de diferentes maneras para crear desafíos de plataforma únicos. En esta sección, aprenderás a programarlas.
Cómo hacer utilerías que roten
Sigue estos pasos para crear el código que rota tus utilerías:
-
Crea una nueva clase de Verse llamada
rotating_propque herede demovable_propusando el explorador de Verse. Añade el especificador<concrete>a esta clase para exponer sus propiedades a UEFN.# Una utilería que rota en función de una rotación adicional o rota para ajustarse # a la rotación de una utilería del modo Creativo. rotating_prop<public> := class<concrete>(movable_prop): -
Añade las declaraciones
using { /Fortnite.com/Devices/CreativeAnimation }yusing { /UnrealEngine.com/Temporary/SpatialMath }en la parte superior del archivo para importar estos módulos. Los necesitarás para animar tu utilería. Los textos emergentes que se usan en esta sección también se incluyen aquí.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 aplicará a la RootProp." ShouldRotateForeverTip<localizes>:message = "Si la RootProp debería rotar para siempre." MatchRotationTargetTip<localizes>:message = "La utilería opcional cuya rotación debería utilizar la RootProp para rotar. Úsala si no quieres establecer una rotación adicional." # Una utilería que rota en función de una rotación adicional o rota para ajustarse # a la rotación de una utilería 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 llamadaAdditionalRotation. Esta es la rotación que se aplicará a la utilería. Después de que se completeMove(), la rotación de la utilería se desplazará en función de este valor.# La rotación adicional que se aplicará a la RootProp. @editable {ToolTip := AdditionalRotationTip} AdditionalRotation:rotation = rotation{} -
Un
logiceditable llamadoShouldRotateForever. Esto especifica si la utilería debería seguir rotando sin restablecerse.# Si la RootProp debería rotar para siempre. @editable {ToolTip := ShouldRotateForeverTip} ShouldRotateForever:logic = true -
Una
creative_propopcional y editable llamadaMatchRotationTarget. Si quieres que tu utilería rote para ajustarse a la rotación de otra utilería, puedes establecer este valor en lugar de usar laAdditionalRotation.# La utilería opcional con cuya rotación debería ajustarse la rotación de RootProp. Úsala si # no quieres establecer una rotación adicional. @editable {ToolTip := MatchRotationTargetTip} MatchRotationTarget:?creative_prop = false -
Una variable
rotationllamadaTargetRotation. Esta es la rotación hacia la que está rotando actualmente la utilería.# La rotación hacia la que está rotando actualmente la utilería. var TargetRotation:rotation = rotation{}
-
-
La definición final de la clase debería verse así:
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 aplicará a la RootProp." ShouldRotateForeverTip<localizes>:message = "Si la RootProp debería rotar para siempre." MatchRotationTargetTip<localizes>:message = "La utilería opcional cuya rotación debería utilizar la RootProp para rotar. Úsala si no quieres establecer una rotación adicional." # Una utilería que rota en función de una rotación adicional o rota para ajustarse # a la rotación de una utilería del modo Creativo. rotating_prop<public> := class<concrete>(movable_prop): # La rotación adicional que se aplicará a la RootProp. @editable {ToolTip := AdditionalRotationTip} AdditionalRotation:rotation = rotation{} # Si la RootProp debería rotar para siempre. @editable {ToolTip := ShouldRotateForeverTip} ShouldRotateForever:logic = true # La utilería opcional con cuya rotación debería ajustarse la rotación de RootProp. Úsala si # no quieres establecer una rotación adicional. @editable {ToolTip := MatchRotationTargetTip} MatchRotationTarget:?creative_prop = false # La rotación hacia la que está rotando actualmente la utilería. var TargetRotation:rotation = rotation{} -
Dado que ya estableciste la función
Move()que mueve tu utilería enmovable_prop, puedes sobrescribirla en esta clase. Sobrescribe la funciónMove()en tu claserotating_prop. EnMove(), primero, verifica siMatchRotationTargetestá establecido y guárdalo en una variableRotationToMatch. De ser así, establece laTargetRotationen laRotationToMatch. De lo contrario, establécela en laAdditionalRotation.# Rota la RootProp aplicando la TargetRotation o hacia el MoveTarget si se estableció uno. Move<override>()<suspends>:void= # Establece la TargetRotation en la rotación del MoveTarget si el MoveTarget está establecido. if: RotationToMatch := MatchRotationTarget?.GetTransform().Rotation then: set TargetRotation = RotationToMatch else: set TargetRotation = AdditionalRotation - Como con
translating_prop, especifica el modo de animación para que tu animación se reproduzca. Inicializa una nueva variableanimation_modellamadaAnimationModeenanimation_mode.OneShot. Con esto, tu animación se detendrá una vez que el objeto alcance su objetivo. Si la utilería no debe rotar para siempre o moverse una vez y detenerse, establece el modo de animación en ping-pong. Al usar ping-pong, podrás hacer que los objetos oscilen hacia adelante y hacia atrás, como la varilla en un metrónomo o un puente que se eleva y desciende.# Establece el modo de animación predeterminado para reproducir. # El modo de animación OneShot reproducirá la animación una vez. var AnimationMode:animation_mode := animation_mode.OneShot # Si la RootProp no debería restablecerse ni detenerse cuando termine de rotar, # establece el modo de animación en PingPong. if: ¿Sin ShouldRotateForever ni MoveOnceAndStop? then: set AnimationMode = animation_mode.PingPongSi estableces
ShouldReseten false yShouldRotateForeveren true, tu utilería debería mantener su posición después de cada animación mientras continúa ejecutandoMove(). -
Pon la rotación hacia la que rotará tu utilería raíz en una nueva variable llamada
RotateByMoveRotationllamando aRotateBy()en laStartingTransformy pasando laTargetRotation. Luego, llama aMoveToEase(). La funciónMove()completa debería verse así.# Rota la RootProp aplicando la TargetRotation o hacia el MoveTarget si se estableció uno. Move<override>()<suspends>:void= # Establece la TargetRotation en la rotación del MoveTarget si el MoveTarget está establecido. if: RotationToMatch := MatchRotationTarget?.GetTransform().Rotation then: set TargetRotation = RotationToMatch else: set TargetRotation = AdditionalRotation # Establece el modo de animación predeterminado para reproducir. # El modo de animación OneShot reproducirá la animación una vez. var AnimationMode:animation_mode := animation_mode.OneShot # Si la RootProp no debería restablecerse ni detenerse cuando termine de rotar, # establece el modo de animación en PingPong. if: ¿Sin ShouldRotateForever ni MoveOnceAndStop? then: set AnimationMode = animation_mode.PingPong # Obtén la rotación hacia la que se rotará al rotar la StartingTransform # en función de la AdditionalRotation. Luego, 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_propllamadaRotatingProps. Añade otra expresiónforaOnBegin()que recorra todas las utilerías rotatorias y llame aSetup()en ellas. Tu claseprop_animatoractualizada debería verse así:using { /Fortnite.com/Devices } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/Diagnostics } TranslatingPropsTip<localizes>:message = "Las utilerías que se trasladan (mueven) usando animación." RotatingPropsTip<localizes>:message = "Las utilerías que rotan usando animación." # Coordina el movimiento de las utilerías a través de animación llamando al método Setup() de cada utilería. prop_animator := class(creative_device): # La matriz de utilerías que se trasladan usando animación. @editable TranslatingProps:[]translating_prop = array{} @editable RotatingProps:[]rotating_prop = array{} # Se ejecuta cuando el dispositivo se inicia en un juego en ejecución OnBegin<override>()<suspends>:void= # Por cada utilería, llama a Setup() para comenzar a animar. for: Prop:TranslatingProps do: Prop.Setup() for: Prop:RotatingProps do: Prop.Setup() - Guarda tu código y compílalo.
Cómo conectar las utilerías a los dispositivos
En el editor, elimina algunas de las utilerías después de la sección de las utilerías que se trasladan para crear otra brecha. Incluye una FG01 Turntable base y una FG01 SpinningBar Double S en tu nivel. Ponle el nombre RotatingBase a la base y Spinning Bar a la barra. Coloca la barra sobre la base y ambas utilerías sobre la brecha.
Configuración de las dos utilerías rotatorias. Tanto la barra giratoria como la base rotatoria giran en la misma dirección a diferentes velocidades.
Selecciona tu animador de utilería en el esquematizador y añade un elemento de matriz a RotatingProps por cada una de tus utilerías rotatorias. Asígnale a cada utilería los siguientes valores:
| Opción | Valor | Explicación |
|---|---|---|
| Rotación adicional | Z, 90.0 | Esta utilería hará una rotación de 90 grados sobre el eje Z cada vez. |
| RootProp | Asígnalo a la utilería que estás animando | Esta es la utilería que estás animando. |
| Duración de movimiento | 2.0, 3.0 | Asígnale a una de las utilerías una duración más corta para que roten a velocidades diferentes. |
| Tipo de suavizado de movimiento | Lineal | Esto animará tus utilerías a una velocidad constante. |
Sube tus cambios y luego revisa tus utilerías. Prueba variando los distintos valores para obtener diferentes rotaciones, y prueba rotar en cada una de las distintas dimensiones para crear diferentes tipos de obstáculos.
Próximo paso
En la próxima sección, combinarás movimiento y rotación para crear utilerías que pueden hacer ambas cosas.
Código completo
Esa es la versión completa del código 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 aplicará a la RootProp."
ShouldRotateForeverTip<localizes>:message = "Si la RootProp debería rotar para siempre."
MatchRotationTargetTip<localizes>:message = "La utilería opcional cuya rotación debería utilizar la RootProp para rotar. Úsala si no quieres establecer una rotación adicional."
# Una utilería que rota en función de una rotación adicional o rota para ajustarse
# a la rotación de una utilería del modo Creativo.
rotating_prop<public> := class<concrete>(movable_prop):
# La rotación adicional que se aplicará a la RootProp.
@editable {ToolTip := AdditionalRotationTip}
AdditionalRotation:rotation = rotation{}
# Si la RootProp debería rotar para siempre.
@editable {ToolTip := ShouldRotateForeverTip}
ShouldRotateForever:logic = true
# La utilería opcional con cuya rotación debería ajustarse la rotación de RootProp. Úsala si
# no quieres establecer una rotación adicional.
@editable {ToolTip := MatchRotationTargetTip}
MatchRotationTarget:?creative_prop = false
# La rotación hacia la que está rotando actualmente la utilería.
var TargetRotation:rotation = rotation{}
# Rota la RootProp aplicando la TargetRotation o hacia el MoveTarget si se estableció uno.
Move<override>()<suspends>:void=
# Establece la TargetRotation en la RotationToMatch si está establecida. De lo contrario, establécela
# en la AdditionalRotation.
if:
RotationToMatch := MatchRotationTarget?.GetTransform().Rotation
then:
set TargetRotation = RotationToMatch
else:
set TargetRotation = AdditionalRotation
# Establece el modo de animación predeterminado para reproducir.
# El modo de animación OneShot reproducirá la animación una vez.
var AnimationMode:animation_mode := animation_mode.OneShot
# Si la RootProp no debería restablecerse ni detenerse cuando termine de rotar,
# establece el modo de animación en PingPong.
if:
¿Sin ShouldRotateForever ni MoveOnceAndStop?
then:
set AnimationMode = animation_mode.PingPong
# Obtén la rotación hacia la que se rotará al rotar la StartingTransform
# en función de la AdditionalRotation. Luego, 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 = "Las utilerías que se trasladan (mueven) usando animación."
RotatingPropsTip<localizes>:message = "Las utilerías que rotan usando animación."
# Coordina el movimiento de las utilerías a través de animación llamando al método Setup() de cada utilería.
prop_animator := class(creative_device):
# La matriz de utilerías que se trasladan usando animación.
@editable
TranslatingProps:[]translating_prop = array{}
@editable
RotatingProps:[]rotating_prop = array{}
# Se ejecuta cuando el dispositivo se inicia en un juego en ejecución
OnBegin<override>()<suspends>:void=
# Por cada utilería, llama a Setup() para comenzar a animar.
for:
Prop:TranslatingProps
do:
Prop.Setup()
for:
Prop:RotatingProps
do:
Prop.Setup()