본문 바로가기

카테고리 없음

[Unity] 3D 캐릭터 애니메이션 완벽 가이드

들어가며

본 포스트는 유니티 3D 캐릭터 애니메이션을 다루기 위한 기본 지식과 구현을 다룬다. 우리는 먼저 3D 캐릭터 모델과 애니메이션 어셋들을 유니티에 임포트하고 셋팅하는 방법들에 대해 살펴 본 후, 예제를 통해 애니메이션들 간의 전환과 플레이 방식을 살펴 보도며 이번 포스트를 마무리 하도록 하겠다.

3D 캐릭터 리소스 구하기

3D 캐릭터 애니메이션을 위해 가장 먼저 필요한 것은 휴머노이드, 즉 인간형 형태로 제작된 캐릭터 모델과 그 모델을 움직이는 애니메이션이다. 여러분이 이미 적당한 모델을 가지고 있다면 그것을 사용하면 되겠지만, 만일 그렇지 않다면 https://www.mixamo.com/ 에서 적당한 캐릭터 모델과 애니메이션을 다운 받을 수 있다.

mixmo.com

여러분이 mixamo를 사용하기로 결정했다면, 간단히 계정을 생성 후 캐릭터 탭으로 이동하면 아래와 같은 화면을 볼 수 있을 것이다.

다음 순서에 따라 원하는 캐릭터를 선택하고 다운로드한다.

  1. 캐릭터 선택.
  2. 좌측 상단의 '다운로드'를 클릭한다.
  3. 다운로드를 클릭하면 모델 파일의 포맷과 포즈를 선택 할 수 있는 팝업이 뜬다. 'FBX for Unity(.fbx)'와 'T-pose'를 선택한다.
  4. 마지막으로 팝업의 '다운로드'를 선택하면 확장자가 .fbx인 모델 파일을 다운 받을 수 있다.

다음으로 모델에 적용될 애니메이션들을 다운 받아 보자. 화면 좌측 상단의 '캐릭터 탭' 옆에 있는 '애니메이션 탭'을 선택한다. 필자는 기본 애니메이션으로 사용될 'Idle'과 이동과 공격 애니메션을을 위해 'Walking', 'Standing Melee'를 다운 받았다.

  1. 애니메이션 선택.
  2. 좌측 상단의 '다운로드'를 클릭한다.
  3. 다운로드를 클릭하면 애니메이션 파일의 포멧과 스킨을 결정 할 수 있는 팝업이 뜬다. 포멧은 'FBX for Unity(.fbx)'를 선택하고, Skin은 'Without Skin'을 선택한다.
  4. 마지막으로 팝업의 '다운로드'를 선택하면 확장자가 fbx인 애니메이션이 포함된 파일을 다운 받을 수 있다.

이렇게 캐릭터 모델과 애니메이션 리소스를 얻었다.다운 받은 필자의 다운로드 폴더의 파일 목록은 아래와 같다.


fbx 란?

fbx 파일은 3D 모델과 애니메이션 데이터를 저장하는 파일 형식이다. 주로 영화, 게임, VFX 등 복잡한 3D 모델링과 애니메이션이 필요한 분야에서 널리 사용된다.
fbx는 3D 장면 전체를 위한 데이터를 저장하며, 카메라, 조명, 기하학, 애니메이션에 필요한 골격 데이터 등을 포함하며 Unity는 여러 3D 모델링 어플리케이션에서 익스포트한 fbx 파일을 임포트하여 사용할 수 있도록 지원한다.

Unity 임포트(import)

이번 섹션에서는 앞에서 다운 받은 fbx 파일을 유니티에서 임포트하는 방법에 대해 살펴 보겠다. 유니티에서 모델 파일을 임포트하는 방법은 매우 간단하다. 단순히 파일들을 유니티 프로젝트 창으로 드래그 & 드롭하면 끝이다.

먼저 유니티를 실행하고 방금 받은 파일들을 복사할 폴더를 하나 만들자. 필자는 3DCharacterAnimation이라는 폴더를 생성 했다. 그리고 앞서 준비했던 fbx 파일들을 해당 폴더로 드래그하면 아래와 같은 상태를 볼 수 있을 것이다.

