Unity 내일배움캠프 TIL 1211 | UIManager를 통한 Popup 관리

cheeseonrose·2023년 12월 11일
0

Unity 내일배움캠프

목록 보기
89/89
post-thumbnail

두둥

얼마만의 TIL ..

오늘은 2달 동안의 프로젝트를 마무리 지으며 프로젝트에서 사용했던 UIManager로 Popup을 관리하는 내용에 대해 다뤄보겠다!!!!!

💡 UIManager로 Popup 관리하기


🐰 UI_Popup

  • Popup 클래스들의 부모이다.
  • Popup 내용, 확인 및 취소 버튼에 대한 콜백을 가진다.
    [SerializeField] private TMP_Text _contentText;
     [SerializeField] private Button _confirmButton;
     [SerializeField] private Button _cancelButton;

  • ShowPopup : 알맞는 Parameter를 설정한 뒤, Popup을 Open한다.
    public void ShowPopup(string content, Callback confirmAction, Callback cancelAction)
     {
     	if (content.Length != 0) _contentText.text = content;
      	_callbackConfirm = confirmAction;
        _callbackCancel = cancelAction;
        
        OpenUI();
     }

  • ClosePopup : 버튼 타입에 따라 확인 및 취소 콜백을 실행한 후 Popup을 Close한다.
    public void ClosePopup(Enums.PopupButtonType type, bool isSound = true)
     {
     	if (type == Enums.PopupButtonType.Confirm) _callbackConfirm?.Invoke();
      	else _callbackCancel?.Invoke();
          
        CloseUI(isSound);
     }





🍡 UIManager

  • ShowPopup<T> : 제네릭을 사용하여 T 타입의 Popup Parameter를 설정하고 Open한다.
    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;
    }





🍵 트러블 슈팅 - 문제

  • 처음에는 기본 Popup과 슬라이더가 있는 Popup으로 두 종류만 사용했지만, 이미지 리스트를 보여주는 Popup이 추가되면서 기존 방식에 문제가 발생했다.
    • 기존 방식 : 내부에서 if문을 통해 매개변수에 따라 알맞는 Popup으로 형변환하여 ShowPopup 호출
  • UIManager의 ShowPopup 메서드의 매개변수가 증가하게 되는데, 기존 방식으로 처리할 경우 if문으로 처리하는 예외 상황이 많아지고 예상치 못한 오류가 발생할 가능성이 높아진다.
  • 또한 Popup의 종류가 더 늘어났을 때 확장성이 매우 떨어지는 코드라고 생각하였다.





🌙 트러블 슈팅 - 시도

  • UIManager에게 Popup들의 공통 Parameter만 전달하고 Popup을 반환 받아서 필요한 추가 Parameter를 Set하는 방식
    UIManager.Instance.ShowPopup<UI_SliderPopup>()
        ?.SetPopupValue(valueConfirmAction: valueConfirmAction, sliderMaxValue: quantity);
    -> 메서드 체이닝으로 인해 Null 오류를 체크하기 어려워짐
    -> 또한 Popup 클래스는 Monobehaviour를 상속받기 때문에 Null 체크 연산자를 사용하는 것은 바람직하지 않은 방식

  • 임시 변수에 반환 받은 Popup을 할당한 뒤 Set하는 방식
    UI_SliderPopup popup = UIManager.Instance.ShowPopup<UI_SliderPopup>();
     if (popup != null)
    	popup.SetPopupValue(valueConfirmAction: valueConfirmAction, sliderMaxValue: quantity);
    • 위와 같이 사용해도 되지만 UIManager를 통해 Popup에 필요한 Parameter를 모두 Set하고 Open하는 동작까지 실행할 수 있도록 구현하고 싶었다.
    • Popup은 간단하게 띄우는 UI이고, 다른 UI들처럼 Set 해야 되는 내용이 많지 않기 때문에 더 간편하게 사용할 수 있는 방법을 찾고 싶었다!





🥕 트러블 슈팅 - 선택

  • Popup의 Parameter를 전달하는 PopupParameter 클래스 생성
    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;
        }
     }
    • 각 세분화 되는 Popup들은 위 클래스를 상속받아서 추가로 필요한 Parameter들을 받아오도록 구현한다.

  • UIManager의 ShowPopup 메서드의 매개변수로 PopupParameter를 전달한다.
    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를 통한 Popup 호출은 다음과 같다.
    UIManager.Instance.ShowPopup<UI_SliderPopup>(
    		new SliderPopupParameter(
          			sliderMaxValue: quantity
                	, valueConfirmAction: valueConfirmAction
            	)
            );
    • 이렇게 UIManager를 통해 Popup에 필요한 Parameter들을 Set하면서 Open까지 할 수 있게 되었다!
    • 또한 Popup의 종류가 증가하여도 일관성 있는 코드로 확장할 수 있는 장점까지 얻게 되었다.





🐇 GitHub

  • 자세한 내용과 코드는 GitHub에서 확인~!



끗!

0개의 댓글