센로그

[Unity] UnityEvent (유니티 이벤트) 본문

게임/Unity, C#

[Unity] UnityEvent (유니티 이벤트)

seeyoun 2023. 7. 3. 17:09

◆ UnityEvent

게임에서는 콜백이 필요한 경우가 많다.

 

예를들어 플레이어가 죽으면, 

  • 죽었다는 문구 출력
  • health 초기화
  • scene 재시작

이러한 콜백들을 실행하도록 할 수 있다.

 

 

Unity 에는 에디터(인스펙터)에서 Callback을 지정할 수 있도록 하는 UnityEvent라는 시스템이 존재한다.

물론 코드로도 지정 가능하다.

 

 

< 준비물 >

  • Monobehaviour 상속 필요
  • using UnityEngine.Events;

 

+) 유니티 docs : https://docs.unity3d.com/kr/2018.2/Manual/UnityEvents.html

 


◆ UnityEvent - 에디터 사용

UnityEvent에는 void형 메서드(UnityAction 타입)를 바인딩할 수 있다. 

※ UnityAction 타입은 입력 파라미터가 없고 리턴타입을 void로 하는 함수의 델리게이트이다.(정의: public delegate void UnityAction();)

 

 

■ 적용

EventsScript에 Hello를 출력하는 void HelloEvent()와, Hi를 출력하는 void HiEvent() 함수가 있다.

이들을 담을 유니티 이벤트인 myEvent를 정의한다.

public class EventsScript : MonoBehaviour
{
    public UnityEvent myEvent;

   
    public void HelloEvent()
    {
        Debug.Log("Hello");
    }

    public void HiEvent()
    {
        Debug.Log("Hi");
    }

}

 

다음과 같이 Object의 인스펙터창에서 EventScript 컴포넌트를 추가한다.

+버튼을 누르고, HelloEvent()와 HiEvent()를 myEvent의 콜백으로 넣는다.

 

이제 myEvent 이벤트를 호출하는 함수 StartMyEvent()를 만든다.

public class EventsScript : MonoBehaviour
{
    public void StartMyEvent()
    {
        myEvent.Invoke();
    }
}

위와 같이 UnityEvent.Invoke()를 호출하면 이벤트에 바인딩된 함수들이 호출된다.

만약 위 코드에서 외부에서 StartMyEvent() 함수를 호출한다면, myEvent 이벤트에 연결된 모든 함수들이 호출되는 것이다.

 

 

ex)

예를들어 다음과 같이 버튼을 클릭하면 StartMyEvent() 함수를 호출하도록 할 수 있다.

 

실행 후 RunMyEvent 버튼을 누르면, myEventObject의 myEvent 이벤트에 연결된 모든 함수들이 실행된다.

 


◆ UnityEvent - 코드 사용

UnityEvent에는 다음 메서드들이 존재한다.

 

public void AddListener(UnityAction call);

UnityEvent.AddListener(UnityAction)을 하면 UnityAction형 함수가 바인딩된다.

※ UnityAction 타입은 입력 파라미터가 없고 리턴타입을 void로 하는 함수의 델리게이트이다.(정의: public delegate void UnityAction();)

 

public void Invoke();

UnityEvent.Invoke()를 호출하면 이벤트에 바인딩된 함수들이 호출된다.

 

public void RemoveListener(UnityAction call);

UnityEvent.RemoveListener(UnityAction)을 하면 UnityAction형 함수가 바인딩 해제된다.

 

 

■ 적용

이전과 같은 HelloEvent(), HiEvent()를 코드상에서 myEvent 이벤트에 추가한다고 해보자.

다음과 같이 추가하고 실행할 수 있다.

 

public class EventsScript : MonoBehaviour
{
    public UnityEvent myEvent;

    public void Start(){
        myEvent.AddListener(HelloEvent);
        myEvent.AddListener(HiEvent);
    }
    
    public void HelloEvent()
    {
        Debug.Log("Hello");
    }

    public void HiEvent()
    {
        Debug.Log("Hi");
    }

    public void StartMyEvent()
    {
        myEvent.Invoke();
    }

}

 

만약 위 코드에서 외부에서 StartMyEvent() 함수를 호출한다면, myEvent 이벤트에 연결된 모든 함수들(HelloEvent(), HiEvent())이 호출되는 것이다.

 

※ 만약 StartMyEvent()에 AddListener을 넣는다면, StartMyEvent가 호출될 때마다 myEvent에 함수가 하나씩 바인딩된다.

따라서 함수 바인딩 부분과 이벤트 실행 부분을 분리해야 한다.

 

 

 

Comments