Version: 2017.1
루트 모션 - 작동 방식
블렌드 트리

튜토리얼: 고정 휴머노이드 애니메이션의 루트 모션 스크립팅

가끔 애니메이션이 “고정” 상태인 경우가 있는데, 이는 애니메이션을 씬에 넣더라도 부착된 캐릭터가 이동하지 않는다는 의미입니다. 즉 애니메이션이 “루트 모션”을 포함하지 않습니다. 이렇게 하려면 스크립트에서 루트 모션을 수정하면 됩니다. 아래에 설명된 단계를 수행하면 됩니다. 다만, 아래에서 설명된 방법 외에도 다른 방법으로도 같은 결과를 얻을 수 있습니다.

  • 고정 애니메이션을 포함하는 FBX 파일을 인스펙터에서 연 후, Animation 탭으로 이동합니다.
  • Muscle Definition 이 제어하고자 하는 아바타로 설정되어 있는지 확인합니다. 아바타의 이름을 Dude 라 하고, Hierarchy View 에 이미 추가되어 있다고 가정하겠습니다.
  • 사용 가능한 클립 중에서 애니메이션 클립을 선택합니다.
  • Loop Pose 가 올바르게 정렬되어 있는지(옆의 램프가 초록색인지), Loop Pose 체크박스가 클릭되어 있는지 확인합니다.
  • 애니메이션의 처음과 끝이 부드럽게 정렬되어 있는지, 캐릭터가 “고정” 상태로 움직이는지 확인하기 위해 애니메이션 뷰어에서 애니메이션 미리보기를 실행합니다.
  • 애니메이션 클립에 캐릭터의 속도를 제어할 커브를 생성합니다. 커브는 Animation Import inspector Curves-> + 에서 추가할 수 있습니다.
  • “Runspeed”와 같이 커브에 유의미한 이름을 붙입니다.
  • 새로운 Animator Controller 를 생성합니다. 여기서는 RootMotionController 로 명명하겠습니다.
  • 원하는 애니메이션 클립을 컨트롤러에 끌어놓으면, 애니메이션의 이름을 가지는 상태가 생성됩니다. 여기서는 Run 이라고 하겠습니다.
  • 커브와 동일한 이름을 가지는 파라미터를 컨트롤러에 추가합니다. 여기서는 “Runspeed”가 됩니다.
  • Hierarchy 에서 Dude 캐릭터를 선택합니다. 인스펙터에는 이미 Animator 컴포넌트가 있을 것입니다.
  • 애니메이터 Controller 프로퍼티 위로 RootMotionController 를 드래그합니다.
  • 플레이를 누르면, “Dude”가 제자리에서 뛰는 것을 볼 수 있습니다.

마지막으로, 모션을 제어하려면 OnAnimatorMove를 구현하는 RootMotionScript.cs 스크립트를 생성해야 합니다.

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(Animator))]
    
public class RootMotionScript : MonoBehaviour {
            
    void OnAnimatorMove()
    {
            Animator animator = GetComponent<Animator>(); 
                              
            if (animator)
            {
     Vector3 newPosition = transform.position;
               newPosition.z += animator.GetFloat("Runspeed") * Time.deltaTime; 
     transform.position = newPosition;
            }
    }
}


RootMotionScript.cs를 “Dude” 오브젝트에 연결해야 합니다. 이제 Animator 컴포넌트는 OnAnimatorMove 함수가 있는 스크립트를 감지하여 Apply Root Motion 프로퍼티를 Handled by Script 로 표시합니다.

루트 모션 - 작동 방식
블렌드 트리