UnityEvent는 Unity의 UnityEngine.Events 네임스페이스에 있는 클래스들로, 에디터 인스펙터에서 콜백(리스너)을 연결할 수 있게 해 주는 일종의 “시리얼라이즈 가능한 델리게이트”.
버튼 클릭, 트리거 충돌, 게임 로직 변화 등 이벤트가 발생했을 때,
Inspector에서 미리 연결해 둔 메서드를 자동으로 호출하도록 해준다.
using UnityEngine;
using UnityEngine.Events;
public class Door : MonoBehaviour
{
// 파라미터 없는 이벤트
[SerializeField] private UnityEvent onOpen;
public void Open()
{
Debug.Log("문이 열림!");
onOpen?.Invoke(); // 인스펙터에서 연결된 콜백 모두 실행
}
}
UnityEvent onOpen 필드를 SerializeField로 선언하면인스펙터가 아닌 코드로도 리스너를 추가할 수 있다.
public class DoorOpener : MonoBehaviour
{
public Door door;
void OnEnable()
{
door.onOpen.AddListener(OnDoorOpened);
}
void OnDisable()
{
door.onOpen.RemoveListener(OnDoorOpened);
}
void OnDoorOpened()
{
Debug.Log("DoorOpener: 문 열림 감지!");
}
}
AddListener로 콜백 등록RemoveListener로 해제이렇게 하면 런타임 중에도 동적으로 반응을 변경할 수 있음.
기본 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);
}
}