두둥
얼마만의 TIL ..
오늘은 2달 동안의 프로젝트를 마무리 지으며 프로젝트에서 사용했던 UIManager로 Popup을 관리하는 내용에 대해 다뤄보겠다!!!!!
[SerializeField] private TMP_Text _contentText;
[SerializeField] private Button _confirmButton;
[SerializeField] private Button _cancelButton;
public void ShowPopup(string content, Callback confirmAction, Callback cancelAction)
{
if (content.Length != 0) _contentText.text = content;
_callbackConfirm = confirmAction;
_callbackCancel = cancelAction;
OpenUI();
}
public void ClosePopup(Enums.PopupButtonType type, bool isSound = true)
{
if (type == Enums.PopupButtonType.Confirm) _callbackConfirm?.Invoke();
else _callbackCancel?.Invoke();
CloseUI(isSound);
}
public T ShowPopup<T>(string content = "", Callback confirmAction = null, Callback cancelAction = null
, Action<int> valueConfirmAction = null, int sliderMaxValue = -1) where T : UI_Popup
{
...
if (valueConfirmAction == null || sliderMaxValue == -1)
{
UI_DefaultPopup uiPopup = uiPopupDic[key] as UI_DefaultPopup;
uiPopup.ShowPopup(confirmAction, cancelAction, content);
}
else
{
UI_SliderPopup uiSliderPopup = uiPopupDic[key] as UI_SliderPopup;
uiSliderPopup.ShowPopup(confirmAction, cancelAction, valueConfirmAction, sliderMaxValue, content);
}
return _uiPopupDic[key] as T;
}
UIManager.Instance.ShowPopup<UI_SliderPopup>()
?.SetPopupValue(valueConfirmAction: valueConfirmAction, sliderMaxValue: quantity);
-> 메서드 체이닝으로 인해 Null 오류를 체크하기 어려워짐UI_SliderPopup popup = UIManager.Instance.ShowPopup<UI_SliderPopup>();
if (popup != null)
popup.SetPopupValue(valueConfirmAction: valueConfirmAction, sliderMaxValue: quantity);
public class PopupParameter
{
protected string _content;
protected Callback _confirmCallback;
protected Callback _cancelCallback;
public PopupParameter(string content = "", Callback confirmCallback = null, Callback cancelCallback = null)
{
_content = content;
_confirmCallback = confirmCallback;
_cancelCallback = cancelCallback;
}
public string GetContent()
{
return _content;
}
public Callback GetConfirmCallback()
{
return _confirmCallback;
}
public Callback GetCancelCallback()
{
return _cancelCallback;
}
}
public T ShowPopup<T>(PopupParameter popupParameter) where T : UI_Popup
{
...
_uiPopupDic[key].ShowPopup(popupParameter);
return _uiPopupDic[key] as T;
}
Popup 클래스의 ShowPopup 메서드에서는 PopupParameter를 전달 받아서 사용한다.
public virtual void ShowPopup(PopupParameter popupParameter)
{
if (popupParameter.GetContent().Length != 0) _contentText.text = popupParameter.GetContent();
_callbackConfirm = popupParameter.GetConfirmCallback();
_callbackCancel = popupParameter.GetCancelCallback();
OpenUI();
}
세분화 되는 Popup 클래스들은 각각 자신에게 필요한 PopupParameter 클래스 타입으로 형변환하여 사용한다.
public class UI_SliderPopup : UI_Popup
{
...
public override void ShowPopup(PopupParameter popupParameter)
{
base.ShowPopup(popupParameter);
SliderPopupParameter parameter = popupParameter as SliderPopupParameter;
...
}
}
UIManager.Instance.ShowPopup<UI_SliderPopup>(
new SliderPopupParameter(
sliderMaxValue: quantity
, valueConfirmAction: valueConfirmAction
)
);
끗!