UnityEvent는 Unity의 UnityEngine.Events 네임스페이스에 있는 클래스들로, 에디터 인스펙터에서 콜백(리스너)을 연결할 수 있게 해 주는 일종의 “시리얼라이즈 가능한 델리게이트”.

버튼 클릭, 트리거 충돌, 게임 로직 변화 등 이벤트가 발생했을 때,

Inspector에서 미리 연결해 둔 메서드를 자동으로 호출하도록 해준다.

1. 기본 선언과 Inspector 연결

using UnityEngine;
using UnityEngine.Events;

public class Door : MonoBehaviour
{
    // 파라미터 없는 이벤트
    [SerializeField] private UnityEvent onOpen;

    public void Open()
    {
        Debug.Log("문이 열림!");
        onOpen?.Invoke();      // 인스펙터에서 연결된 콜백 모두 실행
    }
}
  1. UnityEvent onOpen 필드를 SerializeField로 선언하면
  2. 에디터의 Door 컴포넌트 Inspector에 “+” 버튼이 생긴다.
  3. 클릭해서 대상 오브젝트와 공개 메서드(예: 문 열릴 때 애니메이션 재생)를 연결할 수 있음.

2. 코드에서 리스너 추가/제거

인스펙터가 아닌 코드로도 리스너를 추가할 수 있다.

public class DoorOpener : MonoBehaviour
{
    public Door door;

    void OnEnable()
    {
        door.onOpen.AddListener(OnDoorOpened);
    }

    void OnDisable()
    {
        door.onOpen.RemoveListener(OnDoorOpened);
    }

    void OnDoorOpened()
    {
        Debug.Log("DoorOpener: 문 열림 감지!");
    }
}

이렇게 하면 런타임 중에도 동적으로 반응을 변경할 수 있음.


3. 파라미터 있는 UnityEvent<T>

기본 UnityEvent는 파라미터가 없지만, UnityEvent<T0>, UnityEvent<T0, T1> 처럼 제네릭 버전도 제공.

public class Health : MonoBehaviour
{
    [System.Serializable]
    public class DamageEvent : UnityEvent<int> { }

    [SerializeField] private DamageEvent onDamaged;

    public void TakeDamage(int amount)
    {
        currentHp -= amount;
        onDamaged?.Invoke(amount);
    }
}