플랫폼 장르에서 흔히 볼 수 있는 또 하나의 플랫폼 장애물로는 회전하는 오브젝트가 있습니다. 예를 들어 플레이어는 회전 플랫폼 위에서 계속 이동해야 하며, 왔다 갔다 하며 움직이는 바 위를 점프해야 합니다.
오브젝트 트랜스폼의 두 번째 컴포넌트는 회전이며, 오브젝트가 축을 중심으로 회전하도록 조작할 수 있습니다. 회전을 사용하여 독특한 플랫폼 도전을 만들 수 있는 몇 가지 다양한 방법이 있으며, 이 섹션에서는 이를 코딩하는 방법을 알아봅니다.
회전하는 사물 만들기
사물을 회전하는 코드를 빌드하려면 다음 단계를 따릅니다.
-
Verse 익스플로러 를 사용하여
movable_prop에서 상속되는 새 Verse 클래스rotating_prop을 생성합니다. 이 클래스에<concrete>지정자를 추가하여 UEFN에 프로퍼티를 노출합니다.# 추가 회전만큼 회전하거나 포크리 사물의 회전에 맞춰 회전하는 # 사물입니다. rotating_prop<public> := class<concrete>(movable_prop): -
using { /Fortnite.com/Devices/CreativeAnimation },using { /UnrealEngine.com/Temporary/SpatialMath }명령문을 파일 상단에 추가하여 이러한 모듈을 임포트합니다. 이는 사물에 애니메이션을 적용하는 데 필요합니다. 이 섹션에서 사용된 툴팁도 여기에 포함됩니다.using { /Fortnite.com/Devices } using { /Fortnite.com/Devices/CreativeAnimation } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/SpatialMath } AdditionalRotationTip<localizes>:message = "RootProp에 적용할 회전입니다." ShouldRotateForeverTip<localizes>:message = "RootProp이 영구적으로 회전해야 하는지 여부입니다." MatchRotationTargetTip<localizes>:message = "선택적 사물로, 이 사물의 회전에 맞춰 RootProp이 회전합니다. 추가 회전을 설정하지 않으려는 경우 사용합니다." # 추가 회전만큼 회전하거나 포크리 사물의 회전에 맞춰 회전하는 # 사물입니다. rotating_prop<public> := class<concrete>(movable_prop): rotating_prop클래스 정의 상단에 다음 필드를 추가합니다.-
AdditionalRotation으로 명명된 편집 가능한rotation으로, 사물에 적용할 회전입니다.Move()가 완료된 후 사물의 회전이 이 값으로 오프셋됩니다.# RootProp에 적용할 추가 회전입니다. @editable {ToolTip := AdditionalRotationTip} AdditionalRotation:rotation = rotation{} -
ShouldRotateForever로 명명된 편집 가능한logic입니다. 사물이 리셋되지 않고 계속 회전해야 하는지 여부를 지정합니다.# RootProp이 영구적으로 회전해야 하는지 여부입니다. @editable {ToolTip := ShouldRotateForeverTip} ShouldRotateForever:logic = true -
MatchRotationTarget으로 명명된 편집 가능한 선택적creative_prop입니다. 사물을 다른 사물의 회전에 맞춰 회전하려는 경우AdditionalRotation을 사용하는 대신 이 값을 설정하면 됩니다.# 선택적 사물로, 이 사물의 회전에 맞춰 RootProp이 회전합니다. 추가 회전을 # 설정하지 않으려는 경우 사용합니다. @editable {ToolTip := MatchRotationTargetTip} MatchRotationTarget:?creative_prop = false -
TargetRotation으로 명명된 변수rotation입니다. 사물이 현재 이 회전을 향해 회전 중입니다.# 사물이 현재 이 회전을 향해 회전 중입니다. var TargetRotation:rotation = rotation{}
-
-
최종 클래스 정의는 다음과 같습니다.
using { /Fortnite.com/Devices } using { /Fortnite.com/Devices/CreativeAnimation } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/SpatialMath } AdditionalRotationTip<localizes>:message = "RootProp에 적용할 회전입니다." ShouldRotateForeverTip<localizes>:message = "RootProp이 영구적으로 회전해야 하는지 여부입니다." MatchRotationTargetTip<localizes>:message = "선택적 사물로, 이 사물의 회전에 맞춰 RootProp이 회전합니다. 추가 회전을 설정하지 않으려는 경우 사용합니다." # 추가 회전만큼 회전하거나 포크리 사물의 회전에 맞춰 회전하는 # 사물입니다. rotating_prop<public> := class<concrete>(movable_prop): # RootProp에 적용할 추가 회전입니다. @editable {ToolTip := AdditionalRotationTip} AdditionalRotation:rotation = rotation{} # RootProp이 영구적으로 회전해야 하는지 여부입니다. @editable {ToolTip := ShouldRotateForeverTip} ShouldRotateForever:logic = true # 선택적 사물로, 이 사물의 회전에 맞춰 RootProp이 회전합니다. 추가 회전을 # 설정하지 않으려는 경우 사용합니다. @editable {ToolTip := MatchRotationTargetTip} MatchRotationTarget:?creative_prop = false # 사물이 현재 이 회전을 향해 회전 중입니다. var TargetRotation:rotation = rotation{} -
이미
movable_prop에서 사물을 이동하는Move()함수를 구성했으므로 이 클래스에서 오버라이드할 수 있습니다.rotating_prop클래스에서Move()함수를 오버라이드합니다.Move()에서 먼저MatchRotationTarget이 설정되었는지 확인하고 변수RotationToMatch에 저장합니다. 설정된 경우TargetPosition을RotationToMatch로 설정합니다. 그렇지 않으면AdditionalRotation으로 설정합니다.# RootProp을 TargetRotation을 적용하여 회전하거나, 설정된 경우 MoveTarget을 향해 회전합니다. Move<override>()<suspends>:void= # MoveTarget이 설정된 경우 TargetRotation을 MoveTarget의 회전으로 설정합니다. if: RotationToMatch := MatchRotationTarget?.GetTransform().Rotation then: set TargetRotation = RotationToMatch else: set TargetRotation = AdditionalRotation translating_prop과 마찬가지로 애니메이션을 재생할 애니메이션 모드를 지정합니다.AnimationMode로 명명된 새animation_mode변수를animation_mode.OneShot으로 초기화합니다. 이렇게 하면 오브젝트가 타깃에 도달했을 때 애니메이션이 중지됩니다. 사물이 영구적으로 회전해서는 안 되거나 한 번만 이동하고 중지해서는 안 되는 경우, 애니메이션 모드를 왕복으로 설정합니다. 왕복을 사용하면 메트로놈의 바 또는 올라갔다 내려가는 다리처럼 왕복으로 오가는 오브젝트를 만들 수 있습니다.# 재생할 기본 애니메이션 모드를 설정합니다. # OneShot 애니메이션 모드는 애니메이션을 한 번 재생합니다. var AnimationMode:animation_mode := animation_mode.OneShot # RootProp이 회전을 마쳤을 때 리셋 및 중지되어서는 안 되는 경우, # 애니메이션 모드를 PingPong으로 설정합니다. if: not ShouldRotateForever? and not MoveOnceAndStop? then: set AnimationMode = animation_mode.PingPongShouldReset을 false 로,ShouldRotateForever를 true 로 설정하는 경우 사물이Move()를 계속 루프하면서 각 애니메이션이 끝난 후의 위치를 유지합니다.-
StartingTransform의RotateBy()를 호출하여TargetRotation을 전달함으로써RotateByMoveRotation으로 명명된 새 변수에서 루트 사물이 회전할 타깃 회전을 얻습니다. 그런 다음MoveToEase()를 호출합니다. 완성된Move()함수는 다음과 같습니다.# RootProp을 TargetRotation을 적용하여 회전하거나, 설정된 경우 MoveTarget을 향해 회전합니다. Move<override>()<suspends>:void= # MoveTarget이 설정된 경우 TargetRotation을 MoveTarget의 회전으로 설정합니다. if: RotationToMatch := MatchRotationTarget?.GetTransform().Rotation then: set TargetRotation = RotationToMatch else: set TargetRotation = AdditionalRotation # 재생할 기본 애니메이션 모드를 설정합니다. # OneShot 애니메이션 모드는 애니메이션을 한 번 재생합니다. var AnimationMode:animation_mode := animation_mode.OneShot # RootProp이 회전을 마쳤을 때 리셋 및 중지되어서는 안 되는 경우, # 애니메이션 모드를 PingPong으로 설정합니다. if: not ShouldRotateForever? and not MoveOnceAndStop? then: set AnimationMode = animation_mode.PingPong # StartingTransform을 AdditionalRotation만큼 회전하여 # 타깃 회전을 얻습니다. 그런 다음 회전을 시작합니다. RotateByTargetRotation := StartingTransform.Rotation.RotateBy(TargetRotation) RootProp.MoveToEase(RotateByTargetRotation, MoveDuration, MoveEaseType, AnimationMode) -
prop_animator장치 클래스에RotatingProps로 명명한rotating_prop의 새 편집 가능 배열을 추가합니다. 회전하는 모든 사물을 루프하고 해당 사물에서Setup()을 호출하는OnBegin()에 또 하나의for표현식을 추가합니다. 업데이트된prop_animator클래스는 다음과 같습니다.using { /Fortnite.com/Devices } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/Diagnostics } TranslatingPropsTip<localizes>:message = "애니메이션을 사용하여 이동하는 사물입니다." RotatingPropsTip<localizes>:message = "애니메이션을 사용하여 회전하는 사물입니다." # 각 사물의 Setup() 메서드를 호출하여 애니메이션을 통해 이동하는 사물을 조정합니다. prop_animator := class(creative_device): # 애니메이션을 사용하여 이동하는 사물의 배열입니다. @editable TranslatingProps:[]translating_prop = array{} @editable RotatingProps:[]rotating_prop = array{} # 실행 중인 게임에서 장치가 시작되면 실행됩니다. OnBegin<override>()<suspends>:void= # 각 사물에서 Setup()을 호출하여 애니메이션 적용을 시작합니다. for: Prop:TranslatingProps do: Prop.Setup() for: Prop:RotatingProps do: Prop.Setup() - 코드를 저장하고 컴파일합니다.
장치에 사물 연결하기
에디터로 돌아가 이동하는 사물 섹션 뒤의 일부 사물을 삭제하여 또 다른 틈새를 만듭니다. 레벨에 FG01 Turntable base 및 FG01 SpinningBar Double S 를 추가합니다. 베이스는 RotatingBase 로, 바는 Spinning Bar 로 명명합니다. 바를 베이스 위에 배치하고 두 사물을 모두 틈새 위에 배치합니다.
회전하는 두 사물의 구성입니다. 회전 바와 회전 베이스가 같은 방향에서 다른 속도로 회전합니다.
아웃라이너(Outliner) 에서 prop animator 를 선택하고, 회전하는 각 사물의 RotatingProps 에 배열 엘리먼트를 추가합니다. 각 사물에 다음 값을 할당합니다.
| 옵션 | 값 | 설명 |
|---|---|---|
| 추가 회전(Additional Rotation) | Z, 90.0 | 이 사물은 매번 Z축을 중심으로 90도 회전합니다. |
| RootProp | 애니메이션을 적용할 사물에 할당합니다. | 애니메이션을 적용할 사물입니다. |
| 이동 지속 시간(Move Duration) | 2.0, 3.0 | 사물이 서로 다른 속도로 회전하도록 사물 중 하나에 더 짧은 지속 시간을 할당합니다. |
| 이동 이즈 타입(Move Ease Type) | 선형(Linear) | 사물에 일정한 속도로 애니메이션을 적용합니다. |
변경 사항을 푸시한 다음 사물을 확인합니다. 값을 다르게 설정하여 다양한 회전을 얻고, 각기 다른 범위로 회전시켜 다양한 타입의 장애물을 만들어 보세요.
다음 단계
다음 섹션에서는 이동과 회전을 결합하여 이동과 회전이 모두 가능한 사물을 제작해 봅니다.
완성된 코드
이 섹션에서 빌드한 완성된 코드는 다음과 같습니다.
rotating_prop.verse
using { /Fortnite.com/Devices }
using { /Fortnite.com/Devices/CreativeAnimation }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/SpatialMath }
AdditionalRotationTip<localizes>:message = "RootProp에 적용할 회전입니다."
ShouldRotateForeverTip<localizes>:message = "RootProp이 영구적으로 회전해야 하는지 여부입니다."
MatchRotationTargetTip<localizes>:message = "선택적 사물로, 이 사물의 회전에 맞춰 RootProp이 회전합니다. 추가 회전을 설정하지 않으려는 경우 사용합니다."
# 추가 회전만큼 회전하거나 포크리 사물의 회전에 맞춰 회전하는
# 사물입니다.
rotating_prop<public> := class<concrete>(movable_prop):
# RootProp에 적용할 추가 회전입니다.
@editable {ToolTip := AdditionalRotationTip}
AdditionalRotation:rotation = rotation{}
# RootProp이 영구적으로 회전해야 하는지 여부입니다.
@editable {ToolTip := ShouldRotateForeverTip}
ShouldRotateForever:logic = true
# 선택적 사물로, 이 사물의 회전에 맞춰 RootProp이 회전합니다. 추가 회전을
# 설정하지 않으려는 경우 사용합니다.
@editable {ToolTip := MatchRotationTargetTip}
MatchRotationTarget:?creative_prop = false
# 사물이 현재 이 회전을 향해 회전 중입니다.
var TargetRotation:rotation = rotation{}
# RootProp을 TargetRotation을 적용하여 회전하거나, 설정된 경우 MoveTarget을 향해 회전합니다.
Move<override>()<suspends>:void=
# 설정된 경우 TargetRotation을 RotationToMatch로 설정합니다. 그렇지 않으면
# AdditionalRotation으로 설정합니다.
if:
RotationToMatch := MatchRotationTarget?.GetTransform().Rotation
then:
set TargetRotation = RotationToMatch
else:
set TargetRotation = AdditionalRotation
# 재생할 기본 애니메이션 모드를 설정합니다.
# OneShot 애니메이션 모드는 애니메이션을 한 번 재생합니다.
var AnimationMode:animation_mode := animation_mode.OneShot
# RootProp이 회전을 마쳤을 때 리셋 및 중지되어서는 안 되는 경우,
# 애니메이션 모드를 PingPong으로 설정합니다.
if:
not ShouldRotateForever? and not MoveOnceAndStop?
then:
set AnimationMode = animation_mode.PingPong
# StartingTransform을 AdditionalRotation만큼 회전하여
# 타깃 회전을 얻습니다. 그런 다음 회전을 시작합니다.
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 = "애니메이션을 사용하여 이동하는 사물입니다."
RotatingPropsTip<localizes>:message = "애니메이션을 사용하여 회전하는 사물입니다."
# 각 사물의 Setup() 메서드를 호출하여 애니메이션을 통해 이동하는 사물을 조정합니다.
prop_animator := class(creative_device):
# 애니메이션을 사용하여 이동하는 사물의 배열입니다.
@editable
TranslatingProps:[]translating_prop = array{}
@editable
RotatingProps:[]rotating_prop = array{}
# 실행 중인 게임에서 장치가 시작되면 실행됩니다.
OnBegin<override>()<suspends>:void=
# 각 사물에서 Setup()을 호출하여 애니메이션 적용을 시작합니다.
for:
Prop:TranslatingProps
do:
Prop.Setup()
for:
Prop:RotatingProps
do:
Prop.Setup()