나만의 작은 도서관
[TIL][C++] 251016 MMO 서버 개발 116일차: [언리얼] 루트 모션(Root Motion)이란?, 몽타주에서 Room Motion이 활성화되어 있었다면? 본문
Today I Learn
[TIL][C++] 251016 MMO 서버 개발 116일차: [언리얼] 루트 모션(Root Motion)이란?, 몽타주에서 Room Motion이 활성화되어 있었다면?
pledge24 2025. 10. 17. 00:06주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다.
[언리얼] 루트 모션(Root Motion)이란?

- 루트 모션(Root Motion)은 애니메이션 옵션 중 하나로, 애니메이션의 이동이 실제 캐릭터 움직임에 적용되도록 하는 옵션이다.
원래는 무엇이 캐릭터의 움직임을 제어했을까?
- 언리얼에서 캐릭터의 움직임을 적용할 때는 대게 CharacterMovement 컴포넌트(줄여서 CMC)를 사용한다. 그래서 키보드와 같은 입력 장치에서 입력이 들어왔을 때 실행하는 함수 내부를 보면 CMC::AddMovementInput() 등의 CMC 함수를 호출하는 것을 찾아볼 수 있다.
재생될 애니메이션에 루트 모션을 적용할 경우
- 루트 모션 옵션을 적용한 애니메이션을 캐릭터가 재생하는 경우, 애니메이션의 캐릭터 움직임을 실제 캐릭터에 적용하게 된다. 이때 이동 데이터의 유무에 따라 아래와 같이 적용된다.
- 캐릭터 이동 데이터가 애니메이션에 없는 경우: Stationary 루트 본이 있는 애니메이션은 이동하지 않고 제자리에서 재생됨.
- 캐릭터 이동 데이터가 애니메이션에 있는 경우: 캐릭터가 데이터를 기반으로 이동하면서 재생된다.
- 하지만, 애니메이션은 기본적으로 캐릭터의 실제 움직임에는 영향을 주지 않으며, 애니메이션을 실제 움직임으로 적용하고자 한다면 루트 모션(Root Motion) 프로퍼티로 활성화해야 한다.


[언리얼] 몽타주에서 Room Motion이 활성화되어 있었다면?
- 몽타주로 실행되는 애니메이션 자체가 캐릭터의 위치를 제어한다.
- → CharacterMovementComponent에 의한 조작들은 무시되거나 제한된다. 즉, AddMovementInput과 같은 함수를 호출해도 캐릭터는 이동하지 않는다.
ABP에서 Root Motion Mode 바꿨을 때 효과
- Root Motion From Montages Only: 몽타주만 Root Motion 허용 → 몽타주 재생 시 이동 조작 불가
- Ignore Root Motion: 모든 Root Motion을 무시 → 무슨 애니메이션을 재생하든(몽타주 포함) 이동 조작 가능.

Q. 언리얼에서 몽타주를 Root Motion으로 설정한 상태에서 워프를 타야 하는 경우, 캐릭터 위치를 어떻게 처리해야 하는가?
- Root Motion이 켜져 있는 몽타주를 재생하는 도주에 SetActorLocation과 같은 액터를 워프 시키는 작업을 진행한다면 Root Motion에 의한 이동과 워프 좌표 보정이 충돌할 수 있음.
해결 방법 A. Root Motion 일시 비활성화 후 워프
Character->GetMesh()->GetAnimInstance()->Montage_Stop(0.1f);
Character->SetActorLocatgion(WarpTarget)
- 잠시 몽타주 이동을 중단하고, 액터를 워프 시킴
해결 방법 B. Root Motion 유지 + 워프 상대 좌표 보정
FTransform RootMotionAdjust = Character->GetMesh()->ConvertLocalRootMotionToWorld(RootMotionDelta);
FTransform WarpTransform = RootMotionAdjust * FTransform(WarpTargetRotation, WarpTargetLocation);
Character->SetActorTransform(WarpTransform);
- Root Motion Offset을 계산해 Root Transform을 덮어쓴다.
- ⇒ 어렵지만, 이렇게 할 경우 워프 이후에도 Root Motion이 자연스럽게 이어진다.
