<--! 수학 기호 --> [Unity 3D] 애니메이션 Root Motion이 Transform값을 변경시키며 발생한 버그 해결하기

새소식

반응형
Trouble Shooting/Unity

[Unity 3D] 애니메이션 Root Motion이 Transform값을 변경시키며 발생한 버그 해결하기

  • -

 

 

1. 루트 모션(Root Motion)이란?

 

루트 모션(Root Motion)은 오브젝트의 위치와 회전을 애니메이션이 제어할 수 있도록 허용하는 것을 말합니다. 루트 모션이 활성화된 애니메이션이라면, 해당 애니메이션이 적용된 오브젝트의 트랜스폼(Transform) 값은 영향을 받아 변하게 될 겁니다.

 

루트 모션에 의해 트랜스폼이 영향을 받는 모습입니다.

 

예를 들어, 루트 모션이 적용된 걷는 애니메이션(WALK)캐릭터가 걷는 것에 따라 위치 값도 변하게 됩니다. 루트 모션이 적용되지 않았다면 캐릭터는 제자리 걸음을 하겠지요.

 

 

2. 루트 모션이 일으킬 수 있는 문제점

 

물론 스크립트 코드를 작성하여 움직임을 구현하는 것보다 애니메이션을 통해 움직임을 구현하는 것이 훨씬 더 자연스럽습니다. 특히나 시네마틱 영상을 제작하는데엔, 루트 모션이 더욱 더 현실같은 자연스러움을 주겠죠.

하지만 보통 게임을 개발할 때, 오브젝트의 움직임은 애니메이션이 아닌 스크립트 코드를 통해 제어하는 편입니다. 루트 모션은 트랜스폼 컴포넌트의 값에도 영향을 미친다고 했었죠?

 

즉, 스크립트를 통해 움직임을 제어하는 부분과 애니메이션을 통해 움직임을 제어하는 부분이 충돌하게 되어 이상한 움직임이 포착될 수 있습니다. 이외에도 여러 이상한 움직임이 포착될 수 있습니다. 제가 겪은 버그를 한 번 예로 보죠.

 

 

3. 직접 겪은 문제☢️

 

Idle 상태의 애니메이션을 적용하여 캐릭터가 가만히 있는 상태를 구현하려고 했습니다. Idle 상태는 가만히 있으면 당연히 계속 그 상태가 지속되어야 하기에 루프(Loop)로 설정해줬죠. 그런데 루트 모션이 적용된 애니메이션이어서, 캐릭터의 트랜스폼(Transform) 위치와 회전값이 애니메이션에 의해 조정되기 시작했습니다.

 

루트 모션이 높이 값에도 영향을 미쳐서 캐릭터가 무중력마냥 공중에 쓰기 시작합니다.

 

 

심지어 Rigidbody로 중력까지 가해지고 있는 상황인데도 공중에 계속 떠서 날아가는 사태가 발생했습니다. 이를 해결하는 가장 간단한 방법은 Animator 컴포넌트에서 Apply Root Motion을 비활성화하는 것입니다.

 

 

이 방법은 해당 Animator에서 제어하는 모든 애니메이션들에 루트 모션을 적용하지 않겠다는 의미가 됩니다.

하지만 애니메이션에 따라 루트 모션이 더 자연스러운 움직임을 연출하는 경우도 있기 때문에 개별적으로 루트 모션 활성화 및 비활성화를 하는 방법이 필요해 보입니다.

 

 

4. ✅[해결] 루트 모션 개별적으로 적용하기

 

애니메이션 정보에 들어가면, 여러 가지 설정값을 건드릴 수 있는 부분들이 나옵니다. 저는 아까 문제가 있었던 Idle 애니메이션을 선택하여 Inspector 창에서 확인하도록 했습니다.

 

 

 

여러 애니메이션과 관련된 정보들이 나오는데, 맨 아래에서 해당 애니메이션이 적용된 캐릭터의 시뮬레이션을 볼 수 있습니다.

 

 

 

