개요
게임을 개발하다 보면 기본적인 동작은 동일한데 외형만 변경되는 경우가 있습니다. 각각 Animator Controller를 생성해서 관리할 수도 있지만 종류가 많아지면 관리하기 너무 힘들게 됩니다. 이럴 때 Animator Override Controller 를 사용해서 하나의 Animator Controller 만 적용하도록 할 수 있습니다.
Animator Override Controller
Animator Override Controller 의 설명은 다음 주소에서 확인하실 수 있습니다. 핵심은 Animator Controller를 하나만 사용할 수 있다는 것 입니다.
https://docs.unity3d.com/kr/2020.3/Manual/AnimatorOverrideController.html
대략적인 설명과 예시를 보여주고 있는데 필자의 입장에서는 딱 와 닿지 않았습니다. 실제 예를 살펴보면서 알아보도록 하겠습니다.
게임 내 적 우주선 예시
적 우주선은 플레이어의 탄환을 맞으면 폭발하는 공통적인 특징을 가지고 있습니다. 적 우주선의 Animator Controller의 상태를 를 간단히 작업하면 예시와 같은 모양이 됩니다.
Assets/Resources 에 Animator Override Controller(마우스 우측버튼 > Create > Animator Override Controller) 를 생성합니다. 생성 후 위에서 정의한 Animator Controller를 지정합니다(예시에서는 enemy 라는 이름으로 작업).
여기에서 주의할 사항은 Animator Controller의 각 상태에 Motion 이 지정되어 있어야 Explosion, Fly, Hit 같은 항목이 나타난다는 것 입니다. 이런 이름들은 Motion에 지정된 Animation Clip 을 따릅니다. 필자는 처음에 Motion을 지정하지 않아도 상태 이름으로 나타날 것으로 예상했는데 그렇지 않아서 다른 문제가 있는지 알았습니다.
Prefab을 하나 만들고 위의 Animator Controller 를 적용합니다. 작업을 완료하면 다음과 같이 됩니다. 이렇게 하면 각각의 Animator Override Controller 에 지정한 Animation Clip 이 적용되어 하나의 Animator Controller를 쓰면서 외형이 다른 애니메이션을 구현할 수 있습니다.
실행 중 상태에서 Animator Override Controller 변경하기
적 우주선의 종류가 게임이 실행되는 도중 조건에 따라 결정되는 경우가 있을 수 있습니다. 하나의 Prefab을 이용하고 Animator Controller 를 변경해서 외형을 변경하는 방법입니다. 다음의 코드와 같이 적용하면 됩니다.
var resourceName = "Animator Override Controller/Enemy0" + enemyType.ToString();
var animator = enemy.gameObject.GetComponent<Animator>();
animator.runtimeAnimatorController = (RuntimeAnimatorController)Resources.Load(resourceName);
유니티 에디터에서 Assets/Resources/Animator Override Controller 경로에 Enemy01, Enemy02 와 같은 이름으로 Animator Override Controller를 생성했습니다. 조건에 의해 enemyType이 정해지면 그것에 맞게 Animator Override Controller 가 적용되도록 했습니다.
이번글에서는 동작이 같고 외형만 변경되는 애니메이션을 쉽게 변경/관리할 수 있는 Animator Override Controller에 대해서 알아보았습니다.