Unity3D_MMO - UIManager (1)

k_hyun·2022년 10월 12일
0

Unity_MMO_Project

목록 보기
11/33

UI_Popup.cs

public class UI_Popup : UI_Base
{
    
    void Start()
    {
        
    }
    
    void Update()
    {
        
    }
}

팝업용 UI를 위한 스크립트이다.

UI_Base를 상속받는다.

UI_Button.cs

...
public class UI_Button : UI_Popup
...

버튼은 팝업기능이라 정하였다.

원래 UI_Base를 상속하던 것을 UI_Popup을 상속받는 것으로 변경하였다.

즉 UI_Button은 UI_Popup을 상속받고, UI_Popup은 UI_Base를 상속받는다.

UI_Manager.cs

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가 생성됨을 확인하였다.

0개의 댓글