캐릭터의 발 쪽을 살펴 보면 빨간색 화살표파란색 화살표가 보입니다.

  • 파란 화살표는 Z축 방향을 의미합니다.
  • 빨간 화살표는 몸을 기준으로 앞을 나타냅니다.

 

위 캐릭터는 파란 화살표와 빨간 화살표 방향이 일치하므로, 캐릭터의 몸이 정면을 바라보고 있다는 뜻이 됩니다. 만약 두 방향이 안 맞다면, 맞춰주는 과정이 필요하겠지요. 그럼 이제, 각 옵션들에 대해 알아보도록 하겠습니다.

 

 

애니메이션 옵션들

 

1) Root Transfrom Rotation

 

 

  • 게임 오브젝트의 회전을 애니메이션이 제어하는 것이 아니라, 기존 트랜스폼으로 유지되게 할 수 있습니다.
  • Bake Into Pose : 활성화 시, 애니메이션에 녹화된 변위값을 적용하지 않고, 트랜스폼 좌표축에 고정합니다. 즉, 게임 오브젝트가 애니메이션 클립에 의해 전혀 회전되지 않습니다.
    • 시작과 종료 시점이 비슷한 애니메이션만 사용하길 권장한다고 합니다.
    • 적절한 후보는 직진 보행 또는 달리기라고 하네요.
  • Based Upon(at Start) : 캐릭터의 중심 좌표를 설정합니다.
    • Body Orientation 선택 시, 몸을 기준으로 한 앞 방향 벡터를 따른다고 합니다.
    • 대부분의 모션(걷기, 달리기, 점프 등)에 효과적이지만, 해당 벡터와 수직이 되는 모션에 사용하면 장애가 발생한다고 하네요.
      • 이 경우에는 Offset 설정을 통해 수동으로 조절해줄 수 있습니다.
    • Original을 선택 시, 해당 애니메이션을 만들었던 사람이 설정한 중심을 유지하려 한다고 합니다.

 

 

아까 위에서 마주쳤던 버그를 보면, 회전 값도 계속 영향을 받고 있던 걸 볼 수 있습니다.

그래서 저는 이 부분에 대해 Baked Into Pose체크하고, Based Upon(at Start)Original로 주었습니다.

 

이제 Y 회전 값이 변하지 않는 것을 볼 수 있습니다.

 

 

 

2) Root Transform Position (Y)

 

 

  • 게임 오브젝트의 위치 값 중 Y 값을 애니메이션이 제어하는 것이 아니라, 기존 트랜스폼으로 유지되게 할 수 있습니다.

 

대강 비슷한 맥락이니까 설명은 생략하겠습니다. 우리가 마주쳤던 버그를 해결할 수 있는 핵심 부분입니다! 게임 오브젝트의 높이 값이 변경되어야 하는 애니메이션이라면 비활성화 해야 하지만, 지금은 그런 애니메이션이 아니므로 Bake Into Pose 활성화 해줍니다.

 

Based UponFeet로 설정하여 발이 바닥에 닿도록 해줍니다.

/* Center of Mass무게 중심 정도로만 이해하면 될 것 같다고 하네요. */

 

이제 Transform의 Y Position 값이 변하지 않는 것을 볼 수 있습니다.

 

이제 무중력인 것마냥 공중으로 날아가던 버그를 수정 완료했습니다. 이제 보니, Transform PositionXZ도 계속 변하네요. 이것도 수정해줍시다.

 

 

 

3) Root Transform Position (XY)

 

 

  • 게임 오브젝트의 위치 값 중 X와 Z 값을 애니메이션이 제어하는 것이 아니라, 기존 트랜스폼으로 유지되게 할 수 있습니다.

 

역시 Bake Into Pose체크하고, Based Upon(at Start)Original로 설정해주었습니다.

 

모든 문제를 해결하였습니다.

 

이제 더 이상 이 Idle 애니메이션은 루트 모션에 의해 제어되지 않는 것을 볼 수 있습니다.

 

 

 

 

캐릭터 사용 모델은 TRIPLE 님의 Korean Male Character입니다. 만약 문제 시, 글 삭제하겠습니다.

728x90
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.