[Unity] UnityEvent(유니티 이벤트), UnityAction(유니티 액션)

⭐ 유니티 액션과 유니티 이벤트

● Unity에서 이벤트 시스템을 구현할 때 자주 쓰이는 기능

● delegate / event 시스템을 Unity 방식으로 확장한 형태

 

 

 

UnityEvent (유니티 이벤트)


● 인스펙터에서 직접 콜백을 연결할 수 있게 만든 Unity 전용 이벤트 클래스

● UnityAction을 관리하는 이벤트 컨테이너

● 인스펙터를 통해 직관적으로 메서드 연결 가능

 

 

UnityEvent 선언

public UnityEvent unityEvent;
[SerializeField] private UnityEvent unityEvent;

● public 또는 [serializeField]로 직렬화 하면 인스펙터에서 직접 콜백 연결 가능

 

 

UnityEvent 콜백 연결 방법

 

1. 인스펙터에서 직접 연결하는 방법

● 마치 UGUI의 버튼에서 콜백을 연결하는 것 같은 구조

● 실제로 유니티의 버튼, 토글, 슬라이더 등 많은 UI가 유니티이벤트 기반

 

 

2. 코드를 통해 직접 연결하는 방법

[SerializeField] private UnityEvent unityEvent;

private void Start()
{
    unityEvent.AddListener(OnCallBack);    → OnCallBack 메서드 추가
    unityEvent.RemoveListener(OnCallBack); → OnCallBack 메서드 삭제
}

public void OnCallBack()
{
    Debug.Log("유니티 이벤트");
}

● AddListener(메서드) → 유니티이벤트에 콜백 추가

● RemoveListener(메서드) → 유니티이벤트에서 콜백 제거

 

 

 

 

UnityAction (유니티 액션)


● delegate의 일종으로 UnityEvent에 등록하기 위한 표준 타입입니다.

● 버튼에 이벤트를 연결하는 등의 경우 주로 사용합니다.

 

 

 

 

● UnityAction의 경우 버튼의 이벤트에 정상적으로 연결되지만, C#의 Action의 경우 그렇지 않습니다.

 

 

UnityAction 사용 예시

 

1. 매개변수가 없는 UnityAction

private UnityAction unityAction;

private void Start()
{
    unityAction += FirstAction;
    unityAction += SecondAction;

    unityAction?.Invoke();
}

private void FirstAction()
{
    Debug.Log("첫번째 액션!");
}

private void SecondAction()
{
    Debug.Log("두번째 액션!");
}

 

● C#의 delegate와 같이 사용하면 됩니다. 

 

 

2. 매개변수가 있는 UnityAction

private UnityAction<int, int, float, float> unityAction;

private void Start()
{
    unityAction += FirstAction;
    unityAction += SecondAction;

    unityAction?.Invoke(1, 2, 3, 4);
}

private void FirstAction(int a, int b, float c, float d)
{
    Debug.Log("첫번째 액션!");
}

private void SecondAction(int a, int b, float c, float d)
{
    Debug.Log("두번째 액션!");
}

 

● UnityAction은 매개변수를 가질 수 있지만, 4개 까지 가능합니다.

     ○ 5개 부터는 오류 발생

 

 

 

⭐ Unity 이벤트와 C#의 이벤트 시스템 중 어떤걸 사용할까?

.● Unity 이벤트는 에디터에서 직관적으로 쓸 수 있고, C# 이벤트 시스템은 성능이 약간 우세합니다.

    ○ 하지만 이 성능차는 백 만개의 이벤트를 생성한다 가정했을 때 이벤트 1개당 0.00015 밀리초 빠른 정도로

        굉장히 미세한 차이입니다. (이벤트 퍼포먼스 비교 출처: https://www.jacksondunstan.com/articles/3335)

 

● 결론은 목적성에 맞게 본인이 원하는 방법을 사용하시면 됩니다.