示例#1
0
    /// <summary>
    /// 팝업창 닫기를 실행했을 때, 오브젝트 풀링이 필요한 UI라면 파괴하는 대신 비활성화시키고 true를 반환합니다.
    /// DontDestroy 변수가 false일 경우에는 아무 동작도 하지 않고 false를 반환합니다.
    /// </summary>
    bool AllowDestroy(UIBase_Popup popup)
    {
        if (popup.DontDestroy)
        {
            popup.gameObject.SetActive(false);

            if (popup.hasDestroyMotion)
            {
                popup.OnDestroyMotion();
            }

            string name = popup.gameObject.name;
            string key  = name.Remove(name.IndexOf('('));

            if (!closedUI.ContainsKey(key))
            {
                closedUI.Add(key, popup);
            }

            GameManager.Resource.Disable(popup.gameObject, popup.destroyTime);
            order--;

            return(false);
        }
        return(true);
    }
示例#2
0
    /// <summary>
    /// 특정 팝업창을 지정하여, 해당 팝업이 가장 위에 있다면 닫습니다. 아니라면 아무 동작도 실행하지 않습니다.
    /// 게임 진행과 무관한 도움말 등이 열려 있을 때 Escape로 닫는 용도로 사용됩니다. 아무 동작도 실행하지 않으면 false, 성공적으로 창을 닫았으면 true를 반환합니다.
    /// </summary>
    public bool TryClosePopupUI <T>(string name = null)
    {
        if (popupUI.Count == 0)
        {
            return(false);
        }
        if (string.IsNullOrEmpty(name))
        {
            name = typeof(T).Name;
        }

        UIBase_Popup nowPopup = popupUI.Peek();

        if (nowPopup.name == name + "(Clone)")
        {
            ClosePopupUI();
            return(true);
        }
        else
        {
            Debug.Log("대상 팝업창이 오픈되어있지 않습니다.");
        }

        return(false);
    }
示例#3
0
    /// <summary>
    /// 특정 팝업창을 지정하여 닫습니다. 지정된 팝업창이 가장 나중에 띄운 팝업창이라면 즉시 닫고, 그렇지 않을 경우 팝업창을 하나씩 탐색하여 지정된 창을 찾습니다.
    /// 매개변수가 없는 ClosePopupUI()에 비해 부하율이 높지만 더 안전합니다. 해당 팝업창이 맨 위에 있을 때만 닫아야 한다면 TryClosePopupUI를 이용하세요.
    /// </summary>
    public void ClosePopupUI <T>(string name = null)
    {
        if (TryClosePopupUI <T>())
        {
            return;
        }

        if (popupUI.Count == 0)
        {
            return;
        }
        if (string.IsNullOrEmpty(name))
        {
            name = typeof(T).Name;
        }

        bool isFound     = false;
        int  targetOrder = int.MaxValue;

        Stack <UIBase_Popup> tempStack = new Stack <UIBase_Popup>();

        while (popupUI.Count > 0)
        {
            UIBase_Popup lastPopup = popupUI.Peek();
            if (lastPopup.name != name + "(Clone)")
            {
                tempStack.Push(popupUI.Pop());
            }
            else
            {
                targetOrder = lastPopup.gameObject.GetComponent <Canvas>().sortingOrder;
                ClosePopupUI();
                isFound = true;
                break;
            }
        }
        while (tempStack.Count > 0)
        {
            UIBase_Popup tempPopup = tempStack.Pop();
            if (isFound)
            {
                Canvas canvas = tempPopup.gameObject.GetComponent <Canvas>();
                if (targetOrder < canvas.sortingOrder)
                {
                    canvas.sortingOrder--;
                }
            }

            popupUI.Push(tempPopup);
        }
    }
示例#4
0
    /// <summary>
    /// 가장 나중에 띄운 팝업창을 닫습니다. 팝업창 닫기와 관련된 모든 함수는 공통으로 이 함수를 호출하여 Destroy 처리하게 됩니다.
    /// </summary>
    public void ClosePopupUI()
    {
        if (popupUI.Count == 0)
        {
            return;
        }

        UIBase_Popup pop = popupUI.Pop();

        if (!AllowDestroy(pop))
        {
            return;
        }

        if (pop.hasDestroyMotion)
        {
            pop.OnDestroyMotion();
        }

        GameManager.Resource.Destroy(pop.gameObject, pop.destroyTime);

        order--;
    }