스파르타 게임개발종합반(Unity)/TIL - 본캠프 매일 공부 기록

2024.05.21 TIL - UnityAction, UnityEvent, delegate, event 차이

테크러너 2024. 5. 22.

Delegate, Event

델리게이트는 함수를 매개변수로 사용한다.

그래서 이벤트랑 세트로 다닌다.

왜냐하면!

    public void SetGoldEvent(SetGold action)
    {
        setGold += action;
        setGold.Invoke(gold);
    }

`+=`로 매개변수로 넘어온 함수를 체인으로 구독하기 때문이다.

쉽게 이해해보자면 setGold라는 이벤트가 발생할 때마다 action이 실행된다.

 

예를 들어서 플레이어가 데미지를 입을 때마다 체력이 깍이는 액션, 체력UI 반영하는 액션 등등 여러가지 일들을 처리해야한다. 그때마다 `Update`에서 확인하면 비용이 크다..

 

`Delegate`와 `Event`의 사용법은 아래와 같다.

    public delegate void SetGold(int value);
    private event SetGold setGold;

`event`는 `delegate`가 꼭 필요하다.

그래서 SetGold라는 델리게이트를 만들고 event 정의시 사용됐다.

 

 

UnityAction

그런데 유니티에서 저 기능을 간단하게 사용할 수 있게 나온 것이 있다.

그것이 바로 `UnityAction`이다.

 

매개변수가 없는 UnityAction

using UnityEngine;
using UnityEngine.Events;

public class UnityActionExample : MonoBehaviour
{
    // 매개변수가 없는 UnityAction 선언
    private UnityAction myAction;

    private void Start()
    {
        // UnityAction에 메소드 할당
        myAction = MyFunction;

        // UnityAction 호출
        myAction.Invoke();
    }

    private void MyFunction()
    {
        Debug.Log("MyFunction was called!");
    }
}

 

매개변수가 있는 UnityAction

using UnityEngine;
using UnityEngine.Events;

public class UnityActionWithParameter : MonoBehaviour
{
    // 매개변수가 있는 UnityAction 선언 (int 매개변수)
    private UnityAction<int> myActionWithParameter;

    private void Start()
    {
        // UnityAction에 메소드 할당
        myActionWithParameter = MyFunctionWithParameter;

        // UnityAction 호출
        myActionWithParameter.Invoke(10);
    }

    private void MyFunctionWithParameter(int value)
    {
        Debug.Log("MyFunctionWithParameter was called with value: " + value);
    }
}

`event delegate` 대신 `UnityAction`이 사용되는 것이다.

 

그럼 두가지 방법은 어떤 차이가 있을까?

public class MyFourParamEvent : UnityEvent<int, float, string, bool>

`UnityAction`은 보통 `UnityEvent`와 함께 쓰인다. 그런데 매개변수 인자 개수의 제한이 있다.

총 4개까지 가능하다.

그래서 매개변수 인자의 개수를 5개이상 사용하게 된다면 `delegate`와 `event`를 사용해야한다.

반응형

댓글