Animation Type 설정

.fbx 파일들을 유니티로 임포트한 후 가장 먼저 해줘야 할 일은 3D 모델을 휴머노이드 타입으로 설정하는 것이다. 아래 그림과 같이 'Project 윈도우에서 캐릭터 오브젝트(Maria WProp J J Ong) 선택 > Inspector 윈도우에서 Rig 선택 > Animation Type에서 Humanoid를 선택 후 Apply 버튼을 클릭' 한다.

이렇게 설정이 완료된 모델을 Hierarchy 윈도우로 드래그 해서 올려 놓으면 아래와 같이 T-pose 형태로 서있는 캐릭터를 씬 뷰나, 게임 뷰에서 모델을 확인 할 수 있다. (만일 캐릭터가 아래 이미지 처럼 보이지 않는다면 Scene 윈도우에서 캐릭터를 찾아 보거나 카메라의  위치나 Field of View를 조절해 보도록 한다)

Animator Controller 추가

캐릭터 추가 과정까지 완료 했다면 Hierachy 윈도우에서 추가된 캐릭터 오브젝트를 선택한다. Inspector 윈도우에서 Animator 컴포넌트가 추가 되어 있는 것을 확인 할 수 있다. 우리는 이 Animator 컴포넌트를 이용해 애니메이션에 접근하고 관리하게 된다.

위의 이미지를 보면 Animator 컴포넌트의 Controller 필드가 비어있는 것을 볼 수 있다. 아래 그림 처럼 프로젝트 윈도우에서 '우 클릭 > Create > Animation > Animation Controller'를 추가한다.

애니메이션 컨트롤러의 이름을 AnimatorController라고 변경했다. 이 애니메이터 컨트롤러를 앞에서 비어 있던 캐릭터 모델의 Controller 필드에 드래그 한다. 

Apply Root Motion

Apply Root Motion 옵션은 애니메이션에 포함 되어 있는 캐릭터 위치 이동의 적용 여부를 결정한다. 만일 애니메이션 자체에 캐릭터 이동이 포함되어 있는 경우, 애니메이션이 재생과 함께 캐릭터 위치가 자동으로 변경 된다. 하지만 애니메이션의 재생과 캐릭터 위치 변경을 분리해야 하는 경우가 필요한 경우, 예를 들어, 캐릭터의 위치를 스크립트에서 조절해야 하는 경우엔 Apply Root Motion을 비활성화 시켜 애니메이션 자체에 포함된 위치 이동을 적용하지 않을 수 있다.

애니메이션 설정

앞선 섹션에서 모델에 대한 기본 설정은 완료 되었으니, 이제 애니메이션에 대한 설정을 하도록 하겠다.

애니메이션 파일들을 모두 선택하고 Animation Type을 Humanoid로 변경한다. 그리고 앞의 캐릭터 모델과는 다르게 Avatar Definition을 'Create From This Model'이 아닌 'Copy From Other Avatar'로 설정한다.

다른 아바타로 부터 복사 한다고 했으니 원본(Source)이 될 아바타의 지정이 필요하다.

앞 섹션에서 캐릭터 모델을 다룰 때 Avata Defeinition을 기본 값인 'Create From This Model'로 설정했기 때문에 아래 그림 처럼 캐릭터 모델을 확장해 보면 아바타가 생성되어 있음을 볼 수 있다. 이 아바타를 드래그하여 Source 아바타로 사용할 수 있도록 지정한다.

마지막으로 Apply버튼을 클릭하여 작업을 완료 한다.

애니메이션 등록

지금 까지 캐릭터 모델과 애니메이션 파일을 유니티로 임포트하고 설정하는 기본적인 준비는 끝났다. 이제는 애니메이션들을 Animator에 등록하고 상황에 따라 적절한 애니메이션 플레이 하는 방법에 대해 살펴 보겠다.

먼저 Animator에 등록된 Controller를 더블 클릭하면 Animator 윈도우가 뜬다. Animator 윈도우에서는 애니메이션을 등록하고 어떤 상황에서 어떤 애니메이션이 얼마나 오래 재생 될 지를 설정하는 작업을 한다.

