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("애니메이션이 끝났습니다");
    }
}

 

 

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


유니티 버튼의 OnClick 이벤트는 클릭했을 때(또는 눌렀을 때) 한번만 발동한다.

평범한 버튼을 클릭했을때 숫자가 올라가는 코드를 작성하였다

 

 

 

이 경우 버튼을 꾹 누르고있어도 9에서 숫자가 오르지않는것을 볼 수 있다.

이때, 버튼을 꾹 누르고있을때에도 숫자가 올라가게 하고싶다면

유니티의 버튼 대신

IPointerDownHandler, IPointerUpHandler 인터페이스를 사용해야한다.

 

 

클래스의 상속에 IPointerDownHandler, IPointerUpHandler 인터페이스를 추가한다.

각 인터페이스를 구현하고 버튼이 눌렸는지 아닌지를 확인하기위한 bool변수를 선언한다.

 

 

이제 버튼대신 이 함수만을 컴포넌트로 넣으면 꾹 눌러서 사용하는 버튼으로 사용가능하다.

 

 

 

 

 

마우스를 누르고있으면 계속하여 숫자가 오르는것을 볼 수 있다

 

 

 


코드 전문

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class ButtonTest : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
    [SerializeField]
    private Text _text;
    private int myNum = 0;

    private bool _isButtonDown = false;

    private void Update()
    {
        if(_isButtonDown)
            NumUp();
    }
    public void NumUp()
    {
        myNum++;
        _text.text = myNum.ToString();
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        _isButtonDown = true;
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        _isButtonDown = false;
    }
}

 

 

 


UnityAction기능과 합하면 버튼을 눌렀을때 불려오는 함수를 매번 바꿀수도있다.

 

2021.08.09 네이버 블로그에 게시했던 글을 이전해온 게시글입니다.

 


리스트를 Clear 할 경우와 = new List로 초기화해주는 경우의 차이점에 대해 알아보았다.

우선 테스트용 스크립트를 아래와 같이 짜보았다.

 

 

리스트를 처음에는 test1을 넣고,

clear 또는 new List를 한 후

test2를 넣어보았다.

 

 

 

Test1과 Test2의 차이는 하나는 Clear, 하나는 새로 New List를 해준 것 밖에 없다.

 

 

 

결과는 다음과 같다

clear를 한 경우는 둘 다 test2가 들어갔으며,

new List를 한 경우는 test1, test2가 들어갔다.

 

 


 

좀 더 명확하게 보기 위하여 '안녕하세요' 'Hellow World!'로 재테스트 해보았다.

 

 

 

 


이렇게 되는 원인으로는 C# 도큐먼트에서 찾을 수 있다

https://docs.microsoft.com/ko-kr/dotnet/api/system.collections.generic.list-1.clear?view=net-5.0

 

 

List.clear의 경우 다른 개체에 한 참조도 해제되므로, 미리 넣어두었던 test1도 해제되어버리는 것이다.

따라서 후에 넣은 test2가 들어가는 것.

clear가 작업시간이 더 적게 소요되므로 작업시간을 줄이려면 clear로 사용하고

참조를 지우고싶지않거나 값의 재사용이 필요할 경우는 new 를 사용하는것이 좋다

 

 

 

+ Recent posts