Version: Unity 6.0 (6000.0)
언어 : 한국어
루트 모션의 작동 방식
애니메이터 컴포넌트

루트 모션 스크립팅

애니메이션이 ‘고정’으로 제공되는 경우가 있는데, 이러한 애니메이션을 씬에 배치하면 캐릭터가 움직이지 않습니다. 이는 애니메이션에 ‘루트 모션’이 포함되어 있지 않은 것입니다. 이를 위해 스크립트에서 루트 모션을 수정할 수 있습니다. 모든 요소를 결합하려면 아래 단계를 따르십시오. 단, 동일한 결과를 얻을 수 있는 배리에이션은 다양하게 있으며, 다음은 하나의 방법일 뿐입니다.

  • 고정 애니메이션을 포함하는 FBX 파일을 인스펙터에서 연 후 Animation 탭으로 이동합니다.
  • Muscle Definition 이 제어하고자 하는 아바타로 설정되어 있는지 확인합니다. 아바타의 이름을 _Dude_라 하고, 계층 구조 뷰 에 이미 추가되어 있다고 가정하겠습니다.
  • 사용 가능한 클립 중에서 애니메이션 클립을 선택합니다.
  • Loop Pose 가 올바르게 정렬되어 있는지(옆의 불빛이 초록색인지), Loop Pose 체크박스가 클릭되어 있는지 확인합니다.
  • 애니메이션의 처음과 끝이 부드럽게 정렬되어 있는지, 캐릭터가 ‘고정’ 상태로 움직이는지 확인하기 위해 애니메이션 뷰어에서 애니메이션 미리보기를 실행합니다.
  • 애니메이션 클립에 캐릭터의 속도를 제어할 커브를 생성합니다. 커브는 Animation Import 인스펙터 Curves-> + 에서 추가할 수 있습니다.
  • ‘Runspeed’ 같이 커브에 유의미한 이름을 붙입니다.
  • 새로운 Animator 컨트롤러 를 생성합니다. 여기서는 RootMotionController 로 명명하겠습니다.
  • 원하는 애니메이션 클립을 컨트롤러에 끌어놓으면, 애니메이션의 이름을 가지는 상태가 생성됩니다. 여기서는 Run 이라고 하겠습니다.
  • 커브와 동일한 이름을 가지는 파라미터를 컨트롤러에 추가합니다. 여기서는 ‘Runspeed’가 됩니다.
  • 계층 구조 에서 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_로 표시합니다.

루트 모션의 작동 방식
애니메이터 컴포넌트