캐릭터 오브젝트의 Animator > Controller를 더블 클릭하면 아래 처럼 Animator 편집창이 활성화 된다.

Idle애니메이션(위 이미지에서 Maria WProp J J Ong@Idle)을 Animator 윈도우로 드래그하면 위 그림과 같이 Idle 애니메이션 상태 노드가 생성 된다.

아무것도 없는 기본 상태에서 애니메이션을 추가하면 자동으로 Entry와 연결 되어 플레이가 시작 됨과 동시에 자동으로 재생되기 시작한다.

애니메이션 상태 노드를 클릭하면 인스펙터 창에서 상태 이름을 지정하거나 해당 상태에서 플레이할 애니메이션 모션을 지정할 수 있다. 이제 유니티의 플레이 버튼을 눌러 게임이 시작되면 플레이어의 idle 애니메이션이 '한 번' 재생되는 것을 확인할 수 있다.

우리가 원하는것은 단순 idle 애니메이션 재생 한번이 아니라, 기본적으로 idle 애니메이션이 재생하다가, 상태 변화(예를 들어 유저 입력)에 따라 다른 애니메이션을 출력할 수 있는 캐릭터를 원한다.

먼저 한번만 플레이되고 멈추는 애니메이션을 손 보자.

애니메이션 인스펙터를 확인하면 Animation 탭에서 Loop Time이라는 항목을 확인할 수 있다. Loop Time은 애니메이션의 반복 여부를 설정하는 필드다. Idle 애니메이션의 경우 별다른 이벤트가 발생하지 않는한 계속 반복 되는 것이 자연스러우므로 Loop Time을 체크하여 활성화 시키도록 한다 그리고 꼭 Apply 버튼을 눌러 변경 사항을 적용하도록 하자.

다른 애니메이션들도 Idle 애니메이션과 같이 Animator 윈도우로 드래그하여 등록한다. 아래 이미지에서는 'Walking'과 'Standing Melee Combo Attack Ver_3'이라는 애니메이션이 추가 되었다.

이제 Idle 애니메이션으로 부터 다른 애니메이션으로 전환 될 수 있다는 것을 유니티에게 알려줘야 한다. 방법은 간단하다 시작 애니메이션을 우클릭하여 'Make Transition'을 선택하고 변환 될 애니메이션으로 드래그해주면 된다.

위 예제에서는 Idle 상태에서 Walking으로 넘어갈 수 있고, 반대로 Walking 애니메이션이 종료 되면 다시 Idle로 돌아올 수 있도록 양방향으로 Transition 화살표를 생성 했다. 'Standing Melee Attack' 도 마찬가지로 양방향으로 Transition을 설정 한다.

다시 한번 유니티 플레이 버튼을 클릭하여 게임을 실행해보자. 우리는 아무런 입력을 하지 않았는데 캐릭터의 Idle 애니메이션 플레이가 완료 되면 갑자기 걷기 애니메이션(설정에 따라 공격 애니메이션일 수도 있다)으로 전환 되었다가 다시 idle 애니메이션으로 돌아오는 오는 것을 볼 수 있다.

이것은 애니메이션 트랜지션을 생성하면 기본 값으로 'Has Exit Time'이 true로 설정 되기 때문이다. 'Has Exit Time' 필드는 애니메이션 재생이 끝나면 다음 상태로 자동으로 넘어가도록 하는 플래그다. 공격이나 걷기 애니메이션 같은 경우와 달리 Idle 애니메이션은 캐릭터의 상태 변화가 없다면 계속 플레이 되어야 하므로 'Has Exit Time'은 비활성화 시키도록 한다(대신 우리는 Trigger라는 것을 추가할 것이다. 이에 대한 자세한 내용은 본 포스트의 마지막 부분에 다루어진다)

위 이미지는 Idle 애니메이션에서 다른 애니메이션으로 향하는 모든 Transition 화살표에서 'Has Exit Time'을 비활성화 시킨것을 보여주고 있다. 이렇게 되면 유니티가 보기에는 다른 애니메이션 상태로 전환될 수 없는 상태이므로 아래처럼 경고 메시지를 출력하지만 일단 걱정말고 무시하도록 한다. 이에 대한 자세한 내용은 포스트의 뒷 부분에서 다루어진다.

