카테고리 없음

델리게이트(Delegate)와 인보크(Invoke)와 콜백

rxo2 2025. 3. 17. 21:00

델리게이트는 메서드를 가리키는 포인터!

특정 메서드를 저장하고 실행시킬 수 있는 기능

 

인보크는 델리게이트를 실행하는 함수!

Invoke()와 () 는 같은 의미, Invoke()를 사용하면 null 체크가 편리

 

public class ButtonEvent : MonoBehaviour
{
    // 델리게이트 선언 (버튼 클릭 시 실행될 함수 저장)
    public delegate void ButtonClickDelegate();
    public static event ButtonClickDelegate OnButtonClick;

    void Update()
    {
        // 사용자가 "E" 키를 누르면 이벤트 실행
        if (Input.GetKeyDown(KeyCode.E))
        {
            OnButtonClick?.Invoke(); // 안전하게 이벤트 실행
        }
    }
}

public class UIManager : MonoBehaviour
{
    void OnEnable()
    {
        // 이벤트에 메서드 등록
        ButtonEvent.OnButtonClick += ShowMessage;
    }

    void OnDisable()
    {
        // 이벤트에서 메서드 해제 (메모리 누수 방지)
        ButtonEvent.OnButtonClick -= ShowMessage;
    }

    void ShowMessage()
    {
        Debug.Log("버튼이 눌렸습니다!");
    }
}

 

 

델리게이트와 인보크와 콜백을 모두 활용한 코드 예시

using System;
using UnityEngine;

public class Door : MonoBehaviour
{
    // 델리게이트 선언 (문이 열릴 때 실행할 이벤트)
    public delegate void DoorOpenDelegate();
    public static event DoorOpenDelegate OnDoorOpen;

    // 문을 여는 메서드
    public void OpenDoor()
    {
        Debug.Log("문이 열렸습니다!");
        OnDoorOpen?.Invoke(); // 이벤트 실행 (등록된 콜백 함수 실행)
    }
}

public class Player : MonoBehaviour
{
    void Update()
    {
        // 플레이어가 "E" 키를 누르면 문을 연다
        if (Input.GetKeyDown(KeyCode.E))
        {
            Debug.Log("플레이어가 문을 열려고 합니다...");
            FindObjectOfType<Door>().OpenDoor();
        }
    }
}

public class UIManager : MonoBehaviour
{
    void OnEnable()
    {
        // 문이 열릴 때 실행될 콜백 함수 등록
        Door.OnDoorOpen += ShowMessage;
    }

    void OnDisable()
    {
        // 이벤트 해제 (메모리 누수 방지)
        Door.OnDoorOpen -= ShowMessage;
    }

    void ShowMessage()
    {
        Debug.Log("UI: 문이 열렸습니다! (UI 업데이트)");
    }
}

 

이코드에서 각각의 역할은 

델리게이트 : 문이 열릴때 실행할 함수 목록을 저장

인보크 : 등록된 콜백 함수를 실행

콜백 : 문이 열릴때 실제 실행될 동작