Delegate 와 Event 는 C#에서 callback 메커니즘을 제공하는 기능이다.
Unity에서는 버튼 클릭, 플레이어가 적을 공격할 때의 반응, 게임 상태 변화 등을 처리할 때 유용하게 사용된다.
1. Delegate
Delegate는 "메서드를 저장하고 실행할 수 있는 변수" 라고 생각하면 된다.
즉, 특정한 메서드를 변수처럼 저장하고, 필요할 때 실행할 수 있다.
비유적으로 설명하면: "함수를 저장할 수 있는 주소록"
예를 들어, 스마트폰에 여러 사람의 전화번호를 저장해놓고, 필요할 때 연락하는 것과 같다.
Delegate는 "연락할 대상(함수)"을 저장하고, 특정 상황에서 그 함수를 실행하는 역할을 한다.
Delegate의 특징
메서드를 변수처럼 저장하고 나중에 실행 가능
여러 개의 메서드를 연결(+=) 또는 제거(-=) 가능
Unity에서는 버튼 클릭 이벤트, 애니메이션 완료 후 동작 실행 등에 활용 가능
using System;
using UnityEngine;
public class Enemy : MonoBehaviour
{
public delegate void OnHitDelegate(int damage); // 델리게이트 선언
public OnHitDelegate onHit; // 델리게이트 변수
public void TakeDamage(int damage)
{
Debug.Log("적이 " + damage + " 만큼의 피해를 입음!");
onHit?.Invoke(damage); // 델리게이트 실행 (null 체크 필수)
}
}
public class GameManager : MonoBehaviour
{
void Start()
{
Enemy enemy = new Enemy();
enemy.onHit += DisplayDamage; // 델리게이트에 함수 연결
enemy.TakeDamage(10); // 실행하면 DisplayDamage 함수도 호출됨
}
void DisplayDamage(int damage)
{
Debug.Log("게임 매니저: 적이 " + damage + " 만큼 피해를 입었습니다!");
}
}
2. Event
Event는 Delegate를 기반으로 동작하는데, 차이점은 "외부에서 직접 호출할 수 없고, 특정 클래스에서만 실행 가능" 하다는 점이다.
즉, 이벤트는 특정한 상황에서만 실행되도록 보호된 델리게이트 입니다.
비유적으로 설명하면: "라디오 방송국과 청취자"
방송국(이벤트를 정의한 클래스)은 특정한 방송(이벤트)을 송출한다.
청취자(구독한 메서드)는 이 방송을 듣고 반응한다.
하지만 청취자는 직접 방송을 송출할 수 없다
즉, 이벤트를 정의한 클래스(방송국)에서만 실행할 수 있고, 외부에서는 단순히 구독(Subscribe)만 가능하다.
Event의 특징
델리게이트와 유사하지만, 외부에서 직접 실행할 수 없음 (보안성 강화)
다른 클래스에서 이벤트를 구독(+=)하여 특정 상황에서 실행 가능
Unity에서는 플레이어가 죽었을 때 UI 업데이트, 적이 죽었을 때 점수 증가 등에 사용됨
using System;
using UnityEngine;
public class Player : MonoBehaviour
{
public event Action onDeath; // 이벤트 선언
public void Die()
{
Debug.Log("플레이어 사망!");
onDeath?.Invoke(); // 이벤트 실행
}
}
public class UIManager : MonoBehaviour
{
void Start()
{
Player player = new Player();
player.onDeath += ShowGameOverScreen; // 이벤트 구독
player.Die(); // 실행하면 ShowGameOverScreen도 호출됨
}
void ShowGameOverScreen()
{
Debug.Log("UI 매니저: 게임 오버 화면 표시!");
}
}
정리
추가)
1. MonoBehaviour.Invoke("MethodName", time)
Unity에서 일정 시간이 지난 후 메서드를 실행하는 기능
예: Invoke("MyMethod", 2f); (2초 후 실행)
2. Delegate/Event의 .Invoke()
저장된 메서드를 실행하는 기능
예: myDelegate.Invoke(); (바로 실행)
Invoke() 없이도 myDelegate();처럼 실행 가능