Animation Event 사용법

 

 

새로운 버전의 글!

 

이 버전의 글은 약간의 오류를 포함하고 있으며 이를 수정한 최신 버전의 글을 링크를 통해서 보실 수 있습니다.

 

 

개요(Overview)

게임을 제작할 때, 애니메이션이 실행되는 도중에 적절한 타이밍에 맞춰서 무언가가 실행되어야 하는 경우가 종종 발생한다. 예를 들자면 대표적으로는 캐릭터가 걷거나 뛸 때 발소리가 나거나 먼지가 일어나야 한다던지 캐릭터가 무기를 휘두를 때 맞는 타이밍에 맞춰서 데미지가 들어가야 한다던지 하는 경우가 있을 수 있다. 이러한 문제를 해결하는 하드한 방법으로는 계산해낸 타이밍에 맞춰서 해당 함수를 실행시킨다던지, 콜라이더를 원하는 위치에 붙여서 그 콜라이더가 충돌했을때 처리하는 방법이 있지만, 이러한 방법들은 매우 비효율적이다.

 

계산해낸 타이밍에 맞춰서 원하는 함수를 실행하는 방법의 경우에는 공격 속도나 이동 속도에 맞춰서 모션의 속도가 변하는 유동적인 상황에 대처하기가 매우 어렵고, 특히 콜라이더를 사용하는 방법은 겨우 발소리나 발움직임에 맞춰 먼지 이펙트를 만드는데 쓰기에는 매우 비용이 비싸다. 공격 애니메이션에 맞춰서 데미지를 주는 경우에는 무기나 데미지를 주는 부위에 콜라이더를 붙여서 사용하는 것을 고려해볼만 하지만, 이러한 방법은 주로 공격의 명중이 확정되지 않은 게임, 즉 논타겟(None-Target) 방식의 게임에 적합한 방법이며, 공격의 명중이 확정되어있는 게임의 경우에는 역시 사용하기가 곤란하다.

 

 

 

애니메이션 이벤트(Animation event)

그래서 존재하는 것이 바로 유니티의 애니메이션 이벤트(Animation event)라는 기능이다. 이 기능은 애니메이션의 실행 도중, 원하는 시점에 원하는 함수를 호출할 수 있게 해준다. 이 문장 하나만으로도 개요에서 설명한 상황에 전부 대처가 가능할 것임을 알 수 있다.

 

이 애니메이션 이벤트를 사용하는 방법은 2가지가 있는데 FBX 모델과 함께 임포트된 애니메이션에서 사용하는 방법과 애니메이션 클립(Animation clip)에서 사용하는 방법이다.

 

 

방법 1 : FBX 모델과 함께 임포트된 애니메이션에서 애니메이션 이벤트 사용하기

 

 

프로젝트 창(Project view)에서 임포트한 FBX파일을 선택하면 Inspector 창에 그 FBX파일의 정보들이 보일 것이다. 그 중에서 상단의 Animations라는 탭을 선택하면 그 FBX에 포함된 애니메이션의 정보를 볼 수 있다. 우리가 필요로 하는 애니메이션 이벤트 기능은 그 중에서 Events라는 곳 안에서 사용할 수 있다. 그 항목을 열면 다음과 같은 내용을 볼 수 있다 :

 

 

노란색으로 표시된 버튼을 누르면 다음과 같이 애니메이션이 재생되는 도중에 실행될 이벤트가 새로 생성된다 :

 

 

위의 이미지에서 파란색으로 표시된 것을 드래그하면 이 이벤트가 실행될 시점을 조절할 수 있으며 그 아래의 입력 필드의 내용들은 다음과 같다 :

 

 필드 이름 내용
 Function 이벤트 시점에 실행될 함수의 이름
 Float  함수에 float형 매개변수가 있을 때 들어갈 값
 Int  함수에 int형 매개변수가 있을 때 들어갈 값
 String  함수에 string형 매개변수가 있을 때 들어갈 값
 Object  실행할 함수가 들어있는 스크립트

 

이번 예시로는 공격 애니메이션의 타이밍에 맞춰 데미지를 주는 것으로 진행 해보겠다. 먼저 적에게 데미지를 주는 작업을 할 스크립트를 생성한다.

 

예제이기 때문에 자세한 과정에 대한 코드를 생략하고 AttackComponent 스크립트는 다음과 같은 함수를 가지고 있다.

 

using UnityEngine;

public class AttackComponent : MonoBehaviour
{
    public void AttackDamage()
    {
        // 적에게 데미지를 주는 처리
        Debug.Log("데미지 60!");
    }
}

 

공격 애니메이션에서 적에게 무기가 맞는 시점이 위의 Events 이미지에서 0:050라고 가정하자. 다음과 같이 이전에 생성한 이벤트를 0:050 지점으로 옮기고 Object에 생성한 AttackComponent 스크립트를 넣어주고 Function에는 AttackDamage 함수 이름을 입력해주면 된다.

 

 

다음과 같은 과정을 끝내고 나면 애니메이션이 실행되고 0:050 지점을 지날 때마다 유니티 에디터에서 "데미지 60!"이라는 로그가 출력될 것이다.

 

 

 

방법 2 : 애니메이션 클립에서 애니메이션 이벤트 사용하기

 

 

 

 

애니메이션 클립은 3D 모델 없이 애니메이션에 대한 정보만을 가지고 있는 것을 이야기한다. 물론 임포트한 FBX 모델 파일에서 애니메이션만 꺼내와서 사용하는 것도 가능하다. 이러한 애니메이션 클립에서 애니메이션 이벤트를 사용하는 방법은 이전에 소개한 FBX 모델에 포함된 애니메이션에서 사용하는 방법과 상당히 비슷하다.

 

프로젝트 창에서 애니메이션클립을 선택하고 애니메이션 탭을 열면 다음과 같은 화면을 볼 수 있다.(만약 애니메이션 탭이 보이지 않는다면 상단의 Windows 메뉴에서 Animation을 찾아서 열거나 Ctrl+6 단축키를 이용해서 열 수 있다)

 

 

애니메이션 탭에서도 FBX 파일 애니메이션의 이벤트에서 봤던 것과 같은 모양의 버튼을 볼 수 있는데 이것을 통해서 이벤트를 생성할 수 있고 드래그를 통해서 이벤트의 시점을 이동시킬 수도 있다.

 

 

그리고 이 이벤트를 선택하면 Inspector 창에서 다음과 같은 내용을 볼 수 있다 :

 

 

이 이후에는 방법 1에서 진행한 것과 같이 진행하면 원하는 결과를 얻을 수 있게 된다.

 

 

 

마무리...

 

이 애니메이션 이벤트를 사용할 때, 프레임이 씹힐 경우에 애니메이션 이벤트가 같이 스킵되는 경우가 발생한다는 이야기도 있다. 다른 이야기로는 이 문제는 레거시(Legacy) 애니메이션을 사용할 때 주로 발생하며, 메카님에서는 개발자의 실수로 트랜지션 구간을 잘못 설정했을 때 발생하는 문제이며 일반적으로는 발생하지 않는 문제라고도 한다. 이런 문제가 발생하면 애니메이션의 트랜지션에서 블랜드되는 과정을 잘 확인해보는 것이 우선일 것 같다.

반응형
  1. Inak 2018.07.13 14:53

    좋은 정보 감사드립니다.

  2. 유니티초보 2021.08.05 18:59

    정말 감사합니다 근데 애니메이터를 통한 이벤트를 만들고 함수를 통해 실행했는데 애니메이션에 수신기가 누락됬다고 오류가 뜨는데 이건 어떻게 해결하면 좋을까요?

+ Recent posts