/// <summary> /// 自动给Forms层级排序 /// </summary> private int AutoCalculateDepth(UIBaseForms <MonoBehaviour> forms, int curDepth) { UIPanel parentPanel = forms.GetComponent <UIPanel>(); if (parentPanel == null) { NIDebug.LogWarning("=============自动给Forms层级排序========parentPanel是null======"); return(curDepth); } UIPanel[] childrenPanel = forms.GetComponentsInChildren <UIPanel>(true); //这里的下标0也是parentPanel int parentPanelDepth = parentPanel.depth; int maxDis = 0; for (int i = 0; i < childrenPanel.Length; i++) { int disDepth = childrenPanel[i].depth - parentPanelDepth; childrenPanel[i].depth = curDepth + disDepth; if (disDepth > maxDis) { maxDis = disDepth; } } return(curDepth + maxDis + 1); }
private void DestroyForms(string formsName) { if (string.IsNullOrEmpty(formsName)) { return; } UIBaseForms <MonoBehaviour> forms = null; if (mFormsDic.TryGetValue(formsName, out forms)) { forms.End(); GameObject.Destroy(forms.gameObject); mFormsDic.Remove(formsName); } }
/// <summary> /// 创建窗口 /// </summary> public T ShowForms <T>(string formsName, string PrefabName, bool IsAutoDepth = true) where T : UIBaseForms <MonoBehaviour> { if (string.IsNullOrEmpty(formsName) || string.IsNullOrEmpty(PrefabName)) { return(null); } UIBaseForms <MonoBehaviour> forms = null; if (!mFormsDic.TryGetValue(formsName, out forms)) { forms = _CreateForms <T>(formsName, PrefabName); if (forms != null) { forms.Show(); } } else { forms.ReShow(); } if (forms != null) { switch (forms.formsLayerType) { case UIFormsLayer.MainUILayer: if (IsAutoDepth) { AutoCalculateDepth(forms, mCurMainUILayerDepth); } break; case UIFormsLayer.CommonUILayer: { if (forms.formsType == UIFormsType.Normal) { //1.隐藏栈顶forms if (mFormsStackIndex.ContainsKey(mCurStackFormsIndex)) { string name = mFormsStackIndex[mCurStackFormsIndex]; if (mFormsDic.ContainsKey(name)) { mFormsDic[name].Hide(); } } //2.如果存在栈中且不是位于栈顶(是否考虑栈顶的话就不做后面的操作),需要"Top"到栈顶 if (mFormsStackName.ContainsKey(formsName)) { if (mFormsStackName[formsName] != mCurStackFormsIndex) { int tIndex = mFormsStackName[formsName]; for (int i = tIndex; i < mCurStackFormsIndex; i++) { mFormsStackIndex[i] = mFormsStackIndex[i + 1]; mFormsStackName[mFormsStackIndex[i]] = i; } mFormsStackIndex[mCurStackFormsIndex] = formsName; mFormsStackName[formsName] = mCurStackFormsIndex; } } else { mCurStackFormsIndex++; PushForms(formsName); } //3.移除Stack类型的窗口 if (mPopupFormsStack.Count > 0) { foreach (var item in mPopupFormsStack) { this.DestroyForms(item); } mPopupFormsStack.Clear(); } //3.重置depth, //这里可以考虑做成:假栈为空的时候,界面只剩下主界面的时候重置depth //目前是做成:只显示一个normal型窗口,底下normal窗口隐藏,所以这里可以重置depth //mCurFormsDepth = 1; } else if (forms.formsType == UIFormsType.Popup) { if (!mPopupFormsStack.Contains(formsName)) { mPopupFormsStack.Push(formsName); } else { NIDebug.LogWarning("*****************栈窗口已经有此窗口*******************"); } } if (IsAutoDepth) { mCurCommonUILayerDepth = AutoCalculateDepth(forms, mCurCommonUILayerDepth); } } break; case UIFormsLayer.RewardLayer: break; case UIFormsLayer.TipLayer: break; case UIFormsLayer.NotifyLayer: break; case UIFormsLayer.GuideLayer: break; case UIFormsLayer.LoadingLayer: break; case UIFormsLayer.ServerLayer: break; default: break; } return(forms as T); } return(null); }
/// <summary> /// 关闭单个窗口 /// </summary> public void CloseForms(string formsName) { if (string.IsNullOrEmpty(formsName)) { return; } UIBaseForms <MonoBehaviour> forms = null; if (mFormsDic.TryGetValue(formsName, out forms)) { switch (forms.formsLayerType) { case UIFormsLayer.MainUILayer: NIDebug.LogWarning("============MianUILayer类型的窗口不让关闭==============="); return; case UIFormsLayer.CommonUILayer: { if (forms.formsType == UIFormsType.Normal) { if (forms.formsLifeType == UIFormsLifeType.GoldLife) { forms.Hide(); } else if (forms.formsLifeType == UIFormsLifeType.HumanLife) { DestroyForms(formsName); } PopForms(formsName); } else if (forms.formsType == UIFormsType.Popup) { DestroyForms(formsName); } } break; case UIFormsLayer.RewardLayer: break; case UIFormsLayer.TipLayer: break; case UIFormsLayer.NotifyLayer: break; case UIFormsLayer.GuideLayer: break; case UIFormsLayer.LoadingLayer: break; case UIFormsLayer.ServerLayer: break; default: break; } } }