Outro obstáculo de plataforma comum ao gênero são objetos que giram, como uma plataforma giratória sobre a qual você precisa se mover constantemente, ou uma barra que gira sem parar sobre a qual você precisa saltar.
O segundo componente do transformar de um objeto é a rotação, e você pode manipular um objeto para que gire ao redor de um eixo. Há diversas maneiras diferentes de usar a rotação para criar desafios de plataforma únicos, e você aprenderá a programá-los nesta seção.
Como criar adereços que giram
Siga os passos abaixo para criar o código que gira seus adereços:
-
Crie uma nova classe Verse chamada
rotating_propque herda demovable_propusando o Explorador do Verse. Adicione o especificador<concrete>a essa classe para expor suas propriedades ao UEFN.~~~(verse) # Um adereço que gira por uma rotação adicional ou gira para se alinhar # à rotação de um adereço de Modo Criativo. rotating_prop
:= class (movable_prop): ~~~ -
Adicione as declarações
using { /Fortnite.com/Devices/CreativeAnimation }eusing { /UnrealEngine.com/Temporary/SpatialMath }ao topo do arquivo para importar esses módulos. Você precisará delas para animar seu adereço. Todas as dicas usadas nesta seção estão inclusas abaixo.~~~(verse) using { /Fortnite.com/Devices } using { /Fortnite.com/Devices/CreativeAnimation } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/SpatialMath }
AdditionalRotationTip
:message = "A rotação a ser aplicada ao RootProp." ShouldRotateForeverTip :message = "Se o RootProp deve girar infinitamente." MatchRotationTargetTip :message = "O adereço opcional cuja rotação o RootProp deve igualar. Use isto se você não quiser definir uma rotação adicional (AdditionalRotation)." # Um adereço que gira por uma rotação adicional ou gira para se alinhar # à rotação de um adereço de Modo Criativo. rotating_prop
:= class (movable_prop): ~~~ - No topo da definição de classe
rotating_prop, adicione os seguintes campos:-
Um
rotating_propeditável chamadoAdditionalRotation. Esta é a rotação a ser aplicada ao adereço. Após a conclusão deMove(), a rotação do adereço será deslocada por este valor.~~~(verse) # A rotação adicional a ser aplicada ao RootProp. @editable {ToolTip := AdditionalRotationTip} AdditionalRotation:rotation = rotation{} ~~~
-
Uma
logiceditável chamadaShouldRotateForever. Isso especifica se o adereço deve continuar girando sem se restaurar.# Se o RootProp deve girar infinitamente. @editable {ToolTip := ShouldRotateForeverTip} ShouldRotateForever:logic = true -
Um
creative_propeditável opcional chamadoMatchRotationTarget. Se você quiser que seu adereço gire para se alinhar à rotação de outro adereço, você pode definir este valor em vez de usar oAdditionalRotation.~~~(verse) # O adereço opcional cuja rotação o RootProp deve igualar. Use isto se você # não quiser definir uma rotação adicional. @editable {ToolTip := MatchRotationTargetTip} MatchRotationTarget:?creative_prop = false ~~~
-
Uma variável
rotationchamadaTargetRotation. Esta é a rotação para a qual o adereço está atualmente girando para chegar.~~~(verse) # A rotação para a qual o adereço está atualmente girando para chegar. var TargetRotation:rotation = rotation{} ~~~
-
-
A sua definição de classe final deve ficar assim:
~~~(verse) using { /Fortnite.com/Devices } using { /Fortnite.com/Devices/CreativeAnimation } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/SpatialMath }
AdditionalRotationTip
:message = "A rotação a ser aplicada ao RootProp." ShouldRotateForeverTip :message = "Se o RootProp deve girar infinitamente." MatchRotationTargetTip :message = "O adereço opcional cuja rotação o RootProp deve igualar. Use isto se você não quiser definir uma rotação adicional (AdditionalRotation)." # Um adereço que gira por uma rotação adicional ou gira para se alinhar # à rotação de um adereço de Modo Criativo. rotating_prop
:= class (movable_prop): # A rotação adicional a ser aplicada ao RootProp. @editable {ToolTip := AdditionalRotationTip} AdditionalRotation:rotation = rotation{}
# Se o RootProp deve girar infinitamente. @editable {ToolTip := ShouldRotateForeverTip} ShouldRotateForever:logic = true
# O adereço opcional cuja rotação o RootProp deve igualar. Use isto se você # não quiser definir uma rotação adicional. @editable {ToolTip := MatchRotationTargetTip} MatchRotationTarget:?creative_prop = false
# A rotação para a qual o adereço está atualmente girando para chegar. var TargetRotation:rotation = rotation{} ~~~
-
Como você á definiu a função
Move()que move o seu adereço emmovable_prop, você pode sobrescrevê-la nesta classe. Sobrescreva a funçãoMove()na sua classerotating_prop. EmMove(), verifique se oMatchRotationTargetestá definido e salve-o em uma variávelRotationToMatch. Caso esteja, definaTargetRotationcomo aRotationToMatch. Caso contrário, defina como aAdditionalRotation.~~~(verse) # Rotacione o RootProp aplicando a TargetRotation, ou em direção ao MoveTarget se um estiver definido. Move
() :void= # Defina a TargetRotation como a rotação do MoveTarget se o MoveTarget estiver definido. if: RotationToMatch := MatchRotationTarget?.GetTransform().Rotation then: set TargetRotation = RotationToMatch else: set TargetRotation = AdditionalRotation ~~~
- Como feito com a
translating_prop, especifique o modo de animação para a reprodução da sua animação. Inicialize uma nova variávelanimation_modechamadaAnimationModecomoanimation_mode.OneShot. Isso significa que sua animação será interrompida assim que o seu objeto chega ao alvo. Se o adereço não deve girar infinitamente ou não deve se mover uma vez e parar, defina o modo de animação como ping-pong. Usar o modo ping-pong permitirá criar objetos que oscilam para frente e para trás, como a barra de um metrônomo ou uma ponte que sobe e desce.# Defina o modo de animação padrão a ser reproduzido. # O modo de animação OneShot reproduzirá a animação uma vez. var AnimationMode:animation_mode := animation_mode.OneShot # Se o RootProp não deve se restaurar nem parar quando termina a rotação, # defina o modo de animação como PingPong. if: not ShouldRotateForever? and not MoveOnceAndStop? then: set AnimationMode = animation_mode.PingPongSe você definir
ShouldResetcomo false eShouldRotateForevercomo true, o seu adereço deve manter sua posição após cada animação enquanto continua o loop deMove(). -
Obtenha a rotação que o seu adereço raiz deve alcançar em uma nova variável chamada
RotateByMoveRotationchamandoRotateBy()noStartingTransform, passando aTargetRotation. Em seguida, chameMoveToEase(). Sua funçãoMove()completa deve ficar assim:~~~(verse) # Rotacione o RootProp aplicando a TargetRotation, ou em direção ao MoveTarget se um estiver definido. Move
() :void= # Defina a TargetRotation como a rotação do MoveTarget se o MoveTarget estiver definido. if: RotationToMatch := MatchRotationTarget?.GetTransform().Rotation then: set TargetRotation = RotationToMatch else: set TargetRotation = AdditionalRotation
# Defina o modo de animação padrão a ser reproduzido. # O modo de animação OneShot reproduzirá a animação uma vez. var AnimationMode:animation_mode := animation_mode.OneShot # Se o RootProp não deve se restaurar nem parar quando termina a rotação, # defina o modo de animação como PingPong. if: not ShouldRotateForever? and not MoveOnceAndStop? then: set AnimationMode = animation_mode.PingPong # Obtenha a rotação a ser alcançada girando o StartingTransform # pelo valor de AdditionalRotation. Em seguida, comece a girar. RotateByTargetRotation := StartingTransform.Rotation.RotateBy(TargetRotation) RootProp.MoveToEase(RotateByTargetRotation, MoveDuration, MoveEaseType, AnimationMode) ~~~
-
Em sua classe de dispositivo
prop_animator, adicione uma nova matriz editável derotating_propchamadaRotatingProps. Adicione outra expressãoforaOnBegin()que faz um loop que percorre todos os adereços de rotação e chamaSetup()neles. Sua classeprop_animatoratualizada deve ficar assim:using { /Fortnite.com/Devices } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/Diagnostics } TranslatingPropsTip<localizes>:message = "Os adereços que transladam (se movem) usando animação." RotatingPropsTip<localizes>:message = "Os adereços que giram usando animação." # Coordena a movimentação de adereços por meio de animação chamando o método Setup() de cada adereço. prop_animator := class(creative_device): # Matriz de adereços que translada usando animação. @editable TranslatingProps:[]translating_prop = array{} @editable RotatingProps:[]rotating_prop = array{} # É executado quando o dispositivo é iniciado em um jogo em execução OnBegin<override>()<suspends>:void= # Para cada adereço, chame Setup() para começar a animar. for: Prop:TranslatingProps do: Prop.Setup() for: Prop:RotatingProps do: Prop.Setup() - Salve o código e compile-o.
Como vincular adereços a dispositivos
De volta ao editor, exclua alguns dos adereços que estão depois da seção de adereços de translação para criar outro espaço vazio. Adicione uma FG01 Base Giratória e uma FG01 Barra Giratória Dupla P ao seu nível. Chame a base de RotatingBase e a barra de Spinning Bar. Posicione a barra acima da base, e coloque os dois adereços acima do espaço vazio.
Configuração dos dois adereços de rotação. Tanto a barra giratória quanto a base giratória giram na mesma direção com velocidades diferentes.
Selecione o seu animador de adereços no Organizador e adicione um elemento de matriz a RotatingProps para cada um dos seus adereços de rotação. Atribua cada adereço com os seguintes valores:
| Opção | Valor | Explicação |
|---|---|---|
| Additional Rotation | Z, 90.0 | Este adereço fará uma rotação de 90 graus ao redor do eixo Z toda vez. |
| RootProp | Atribua ao adereço que você está animando | Este é o adereço que você está animando. |
| Move Duration | 2.0, 3.0 | Atribua uma duração menor a um dos adereços para que eles girem com diferentes velocidades. |
| Move Ease Type | Linear | Isto animará seus adereços a uma velocidade consistente. |
Submeta suas alterações e, em seguida, confira seus adereços! Experimente variar os diferentes valores para obter rotações variadas e experimente girar em cada uma das dimensões para criar diferentes tipos de obstáculo.
Próximo passo
Na próxima seção, você combinará movimento e rotação para criar adereços que podem fazer os dois!
Código completo
Aqui está o código completo feito nesta seção:
rotating_prop.verse
using { /Fortnite.com/Devices }
using { /Fortnite.com/Devices/CreativeAnimation }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/SpatialMath }
AdditionalRotationTip<localizes>:message = "A rotação a ser aplicada ao RootProp."
ShouldRotateForeverTip<localizes>:message = "Se o RootProp deve girar infinitamente."
MatchRotationTargetTip<localizes>:message = "O adereço opcional cuja rotação o RootProp deve igualar. Use isto se você não quiser definir uma rotação adicional (AdditionalRotation)."
# Um adereço que gira por uma rotação adicional ou gira para se alinhar
# à rotação de um adereço de Modo Criativo.
rotating_prop<public> := class<concrete>(movable_prop):
# A rotação adicional a ser aplicada ao RootProp.
@editable {ToolTip := AdditionalRotationTip}
AdditionalRotation:rotation = rotation{}
# Se o RootProp deve girar infinitamente.
@editable {ToolTip := ShouldRotateForeverTip}
ShouldRotateForever:logic = true
# O adereço opcional cuja rotação o RootProp deve igualar. Use isto se você
# não quiser definir uma rotação adicional.
@editable {ToolTip := MatchRotationTargetTip}
MatchRotationTarget:?creative_prop = false
# A rotação para a qual o adereço está atualmente girando para chegar.
var TargetRotation:rotation = rotation{}
# Rotacione o RootProp aplicando a TargetRotation, ou em direção ao MoveTarget se um estiver definido.
Move<override>()<suspends>:void=
# Defina a TargetRotation como a RotationToMatch se uma estiver definida. Caso contrário, defina-a
# como a AdditionalRotation.
if:
RotationToMatch := MatchRotationTarget?.GetTransform().Rotation
then:
set TargetRotation = RotationToMatch
else:
set TargetRotation = AdditionalRotation
# Defina o modo de animação padrão a ser reproduzido.
# O modo de animação OneShot reproduzirá a animação uma vez.
var AnimationMode:animation_mode := animation_mode.OneShot
# Se o RootProp não deve se restaurar nem parar quando termina a rotação,
# defina o modo de animação como PingPong.
if:
not ShouldRotateForever? and not MoveOnceAndStop?
then:
set AnimationMode = animation_mode.PingPong
# Obtenha a rotação a ser alcançada girando o StartingTransform
# pelo valor de AdditionalRotation. Em seguida, comece a girar.
RotateByTargetRotation := StartingTransform.Rotation.RotateBy(TargetRotation)
RootProp.MoveToEase(RotateByTargetRotation, MoveDuration, MoveEaseType, AnimationMode)
~~~
### prop_animator.verse
~~~(verse)
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
TranslatingPropsTip<localizes>:message = "Os adereços que transladam (se movem) usando animação."
RotatingPropsTip<localizes>:message = "Os adereços que giram usando animação."
# Coordena a movimentação de adereços por meio de animação chamando o método Setup() de cada adereço.
prop_animator := class(creative_device):
# Matriz de adereços que translada usando animação.
@editable
TranslatingProps:[]translating_prop = array{}
@editable
RotatingProps:[]rotating_prop = array{}
# É executado quando o dispositivo é iniciado em um jogo em execução
OnBegin<override>()<suspends>:void=
# Para cada adereço, chame Setup() para começar a animar.
for:
Prop:TranslatingProps
do:
Prop.Setup()
for:
Prop:RotatingProps
do:
Prop.Setup()