델리게이트는 메서드를 가리키는 포인터!
특정 메서드를 저장하고 실행시킬 수 있는 기능
인보크는 델리게이트를 실행하는 함수!
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 업데이트)");
}
}
이코드에서 각각의 역할은
델리게이트 : 문이 열릴때 실행할 함수 목록을 저장
인보크 : 등록된 콜백 함수를 실행
콜백 : 문이 열릴때 실제 실행될 동작