메서드 참조를 포함하고 있는 영역, 대리자
선언 형식
delegate 반환형 델리게이트명(매개변수..);
델리게이트를 이용해 메서드를 매개변수로 넘겨줄 수 있다.
예시
delegate int Calculate(int a, int b);
static int Plus(int a, int b)
{
return a + b;
}
Calculate formula1 = Plus;
Calculate formula2 = delegate(int a, int b)
{
return a / b;
};
Console.WriteLine(formula1(5, 10));
Console.WriteLine(formula2(10, 5));
15
2
델리게이트 하나로 여러 개의 메서드를 한 번에 호출할 수 있다.
예시
delegate int Calculate(int a, int b);
static int Plus(int a, int b)
{
return a + b;
}
static int Minus(int a, int b)
{
return a - b;
}
Calculate formula = (Calculate)Delegate.Combine(new Calculate(Plus), new Calculate(Minus));
formula(20, 10);
30
10
객체에 특정 작업의 실행을 알리는 메세지
예 : 버튼 터치, 속성값 변경 등
이벤트는 델리게이트 모델을 기반으로 하며, 옵저버 디자인 패턴을 따른다.
예시
public event EventHandler ThresholdReached;
protected virtual void OnThresholdReached(EventArgs e)
{
EventHandler handler = ThresholdReached;
handler?.Invoke(this, e);
}
출처 - C# 강좌 19편. 델리게이트와 이벤트(Delegates and Events
C# 기초 - 이벤트와 델리게이트(Event & Delegate)
public class UIBase : MonoBehaviour
{
public virtual void OpenUI()
{
gameObject.SetActive(true);
}
public virtual void CloseUI()
{
gameObject.SetActive(false);
}
}
public enum PopupButtonType
{
CONFIRM,
CANCEL,
}
public class UI_Popup : UIBase
{
public delegate void Callback();
private Callback callbackConfirm;
private Callback callbackCancel;
[SerializeField] private TMP_Text _contentText;
[SerializeField] private Button _confirmButton;
[SerializeField] private Button _cancelButton;
private TMP_Text _confirmButtonText;
private TMP_Text _cancelButtonText;
private void Awake()
{
_confirmButton.onClick.AddListener(() => ClosePopup(PopupButtonType.CONFIRM));
_cancelButton.onClick.AddListener(() => ClosePopup(PopupButtonType.CANCEL));
_confirmButtonText = _confirmButton.GetComponentInChildren<TMP_Text>();
_cancelButtonText = _cancelButton.GetComponentInChildren<TMP_Text>();
CloseUI();
}
public void ShowPopup(string content, string confirmButtonText, string cancelButtonText, Callback ConfirmAction, Callback CancelAction)
{
_contentText.text = content;
_confirmButtonText.text = confirmButtonText;
_cancelButtonText.text = cancelButtonText;
callbackConfirm = ConfirmAction;
callbackCancel = CancelAction;
Time.timeScale = 0f;
OpenUI();
}
public void ClosePopup(PopupButtonType buttonType)
{
if (buttonType == PopupButtonType.CONFIRM) callbackConfirm?.Invoke();
else callbackCancel?.Invoke();
Time.timeScale = 1f;
CloseUI();
}
}
private UI_Popup _uiPopup;
private void Awake()
{
...
_uiPopup = UIManager.Instance.GetUIComponent<UI_Popup>();
}
private void OnTriggerEnter(Collider other)
{
// TODO "Player" Tag 추가 후 Tag 비교로 변경
if (other.gameObject.name == "Player" && !_isActive)
{
_uiPopup.ShowPopup(name, "활성화", "취소", () => SearchThisNode(), null);
}
}
마음에 드는 팝업 UI가 없어서 결국 직접 만들었다는 이야기 ..
끗!