[유니티 중급]_4 유니티 이벤트

0

유니티 엔진

목록 보기
15/21

유니티 이벤트(UnityEvent)

유니티 이벤트는 하나의 예로 UI기능인 버튼에 구현되어 있습니다.

노란색 체크 박스안에 On Click()이라는 부분이 보일겁니다.
이부분이 바로 유니티 이벤트로 구현된 델리게이트입니다.

+를 누르고 게임 오브젝트를 드래그&드롭하면 버튼이 눌렸을때
사용할 수 있는 함수를 등록할 수 있습니다.

이렇게 유니티에서 이벤트를 사용자가 에디터의 인스펙터뷰를 사용하여 관리할 수 있도록
만들어 놓은것이 유니티 이벤트 입니다.

(C# 이벤트를 만들어서 사용하는것이 더 빠르다는 자료가 있으니
성능이 중요할땐 직접 이벤트를 만들어 사용하면 좋을것 같습니다.)
링크

유니티 이벤트 사용하기

1. 인스펙터를 이용하여 콜백함수를 등록하기

스크립트를 하나 만들고 유니티 이벤트를 사용하기 위해 선언해줍니다.

using UnityEngine.Events;

클래스 내에 onInputSpace라는 이름으로 UnityEvent를 선언합니다.
그리고 인스펙터에 보여주기 위해 public으로 설정하겠습니다.

public class 이벤트_콜백: MonoBehaviour
{
    public UnityEvent onInputSpace;
}

유니티 에디터로 돌아가서
게임 오브젝트를 하나 만들고 스크립트를 컴포넌트로 붙여주면
인스펙터에 유니티 이벤트가 보입니다.

이곳에 실행을 맡길 함수를 등록합니다.

새로운 스크립트를 생성해서 콜백함수로 사용할 함수를 작성합니다.
간단하게 로그를 남기는 코드를 작성했습니다.

public class 구독자 : MonoBehaviour
{
    public void OnInputSapceBar()
    {
        Debug.Log("스페이스!");
    }
}

해당 스크립트를 새로운 게임 오브젝트에 부착하고 게임 오브젝트 이름을 '구독자'로 변경했습니다.

해당 게임 오브젝트를 등록하고
유니티 이벤트가 동작했을때 사용할 콜백함수를 지정했습니다.

다시 이벤트가 있는 스크립트로 돌아가서
업데이트 내에 키가 눌리면 인보크()함수를 동작하게 만듭니다.
UnityEvent.Invoke()는 이벤트에 등록되어있는 콜백함수들을 동작시키는 함수입니다.

public class 이벤트_콜백: MonoBehaviour
{
    public UnityEvent onInputSpace;

    void Start()
    {
        
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            onInputSpace.Invoke();		//등록 되어있는 콜백함수 동작!
        }
    }
}


게임을 실행하여 스페이스바를 누를때마다 유니티 이벤트가 동작하여
콜백함수를 실행하는것이 확인됩니다.

2. 스크립트를 이용하여 콜백함수 등록하기

인스펙터에서 콜백함수를 등록시키고,사용하는 방법을 알아봤습니다.

이번엔 스크립트를 이용하여 이벤트에 콜백함수를 등록하는 방법을 알아보겠습니다.


우선 유니티이벤트에 등록해놨던 콜백함수를 원래대로 되돌리고 구독자 스크립트로 돌아갑니다.

public class 구독자 : MonoBehaviour
{
    void Start()
    {
        var p = FindObjectOfType<이벤트_콜백>();
        p.onInputSpace.AddListener(OnInputSapceBar);	//이벤트 리스너 함수의 인수로 콜백함수를 넣는다.
    }

    public void OnInputSapceBar()
    {
        Debug.Log("스페이스!");
    }
}

유니티 이벤트에는 AddAddListener(), RemoveListener(), Invoke() 세 가지 함수가 있는데,
이중 AddAddListener()는 콜백함수를 등록하는데 사용하고,
RemoveListener()는 등록한 함수를 삭제하는데 사용합니다.
그리고 Invoke()는 등록된 콜백함수를 동작시키는데 사용하죠.


AddAddListener와 RemoveListener는 유니티 액션 형식을 인자로 받습니다.
(유니티 액션은 아래에서 알아보도록 하겠습니다.)


확인을 위해 에디터로 돌아와 게임을 실행하면 동일하게 동작하는것을 볼 수 있습니다.

제네릭 타입으로 매개변수 받기


유니티 이벤트는 제네릭 타입으로 최대 4개까지 매개변수를 받도록 만들 수 있습니다.

유니티 이벤트를 제네릭 타입으로 만들면 명시한 타입으로
콜백함수에 매개변수를 같은 갯수로 만들어주어야합니다.

그리고 인보크 함수에서 사용할때 인자를 넣어줍니다.


에디터로 돌아와서 인스펙터에서 콜백함수를 등록하고 사용합니다.
(AddAddListener를 사용하면 스크립트로도 등록할 수 있습니다.)

0개의 댓글