애니메이션 Transition

이번 섹션에서는 스크립트를 이용해 유저 입력에 따른 적절한 애니메이션을 출력하는 방법에 대해 알아 보도록 하겠다.

먼저 해줘야 할 일은 애니메이션 스크립트에서 호출 할 수 있는 애니메이션의 상태 파라메터들을 추가하는 것이다. Animator 창 좌측 상단을 보자. 좌측 상단의 Parameters 탭에서 스크립트를 통해 호출할 수 있는 파라메터들을 추가할 수 있다.

Parameters 탭에서 '+' 버튼을 클릭하면 Float, Int, Bool, Trigger 처럼 상태 파라메터의 타입을 선택할 수 있는 팝업이 뜬다. 이번 예제에서는 Trigger 타입을 선택하고, 아래와 같이 'Walk'와 'Attack' 파라메터를 추가 했다.

이전 섹션에서 Idle 애니메이션에서 다른 애니메이션으로 전환 되는 Transition의 Has Exit Time을 비활성화 시켰던것이 기억나는가? Trigger는 이전 섹션에서 언급 되었던 Has Exit Time을 대신하여 스크립트에서 Trigger를 호출하면 Trigger가 지정된 Transition(애니메이션 전환)이 발생한다.

Idle에서 다른 상태로 넘어가는 Transition 화살표를 클릭 후 위 그림에 보이는 것 처럼 Condition에서 '+' 버튼을 클릭하여 앞서 생성했던 Walk, Attack들을 각각 설정해 준다.

이로써 캐릭터는 평소에는 Idle 애니메이션을 무한 반복 재생하다 스크립트에서 'Walk' 또는 'Attack' Trigger가 발동하면 각각의 애니메이션으로 전환되어 재생 된다.

각각의 애니메이션에서 다시 Idle로 향하는 Transition에는 Has Exit Time 옵션이 활성화 되어 있으므로, 각 애니메이션(Walk, Attack)이 종료되면 다시 Idle 애니메이션으로 전환 되어 플레이 된다.

스크립트

이제 스크립트에서 유저 입력을 받아 Walk와 Attack Trigger를 활성화 해줄 차례다.

CharacterController 라는 간단한 스크립트를 추가했다. 스크립트는 Start에서 오브젝트로 부터 Animator 컴포넌트를 찾아 저장하고, 유저의 입력이 발생하면 Animator를 이용해 입력에 따른 특정 애니메이션 트리거를 활성화 한다.

아래 스크립트 예에서는 유저가 번호 1번을 누르면 'Walk' 트리거를, 2번을 누르면 'Attack' 트리거를 활성화 시킨다.

using UnityEngine;

public class CharacterController : MonoBehaviour
{
    Animator animator;
    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {
        animator = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        if(true == Input.GetKeyDown(KeyCode.Alpha1))
        {
            animator.SetTrigger("Walk");
        }

        if(true == Input.GetKeyDown(KeyCode.Alpha2))
        {
            animator.SetTrigger("Attack");
        }
    }
}

 

마치며

지금까지 유니티 3D 캐릭터 애니메이션에 대해 정말 기본적인 사항들을 살펴 보았다.

정리하면 :

  • fbx를 임포트 한 후 Rig > Animation TypeHumanoid로 설정한다.
  • 캐릭터 모델 fbx인 경우 Avatar Definition'Create From This Model'로 설정한다.
  • 애니메이션 fbx인 경우 Avatar Definition'Copy From Other Avatar'로 설정한다.
  • Animation Controller를 생성하고 Animator 컴포넌트에 등록한다.
  • Animator 윈도우에서 애니메이션들을 등록하고 Trasition을 생성한다.
  • 애니메이션 Transition을 위해 Trigger를 생성하고 스크립트에서 조건에 따라 Trigger를 호출한다.

정도로 요약 된다.

 

 

부록 1. 같이 보면 좋은 글

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!