유니티 간단한 팝업UI 매니저

정선호·2023년 9월 3일
0

Original

목록 보기
4/5

개발 명세

  • 모든 팝업 UI들은 팝업 UI매니저를 통해 활성화/비활성화 된다.
  • 게임 화면에는 단 하나의 팝업 UI만이 보여진다.
  • 팝업UI는 여러 종류의 UI 인스턴스가 중첩되어 활성화될 수 있다. 단, 한 종류의 UI는 한 개의 인스턴스만 활성화된다.
    • A가 활성화된 상태에서 B를 활성화시킬 시 A가 비활성화되면서 B만 화면에 뜬다.
    • 이후 B를 비활성화시키면 A가 다시 활성화된다.
    • A가 활성화되어 있는 상태에서 A를 다시 활성화시킬 시 아무런 일이 일어나지 않는다.
    • A - B 순으로 활성화되어 있는 상태에서 A를 다시 활성화시킬 시 B - A 순으로 활성화된다.

개발 결과

팝업 UI

모든 팝업UI는 Default Popup UI스크립트를 상속받는다.
Default Popup UI스크립트는 모노비헤이비어의 수명 주기 함수를 버추얼 함수로 선언하고, 게임오브젝트의 활성화/비활성화에 관한 함수가 선언되어있다.

namespace UI.PopupUI
{
    public class DefaultPopupUI : MonoBehaviour
    {
        public void ActivateUI(bool value)
        {
            gameObject.SetActive(value);
        }


        #region Unity Methods

        protected virtual void Awake()
        {
            
        }

        protected virtual void Start()
        {
        }

        protected virtual void OnDestroy()
        {
            
        }

        #endregion
    }
}

팝업 UI 매니저

팝업 UI 매니저는 모든 팝업UI 인스턴스를 PopupUI TypeDefault Popup UI쌍 딕셔너리로 갖고 있다.

    [Serializable]
    public enum PopupUIType
    {
        Default = 0,
        DefaultTab = 1,
    }
    
    [Serializable]
    public class PopupUIDictionary : SerializableDictionary<PopupUIType, DefaultPopupUI>{}

외부 UI(버튼 등)으로 원하는 팝업을 열 수 있게 하기 위해 팝업UI타입을 입력하면 해당 팝업을 활성화해준다.

        public void PopupUIOpen(PopupUIType type)
        {
            var t = _popupStack.Find(popupUiDictionary[type]);
            if (t != null)
            {
                _popupStack.Remove(popupUiDictionary[type]);
            }
            
            _popupStack.First?.Value.ActivateUI(false);
            
            backgroundPanel.SetActive(true);
            popupUiDictionary[type].ActivateUI(true);
            _popupStack.AddFirst(popupUiDictionary[type]);
        }

        public void PopupUIOpen(int type)
        {
            PopupUIOpen((PopupUIType)type);
        }

맨 앞에 있는 팝업부터 하나씩 닫을 수 있게끔 Close 함수를 구현한다.

        public void PopupUIClose()
        {
            if (_popupStack.Count > 0)
            {
                var ui = _popupStack.First.Value;
                ui.ActivateUI(false);
                _popupStack.RemoveFirst();
                _popupStack.First?.Value.ActivateUI(true);

                if (_popupStack.Count == 0)
                {
                    backgroundPanel.SetActive(false);
                }
            }
        }

        public void PopupCloseAll()
        {
            for (int i = 0; i < _popupStack.Count; i++)
            {
                PopupUIClose();
            }
        }
profile
학습한 내용을 빠르게 다시 찾기 위한 저장소

0개의 댓글