void HidePanel(UIPanelLayerData panelLayerData, bool destroy = false) { panelLayerData.active = false; if (panelLayerData.gameObject != null) { if (panelLayerData.panel != null) { if (panelLayerData.gameObject.activeSelf) { panelLayerData.panel.CloseView(); } if (destroy) { panelLayerData.panel.DestroyView(); } } if (destroy) { //归还gameobject给对象池 App.ObjectPoolManager.Release(panelLayerData.resourceName, panelLayerData.gameObject); panelLayerData.canvas = null; panelLayerData.gameObject = null; panelLayerData.panel = null; panelLayerData.intent = null; panelLayerData.doInstance = false; CleanLayerUid(); } else { panelLayerData.gameObject.SetActive(false); } } }
void ShowPanel(UIPanelLayerData panelLayerData) { panelLayerData.active = true; UIPanelData panelData = GetPanelData(panelLayerData.name); m_OpenRequest.Add(panelLayerData); if (panelLayerData.gameObject == null) { if (!panelLayerData.doInstance) { panelLayerData.doInstance = true; App.ObjectPoolManager.Instantiate(panelLayerData.resourceName, (GameObject obj) => { panelLayerData.gameObject = obj; panelLayerData.canvas = obj.GetComponent <Canvas>(); panelLayerData.panel = obj.GetComponent <Panel>(); panelLayerData.canvas.worldCamera = this.m_UICamera; panelLayerData.canvas.sortingOrder = panelLayerData.zIndex; panelLayerData.canvas.planeDistance = 1; panelLayerData.panel.UpdateChildrenOrder(panelLayerData.zIndex); panelLayerData.gameObject.name = panelLayerData.name; panelLayerData.gameObject.transform.SetParent(this.m_UIRoot.transform); panelLayerData.gameObject.transform.localScale = Vector3.one; panelLayerData.gameObject.transform.localPosition = Vector3.zero; }); } } else { panelLayerData.canvas.sortingOrder = panelLayerData.zIndex; panelLayerData.panel.UpdateChildrenOrder(panelLayerData.zIndex); panelLayerData.gameObject.name = panelLayerData.name; panelLayerData.gameObject.transform.SetParent(this.m_UIRoot.transform); panelLayerData.gameObject.transform.localScale = Vector3.one; panelLayerData.gameObject.transform.localPosition = Vector3.zero; bool needOpenView = !panelLayerData.gameObject.activeSelf; if (!panelLayerData.inited) { panelLayerData.inited = true; if (panelLayerData.panel != null && !panelLayerData.panel.isInited) { panelLayerData.gameObject.SetActive(true); panelLayerData.panel.InitView(panelData.canRepeat); needOpenView = true; } } if (needOpenView) { panelLayerData.gameObject.SetActive(true); if (panelLayerData.panel != null) { panelLayerData.panel.OpenView(); panelLayerData.intent = null; } } } }
IEnumerator _DealOpenRequest() { while (m_OpenRequest.Count > 0) { UIPanelLayerData panelLayerData = m_OpenRequest[0]; if (panelLayerData.gameObject != null) { UIPanelData panelData = GetPanelData(panelLayerData.name); bool needOpenView = !panelLayerData.gameObject.activeSelf; if (!panelLayerData.inited) { panelLayerData.inited = true; if (panelLayerData.panel != null && !panelLayerData.panel.isInited) { panelLayerData.gameObject.SetActive(true); panelLayerData.panel.InitView(panelLayerData.gameObject); needOpenView = true; } } while (!panelLayerData.panel.isInited) { yield return(new WaitForEndOfFrame()); } if (needOpenView) { panelLayerData.gameObject.SetActive(true); if (panelLayerData.panel != null) { panelLayerData.panel.OpenView(panelLayerData.intent); panelLayerData.intent = null; } } if (!panelLayerData.active) { HidePanel(panelLayerData); } m_OpenRequest.Remove(panelLayerData); } yield return(new WaitForEndOfFrame()); } if (m_OpenRequestFinalHide != null) { for (int i = 0; i < m_OpenRequestFinalHide.Count; i++) { HidePanel(m_OpenRequestFinalHide[i]); } } m_OpenRequestFinalHide = null; m_OpenRequestDeal = null; }
public void BackOverLayer(string panelName) { UIPanelLayerData topPanel = GetTopPanel(UILayerType.NormalLayer); UIPanelLayerData overPanel = GetPanelLayer(UILayerType.OverLayer, panelName); if (topPanel != null && overPanel != null) { if (topPanel.topOverLayer.IndexOf(overPanel) != -1) { topPanel.topOverLayer.Remove(overPanel); SortPanelLayer(); } } }
//释放所有的panel public void ReleaseAllPanel() { m_OpenRequest.Clear(); foreach (var item in m_PanelLayerMap) { List <UIPanelLayerData> panelLayerList = item.Value; for (int j = 0; j < panelLayerList.Count; j++) { UIPanelLayerData panelLayer = panelLayerList[j]; HidePanel(panelLayer, true); } } ResetLayer(); }
public void TopOverLayer(string panelName) { UIPanelLayerData topPanel = GetTopPanel(UILayerType.NormalLayer); UIPanelLayerData overPanel = GetPanelLayer(UILayerType.OverLayer, panelName); if (topPanel != null && overPanel != null) { if (topPanel.topOverLayer.IndexOf(overPanel) == -1) { //overPanel.intent = intent; topPanel.topOverLayer.Add(overPanel); SortPanelLayer(); } } }
//打开panel public void OpenPanel(string name, object intent = null) { UIPanelData panelData = GetPanelData(name); if (panelData != null) { int curUid = m_LayersUidMap[panelData.layerLevel]; List <UIPanelLayerData> panelLayerList = m_PanelLayerMap[panelData.layerType]; UIPanelLayerData panelLayerLast = null; //在此UI的层中检测 此UI是否已经打开以及是否可以重复打开 for (int i = panelLayerList.Count - 1; i >= 0; i--) { if (panelLayerList[i].name == name) { if (panelLayerList[i].active) { if (panelData.canRepeat) { break; } Debugger.LogError("Panel:" + name + " Already Opened. If You Want to Open Many, Please Set 'canRepeat' True in Register."); return; } else { panelLayerLast = panelLayerList[i]; break; } } } if (panelLayerLast == null) { //从未打开过,需要将UI的数据加入到 此UI的层次list里面 UIPanelLayerData layerData = new UIPanelLayerData(); layerData.name = name; layerData.resourceName = panelData.resourceName; layerData.uid = curUid; layerData.baseUid = curUid; layerData.intent = intent; layerData.level = panelData.layerLevel; panelLayerList.Add(layerData); m_LayersUidMap[layerData.level]++; } SortPanelLayer(); } }
void CleanLayerUid() { Dictionary <UILayerLevel, int> topLayerUid = new Dictionary <UILayerLevel, int>(); topLayerUid.Add(UILayerLevel.Level0, 1); topLayerUid.Add(UILayerLevel.Level1, 1); foreach (var item in m_PanelLayerMap) { UIPanelLayerData panelTopLayer = GetTopPanel(item.Key); if (panelTopLayer != null) { if (panelTopLayer.baseUid > topLayerUid[panelTopLayer.level]) { topLayerUid[panelTopLayer.level] = panelTopLayer.baseUid; } } } m_LayersUidMap = topLayerUid; }
void _ClosePanel(string panelName, bool reopen) { foreach (var item in m_PanelLayerMap) { List <UIPanelLayerData> panelLayerList = item.Value; for (int j = panelLayerList.Count - 1; j >= 0; j--) { UIPanelLayerData panelLayer = panelLayerList[j]; if (panelLayer.name == panelName) { HidePanel(panelLayer, true); panelLayerList.RemoveAt(j); m_OpenRequest.Remove(panelLayer); if (reopen) { SortPanelLayer(); } return; } } } }
public void SortPanelLayer() { //baseUid是UI打开的基础顺序,uid是计算打开层级的基础值,zindex是具体的打开canvas层级 //对每层UI的uid进行重置 foreach (var item in m_PanelLayerMap) { List <UIPanelLayerData> panelLayerList = item.Value; for (int j = 0; j < panelLayerList.Count; j++) { UIPanelLayerData panelLayer = panelLayerList[j]; panelLayer.uid = panelLayer.baseUid; } } List <UIPanelLayerData> normalLayerList = m_PanelLayerMap[UILayerType.NormalLayer]; List <UIPanelLayerData> overLayerList = m_PanelLayerMap[UILayerType.OverLayer]; List <UIPanelLayerData> topLayerList = m_PanelLayerMap[UILayerType.TopLayer]; List <UIPanelLayerData> needShow = new List <UIPanelLayerData>(); List <UIPanelLayerData> needHide = new List <UIPanelLayerData>(); int topUid = -1; if (normalLayerList.Count > 0) { UIPanelLayerData topPanelLayer = GetTopPanel(UILayerType.NormalLayer); topUid = topPanelLayer.uid; //topOverLayer是存储固定浮在一个UI界面上面的界面,例如在选人界面上面的玩家的金币UI List <UIPanelLayerData> topPanel = topPanelLayer.topOverLayer; //对于悬浮的界面的排序基值进行计算 for (int i = 0; i < topPanel.Count; i++) { topPanel[i].uid = topPanelLayer.uid + 1 + i; } //对于普通UI层的UI进行显示与隐藏 for (int i = normalLayerList.Count - 1; i >= 0; i--) { if (normalLayerList[i] != topPanelLayer) { needHide.Add(normalLayerList[i]); } else { needShow.Add(normalLayerList[i]); } } } //所有UI的zIndex计算 foreach (var item in m_PanelLayerMap) { List <UIPanelLayerData> panelLayerList = item.Value; for (int j = 0; j < panelLayerList.Count; j++) { UIPanelLayerData panelLayer = panelLayerList[j]; panelLayer.zIndex = UIManager.UILayerLevelBaseSpacing[(int)panelLayer.level] + UIManager.UIPanelSpacing * panelLayer.uid; } } //OverLayer进行显示与隐藏计算 for (int i = overLayerList.Count - 1; i >= 0; i--) { if (topUid < 0 || topUid < overLayerList[i].uid) { needShow.Add(overLayerList[i]); } else { needHide.Add(overLayerList[i]); } } //top层全显示 for (int i = topLayerList.Count - 1; i >= 0; i--) { needShow.Add(topLayerList[i]); } m_OpenRequestFinalHide = needHide; for (int i = 0; i < needShow.Count; i++) { ShowPanel(needShow[i]); } ////////////////////////////////////////////////////// if (m_OpenRequestDeal != null) { StopCoroutine(m_OpenRequestDeal); m_OpenRequestDeal = null; } if (m_OpenRequest.Count > 0 && m_OpenRequestDeal == null) { m_OpenRequestDeal = StartCoroutine(_DealOpenRequest()); } }