Unity 내일배움캠프 TIL 1016 | 델리게이트(Delegate)를 이용한 UI Popup 만들기

PikminProtectionAssociation·2023년 10월 16일
0

Unity 내일배움캠프

목록 보기
56/89
post-thumbnail

💡 델리게이트(Delegate)

🍞 델리게이트란?

  • 메서드 참조를 포함하고 있는 영역, 대리자

  • 선언 형식

    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 Chain)

  • 델리게이트 하나로 여러 개의 메서드를 한 번에 호출할 수 있다.

  • 예시

    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

🥨 이벤트(Event)

  • 객체에 특정 작업의 실행을 알리는 메세지
    예 : 버튼 터치, 속성값 변경 등

  • 이벤트는 델리게이트 모델을 기반으로 하며, 옵저버 디자인 패턴을 따른다.

  • 예시

    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)



💡 델리게이트를 이용한 UI Popup

🥯 UI Base

  • 저번 개인 프로젝트에서와 같이 전체 UI 컴포넌트들의 부모가 되는 부모 클래스를 만들었다.
  • UI를 열거나 닫는 공통된 동작을 정의한다.
public class UIBase : MonoBehaviour
{
    public virtual void OpenUI()
    {
        gameObject.SetActive(true);
    }

    public virtual void CloseUI()
    {
        gameObject.SetActive(false);
    }
}

🥞 UI_Popup

  • delegate를 활용하여 재사용 가능한 UI Popup을 구현했다.
  • PopupButtonType은 팝업의 버튼 속성이다. (확인 또는 취소)
  • SerializeField로 팝업 내용을 보여줄 텍스트 오브젝트와 확인 및 취소 버튼 오브젝트를 받는다.
  • Awake에서는 두 버튼에 리스너를 달아준다.
    이때, 버튼의 속성을 ClosePopup 함수에 전달해준다.
  • ShowPopup에서는 매개변수로 Callback 함수를 받아온다.
    또한, 팝업을 열었을 때 게임 진행을 멈추기 위해 timeScale 값을 0으로 설정한다.
  • ClosePopup에서는 버튼 타입에 따라 Confirm 혹은 Cancel Callback 함수를 실행한다.
    팝업을 닫기 전 timeScale 값을 1로 다시 바꿔준다.
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();
    }
}

🧇 사용

  • 위에서 만든 UI는 노드와 상호작용을 할 때 보여지게 된다.
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가 없어서 결국 직접 만들었다는 이야기 ..

끗!

0개의 댓글

관련 채용 정보