public class UI_Popup : UI_Base
{
void Start()
{
}
void Update()
{
}
}
팝업용 UI를 위한 스크립트이다.
UI_Base를 상속받는다.
...
public class UI_Button : UI_Popup
...
버튼은 팝업기능이라 정하였다.
원래 UI_Base를 상속하던 것을 UI_Popup을 상속받는 것으로 변경하였다.
즉 UI_Button은 UI_Popup을 상속받고, UI_Popup은 UI_Base를 상속받는다.
public class UIManager
{
int _order = 0;
Stack<UI_Popup> _popupStack = new Stack<UI_Popup>();
// T는 UI_Popup을 상속하는 것들을 포함한다.
public T ShowPopupUI<T>(string name = null) where T : UI_Popup
{
if (string.IsNullOrEmpty(name))
name = typeof(T).Name;
// UI 게임오브젝트(프리팹)를 생성한다.
GameObject go = Managers.Resource.Instantiate($"UI/Popup/{name}");
// 컴포넌트를 가져온다.
T popup = Util.GetOrAddCompoent<T>(go);
_popupStack.Push(popup);
return popup;
}
public void ClosePopupUI(UI_Popup popup)
{
if (_popupStack.Count == 0)
return;
if (_popupStack.Peek() != popup)
{
Debug.Log("Close Popup Failed !");
return;
}
ClosePopupUI();
}
// 가장 최근에 연 PopupUI를 닫는다.
public void ClosePopupUI()
{
if (_popupStack.Count == 0)
return;
UI_Popup popup = _popupStack.Pop();
Managers.Resource.Destroy(popup.gameObject);
popup = null;
_order--;
}
// 스택에 있는, 즉 열려있는 모든 UI를 닫는다.
public void CloseAllPopupUI()
{
while (_popupStack.Count > 0)
ClosePopupUI();
}
}
// TEMP
Managers.UI.ShowPopupUI<UI_Button>();
Managers.UI.ShowPopupUI<UI_Button>();
두 개의 UI_Button PopupUI가 생성됨을 확인하였다.