[Unity] 애니메이션 이벤트 함수 설정 및 애니메이션 커스터마이징 팁

728x90

유니티 애니메이션 실행 오류

유니티에서 애니메이션을 실행하다보면 몇가지 문제가 발생한다. 가장 대표적으로 Enemy가 Player를 공격하는 애니메이션이 실행되고, 피격 시 데미지UI(빨강) 코루틴이 반복 실행되는 상황에서 정확한 피격 타이밍과 코루틴 함수 호출 시점이 다를 수 있다. 다시 말해, Enemy가 발차기 모션을 실행하기도 전에 피격UI 코루틴이 엇박자 타이밍으로 실행되는 것이다.

우리는 정확하 발차기가 실행되었을 때 UI 코루틴을 실행해야 어색하지 않은 애니메이션 동작 상황이 완성될 것이다.

이런 경우, 애니메이션 실행 key frame에서 event 함수를 호출해줌으로서 문제를 해결할 수 있는데 다음 2가지 방법을 주로 사용한다.

 

원본 애니메이션 데이터를 활용하여 오류 해결하기

애니메이션 원본 데이터를 가지고 와 Animation 탭의 하단 부분을 확인해보면 다음 애니메이터 편집 프로퍼티를 확인할 수 있다. 여기서 우리는 Events 항목을 수정해주려고 한다.

발차기 동작에서 정확히 발을 쭉 뻗는 모션은 19 Frame, 약 0.4초 쯤에 실행된다. 이 지점에서 Add Key frame을 해서 key를 생성해 주면 된다. 그리고 Function에 OnAttack이라는 함수를 선언해주었고 EnemyEventClass 스크립트를 작성해 Object에 연결해 준 뒤 Apply 해주면 된다.

public class EnemyEventClass : MonoBehaviour
{
    void OnAttack()
    {
        // Player의 hp를 줄여주자
        PlayerHealth.Instance.HP--;
    }
}

EnemyEventClass 함수에서는 PlayerHealth의 HP를 감소시키는 OnAttack을 선언해주기만 하면 된다.

Apply 해준 애니메이션 클립은 Animator Controller에 가져와 Transition의 Conditions 값을 Trigger 타입으로 설정한 후 애니메이션 동작 스크립트에서 SetTrigger로 호출해주면 되겠다. 그러면 원하는 타이밍에 이벤트(체력 감소, 데미지 UI 호출)를 생성해 줄 수 있을 것이다.

 

복사본 애니메이션 데이터를 활용하여 오류 해결하기

원본 데이터를 따로 수정하지 않고 애니메이션 이벤트를 적용하는 방법은 똑같은 애니메이션 클립을 복제해서 사용하면 된다. 원본 애니메이션은 키 프레임이 이미 다음과 같이 복잡하게 잡혀 있고 이를 수정할 수 없다. 원본 데이터는 ReadOnly로 고정되어 있어 수정 및 변환이 불가하기 때문에 이를 복제를 해서 수정할 수 있는 상태로 전환해주어야 한다. 그러면 아래와 같이 ReadOnly가 해제된 독립적인 애니메이션 클립을 생성할 수 있고 마찬가지로 원하는 시점에 Add KeyFrame을 잡아주면 된다. 그리고 인스펙터 창에 똑같이 Function과 Object 값을 세팅해주면 되겠다.

 

원하는 애니메이션 커스터마이징(편집) 방법

애니메이션 클립을 찾다보면 원하는 애니메이션이 없는 경우가 있다. 가령, Enemy가 피격을 당하면 뒤로 밀려나는 KnockBack 애니메이션이 실행되도록 하고 싶은데 해당 클립이 없는 상황을 가정해보자. 이런 경우 넉백을 연출할 수 있는 유사한 애니메이션 클립을 찾아 특정 타임라인을 편집해서 가져오는 방법이 있다.

위의 애니메이션 클립은 KnockDown, 죽는 애니메이션 클립이다. 우리는 클립 초반에 몸이 뒤로 젖혀지는 부분만 따로 추출해 피격 시 넉백이 되는 애니메이션 클립으로 직접 만들어 줄 수 있다.

인스펙터 창의 knockdown 애니메이션 탭을 살펴보면 Clips에서 다음과 같이 애니메이션을 직접 만들어줄 수 있는 프로퍼티가 있다. 플러스 모양을 추가해 Damage(피격 시 넉백) 애니메이터를 생성해주고 Legth 범위 값을 원하는 만큼 제한해서 Apply 해줄 수 있다.

 Damage 애니메이터를 apply해주면 원본 KnockDown 애니메이션 클립에 Damage 애니메이터가 자식으로 들어가 있는 것을 확인할 수 있다. 해당 애니메이션 클립을 Animator Controller로 가져와 원하는 시점에 호출해주면 되겠다. 

728x90