유니티에서 객체의 자연스러운 동작과 행동을 플레이어에게 보여주기 위해서는 애니메이션과 애니메이터에 대해서 이해할 필요가 있다.
이번에는 유니티에서 제공하는 애니메이션과 애니메이터, 레거시 애니메이션과 메카님 애니메이션에 대해서 알아보도록 하자.
우리가 평소에는 애니메이션이라는 말을 자주 사용하지만, 유니티에서 애니메이션이라는 말 대신에 Animation Clip이라는 용어를 대신 사용한다.
특정 행동을 동작으로 표현하는 일련의 변화 과정을 프레임 별로 묶어 이를 Animation Clip으로 관리한다.
유니티에서 그렇다고 Animation을 사용하지 않는 것은 아니다. Animation은 두 가지 맥락에서 사용되는데, 첫 번째는 Animation 컴포넌트, 두 번째는 Animation 탭이다.
Animation 컴포넌트는 레거시 애니메이션을 관리할 때 사용하는 컴포넌트다. 이는 과거의 유니티 애니메이션 시스템에서 사용하던 컴포넌트로, 현 시점에서는 잘 사용하지 않는다.
Window > Animation > Animation 탭을 클릭하여 Animation Tab을 열 수 있다.
Animation Tab에서는 프레임 단위로 Animation Clip을 추가, 수정, 삭제할 수 있다.
기본적인 게임 오브젝트의 동작 표현과 인스펙터에서 편집 가능한 모든 컴포넌트를 애니메이션화하거나 프레임에 따라 임의의 값으로 변경하는 것이 가능하다.
Animator Tab은 Animation Clip을 Layer와 Parameter를 통해 특정 상태와 순서를 구성하는 탭이다.
실제 Animation Clip간의 연결은 Animator Controller가 담당하지만, Animator Controller를 이용한 Animation Clip을 연결하는 공간이 Animator Tab이다.
즉, Animator Tab이 없다면 Animator Controller가 있더라도 Animation Clip을 연결할 수 없다.
Animator 컴포넌트는 특정한 Animator Controller를 연결하여 Animator Clip을 조작할 수 있도록 해주는 컴포넌트다.
Animator 컴포넌트의 다양한 메서드와 속성들을 이용하여 스크립트 내부에서 게임 오브젝트의 애니메이션을 적절히 실행할 수 있다.
Animator Controller는 내부적으로 FSM을 사용하여 재생할 애니메이션 결정 상태도를 표현한다.
Animator 컴포넌트에 Animator Controller를 연결하여 이를 조작할 수 있다고 했는데, Animation Clip을 재생하는 방법에 대한 상태도를 이용하여 Animator가 실제 애니메이션을 재생한다.
애니메이션을 재생하기 위해서는 Animator Controller와 Animator 컴포넌트가 모두 필요하다.
Animator Controller 내부적으로 사용되는 Layer와 Parameter를 Animator Tab에서 정의하고 이를 연결할 수도 있지만, 스크립트 내부에서 이를 정의하고 사용하는 것도 가능하다.
using UnityEngine;
public class AnimeCtrl : MonoBehaviour
{
private void Start()
{
Instantiate();
}
private void Instantiate()
{
// 주어진 파일 경로로부터 Animator Controller를 로드한다.
var anime_ctrl = AnimatorController.CreateAnimatorControllerAtPath("Assets/Animations/ScriptAnime.controller);
// 첫 번째 레이어를 가져온 후,
var anime_state_machine = anime_ctrl.layers[0].stateMachine;
// sm1이라는 이름의 상태 기계를 추가하고,
var state_machine1 = anime_state_machine.AddStateMachine("sm1");
// s1, s2라는 이름의 상태를 추가하고
var state1 = anime_state_machine.AddState("s1");
var state2 = anime_state_machine.AddState("s2");
// s2에서 sm1로의 상태 전이를 추가한다.
state2.AddTransition(state_machine1);
// Animator Controller에 Test라는 Trigger 파라미터를 추가한다.
anime_ctrl.AddParameter("Test", AnimatorControllerParameterType.Trigger);
}
}
Legacy Animation은 과거의 유니티 애니메이션 시스템이다.
legacy Animation은 모델 자체에 애니메이션 클립을 저장해둔 형태로, 같은 구조를 가지지만 외형이 다를 경우 매번 애니메이션 클립을 구성해야 한다는 단점이 있다.
또한 Legacy Animation은 Animation 컴포넌트를 이용하여 게임 오브젝트에 적용된다.

위와 같이 모델이 사용할 Animation Clip들을 Animations 속성에 연결하고 스크립트를 통해 상황에 맞는 애니메이션을 실행한다.
var anime = GetComponent<Animation>();
switch(m_state)
{
case State.IDLE:
anime.CrossFade("stand", 0.1f);
break;
case State.MOVE:
anime.CrossFade("walk", 0.1f);
break;
case State.JUMP:
anime.CrossFade("jump", 0.1f, -1, 0);
break;
}
현재의 유니티 애니메이션 시스템으로, 같은 구조를 갖는 모델들은 애니메이션을 각각 구현할 필요 없이 하나의 Animation Clip을 공유할 수 있다. 이를 리타겟팅이라고 한다.
또한 이러한 Animation Clip을 Animator Controller를 통해 관리하기 때문에 더 많은 기능을 이용한 애니메이션 관리가 가능하다.