모든 팝업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 인스턴스를 PopupUI Type
과 Default 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();
}
}