유니티 Delegate & Event

PTK·2025년 2월 24일
0

DelegateEvent 는 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 매니저: 게임 오버 화면 표시!");
    }
}

정리

추가)

Invoke()의 두 가지 의미

1. MonoBehaviour.Invoke("MethodName", time)

Unity에서 일정 시간이 지난 후 메서드를 실행하는 기능
예: Invoke("MyMethod", 2f); (2초 후 실행)

2. Delegate/Event의 .Invoke()

저장된 메서드를 실행하는 기능
예: myDelegate.Invoke(); (바로 실행)
Invoke() 없이도 myDelegate();처럼 실행 가능

0개의 댓글