2021.08.27 네이버 블로그 게시글을 이전해 온 게시글입니다.


Animator를 이용하여 실행시킨 애니메이션이 끝났을 때를 감지하고 Callback함수를 만들도록한다.

 

 


1) 기본 개념

StateMachineBehaviour 사용하면 애니메이션의 현재 상태를 알 수 있다

▽공식문서

https://docs.unity3d.com/Manual/StateMachineBehaviours.html

 


2) 구현

① 우선 테스트를 위한 씬으로, 큐브만 존재하는 씬을 만들었다.

큐브에 이동 애니메이션을 넣어 애니메이션이 끝나는 순간 콜백을 불러오도록 할것이다

 

 

 

 

② 큐브에 테스트 애니메이터를 추가하였다.

아무것도없는 빈 애니메이션을 Idle로두고,

실제 실행할 애니메이션을 연결하여

StartAnim트리거가 발동하면 실행시키도록 해둔다

 

 

 

③ Animation StateMachineBehavior 작성

스크립트 파일을 새로 만들어 StateMachineBehaviour 을 상속하도록 한다

 

 

 

StateMachineBehaviour 을 상속하게되면 OnStateEnter와 OnStateExit를 사용할 수 있다

OnStateEnter : 애니메이터에서 해당 애니메이션 state에 들어옴

OnStateExit : 애니메이터에서 해당 애니메이션 state에서 나감(이때 콜백을 불러올 예정)

④ 작성한 Animation StateMachineBehavior를 애니메이터에 연결

 

 

애니메이터의 콜백을 넣을 애니메이션을 클릭하면, AddBehavior를 이용해 만들어둔 Animation StateMachineBehavior을 추가할 수 있다

⑤ 실제 작동시킬 스크립트 작성

키보드 A버튼을 누를 경우, 애니메이션이 실행하도록하는 스크립트를 작성하였다

 

 

 

 

위의 스크립트에 Callback용 코드를 추가해준다.

GetBehaviour<TestAnimationBehavior>() 를 이용하여 작성했던 StateMachineBehavior에 접근할 수 있다.

앞서 작성했던 SetCallback() 함수에 콜백할 함수를 넣어 콜백함수를 연결시킨다.

⑥ 큐브에는 애니메이터와 실제 작동할 스크립트만 존재한다

 

 


3) 구동결과

 

애니메이션이 끝남과 동시에 Callback함수가 불려오는것을 확인할 수 있다.

 


4) 소스코드

- [TestAnimationBehavior.cs] 애니메이터에 들어갈 animatoionBehavior

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestAnimationBehavior : StateMachineBehaviour
{
    public delegate void AnimationCallback();
    private AnimationCallback _callback;

    /// <summary>
    /// Callback설정
    /// </summary>
    public void SetCallback(AnimationCallback callback)
    {
        _callback = callback;
    }
    public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
    }
    public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        //Callback이 설정되어있다면 불러온다
        _callback?.Invoke();

        //콜백을 삭제해준다
        _callback -= _callback;
    }
}

 

 

- TestAnimation.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestAnimation : MonoBehaviour
{
    private Animator _animator;
    // Start is called before the first frame update
    void Start()
    {
        _animator = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        if(Input.GetKeyDown(KeyCode.A))
        {
            _animator.SetTrigger("StartAnim");
            _animator.GetBehaviour<TestAnimationBehavior>().SetCallback(CallbackMethod);
        }
    }

    /// <summary>
    /// 애니가 끝나고 불러올 함수
    /// </summary>
    public void CallbackMethod()
    {
        Debug.Log("애니메이션이 끝났습니다");
    }
}

 

 

+ Recent posts