/// <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); }
/// <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); }
/// <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); } }
/// <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--; }