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("애니메이션이 끝났습니다");
}
}
'UNITY' 카테고리의 다른 글
UNITY로 스와이프 메뉴 UI 만들기 -2- Canvas Swipe (1) | 2023.11.03 |
---|---|
UNITY로 스와이프 메뉴 UI 만들기 -1- Json 캐릭터 파일 생성 (0) | 2023.11.03 |
UNITY 버튼 꾹 누르기 이벤트 (0) | 2023.11.03 |
UNITY C# List clear VS new (0) | 2023.11.03 |
유니티(UNITY)로그 프로세스 만들기-파일로 추출/게임뷰에 표시 (0) | 2023.11.03 |