private void SimpleShow(string uiFormName, UIFormBase baseUiForm) { _allUiFormList.Add(baseUiForm); // 如果这个UI需要清空所有的[反向切换]窗口, 清空“栈集合”中的数据 if (baseUiForm.CurrentUiType.IsClearStack) { bool clearResult = ClearStackArray(); if (!clearResult) { Debug.Log("栈中的数据没有清空,检查 uiFormName " + uiFormName); } } //根据不同的UI窗体的显示模式,分别做不同的加载处理 switch (baseUiForm.CurrentUiType.UiFormsShowMode) { // 将 窗体 加载到 _dicCurrentShowUiForms 中 case UIFormShowMode.Normal: // 普通显示 LoadUiToCurrentCache(uiFormName); break; case UIFormShowMode.HideOther: //隐藏其他 EnterUiFormsAndHideOther(uiFormName); break; case UIFormShowMode.ReverseChange: // 反向切换 PushUiFormToStack(baseUiForm); break; } }
/// <summary> /// 显示(打开)UI窗体 /// 功能: /// 1、根据UI窗体的名称,加载到“所有UI窗体”缓存集合中 /// 2、根据不同的UI窗体的显示模式,分别做不同的加载处理 /// </summary> /// <param name="uiFormName">UI窗体预设的名称</param> public bool ShowUiForm(string uiFormName) { UIFormBase baseUiForm = null; //参数的检查 if (string.IsNullOrEmpty(uiFormName)) { return(false); } //根据UI窗体的名称,加载到“所有UI窗体”缓存集合中,并且从 “所有UI窗体”缓存集合中 获取本窗体 baseUiForm = LoadFormsToAllFormsCache(uiFormName); if (baseUiForm == null) { return(false); } if (!_allUiFormList.Contains(baseUiForm)) { // 最新的UI窗体(内存中不存在的窗体) SimpleShow(uiFormName, baseUiForm); } else { if (baseUiForm.isActiveAndEnabled) { return(true); // 误操作不做处理 } // 已经显示过的UI(内存中还存在,但是隐藏了,需要重新显示) HandleReShowUi(uiFormName, baseUiForm); } return(true); }
/// <summary> /// 根据UI窗体的名称,加载到“所有UI窗体”缓存集合中 /// </summary> /// <param name="uiFormName">UI窗体(预设)的名称</param> /// <returns></returns> private UIFormBase LoadFormsToAllFormsCache(string uiFormName) { UIFormBase baseUiResult = null; if (!_dicAllUiForms.TryGetValue(uiFormName, out baseUiResult)) { baseUiResult = LoadUiForm(uiFormName);// 加载指定名称的“UI窗体” } return(baseUiResult); }
/// <summary> /// 加载指定名称的“UI窗体” /// 功能: /// 1、根据“UI窗体名“加载预设克隆体 /// 2、根据克隆体中不同位置信息,设置不同父对象 /// 3、隐藏刚创建的UI克隆体 /// 4、把克隆体加入到 _dicAllUiForms 中 /// </summary> /// <param name="uiFormName">UI窗体的名称</param> private UIFormBase LoadUiForm(string uiFormName) { string strUiFormsPaths = null; GameObject goCloneUiPrefabs = null; // 根据UI窗体名称,得到对应的加载路径 _dicFormsPaths.TryGetValue(uiFormName, out strUiFormsPaths); //1、根据“UI窗体名“加载预设克隆体 if (!string.IsNullOrEmpty(strUiFormsPaths)) { goCloneUiPrefabs = ResourcesMgr.Instance.LoadAsset(strUiFormsPaths, false); goCloneUiPrefabs.name = uiFormName; } //2、根据克隆体中不同位置信息,设置不同父对象 if (_traCanvasTransform != null && goCloneUiPrefabs != null) { UIFormBase baseUiForm = goCloneUiPrefabs.GetComponent <UIFormBase>(); if (baseUiForm == null) { Debug.Log(strUiFormsPaths + " 克隆的窗体上没有BaseUIForm"); return(null); } // 设置位置 switch (baseUiForm.CurrentUiType.UiFormsType) { case UIFormsType.Normal: // 普通窗体 goCloneUiPrefabs.transform.SetParent(_traNormal, false); break; case UIFormsType.Fixed: // 固定窗体 goCloneUiPrefabs.transform.SetParent(_traFixed, false); break; case UIFormsType.PopUp: //弹出窗体 goCloneUiPrefabs.transform.SetParent(_traPopUp, false); break; default: break; } //3、显示刚创建的UI克隆体 goCloneUiPrefabs.SetActive(true); //4、把克隆体加入到 _dicAllUiForms 中 _dicAllUiForms.Add(uiFormName, baseUiForm); return(baseUiForm); } else { Debug.Log("_traCanvasTransform = null Or goCloneUIPrefabs = null " + uiFormName); return(null); } }
/// <summary> /// 处理重新显示(隐藏的并且内存中存在的)UI窗体 /// </summary> private void HandleReShowUi(string uiFormName, UIFormBase baseUiForm) { // 当前显示的窗体中 已有需要显示的窗体,类似于重新打开,那就回到最开始,重新按顺序显示 if (_dicCurrentShowUiForms.ContainsKey(uiFormName) || _stackCurrentUiForms.Contains(baseUiForm) && _allUiFormList.Count > 0) { while (_allUiFormList[_allUiFormList.Count - 1] != baseUiForm) { UIFormBase tempUi = _allUiFormList[_allUiFormList.Count - 1]; // 由于是按顺序存入 _allUiFormList ,所以显示某一个UI时,需要把后面的UI全部关闭(我是这么处理的,具体需求还有其他的处理办法) // 根据这个UI类型关闭自身 CloseUiForm(tempUi.name); // 会从 _allUiFormList 中 删除 tempUi } // 循环结束,说明已经显示了需要的UI窗体 } }
/// <summary> /// 把当前窗体加载到 _dicCurrentShowUiForms 中 /// </summary> /// <param name="uiFormName"></param> private void LoadUiToCurrentCache(string uiFormName) { UIFormBase baseUiFormFromAllCache = null; // 从_DicAllUIForms 中得到窗体基类 // 把当前窗体,加载到 _dicCurrentShowUiForms 集合中 _dicAllUiForms.TryGetValue(uiFormName, out baseUiFormFromAllCache); if (baseUiFormFromAllCache != null) { _dicCurrentShowUiForms.Add(uiFormName, baseUiFormFromAllCache); baseUiFormFromAllCache.Display(); //显示当前窗体 } else { Debug.Log(GetType() + "/baseUIFormFromAllCache =NULL , uiFormName = " + uiFormName); } }
/// <summary> /// 退出指定UI窗体 /// </summary> /// <param name="uiFormName">指定的窗体名称</param> private void ExitUiForms(string uiFormName) { if (string.IsNullOrEmpty(uiFormName)) { return; } UIFormBase baseUiForm = null; // _dicCurrentShowUiForms 中不存在 uiFormName,直接返回 _dicCurrentShowUiForms.TryGetValue(uiFormName, out baseUiForm); if (baseUiForm == null) { return; } // 指定窗体,标记为“隐藏窗体”,并从 _dicCurrentShowUiForms 移除 baseUiForm.Hiding(); _dicCurrentShowUiForms.Remove(uiFormName); }
/// <summary> /// 关闭"隐藏其他属性"的窗体,且显示其他所有窗体 /// </summary> /// <param name="uiFormName">需要关闭的窗体名称</param> private void ExitUiFormsAndHideOther(string uiFormName) { UIFormBase baseUiForm = null; // 参数检查 if (string.IsNullOrEmpty(uiFormName)) { return; } _dicCurrentShowUiForms.TryGetValue(uiFormName, out baseUiForm); if (baseUiForm == null) { return; } // 隐藏当前窗体,并且在 _dicCurrentShowUiForms 中移除 baseUiForm.Hiding(); _dicCurrentShowUiForms.Remove(uiFormName); // 重新按顺序显示隐藏其他之前的UI窗体 ReShowUi(); }
/// <summary> /// UI窗体入栈 /// </summary> /// <param name="baseUiForm">窗体的名称</param> private void PushUiFormToStack(UIFormBase baseUiForm) { if (baseUiForm == null) { Debug.Log(GetType() + "/PushUIFormToStack UIFormBase =NULL"); } else { // 判断栈集合中,是否已有窗体,有则“冻结”处理 if (_stackCurrentUiForms.Count > 0) { UIFormBase topUiForm = _stackCurrentUiForms.Peek(); topUiForm.Freeze(); } // 把指定的UI窗体,入栈操作 _stackCurrentUiForms.Push(baseUiForm); // 显示窗体 baseUiForm.Display(); } }
/// <summary> /// “反向切换”属性窗体的出栈 /// </summary> private void PopUiForm(string uiFormName) { UIFormBase topUiForm = null; // 参数检查 if (_stackCurrentUiForms.Count > 0) { topUiForm = _stackCurrentUiForms.Peek(); if (topUiForm.name == uiFormName) { topUiForm = _stackCurrentUiForms.Pop(); // 隐藏处理 topUiForm.Hiding(); if (_stackCurrentUiForms.Count > 0) { // 新的栈顶重新显示 UIFormBase nextUiForm = _stackCurrentUiForms.Peek(); nextUiForm.ReDisplay(); } } } }
/// <summary> /// 关闭指定(单个)窗体,重新显示之前的窗体 /// 关闭永远是按顺序从后往前关 /// </summary> /// <param name="uiFormName">窗体名称</param> public bool CloseUiForm(string uiFormName) { UIFormBase baseUiForm = null; //参数的检查 if (string.IsNullOrEmpty(uiFormName)) { return(false); // 参数错误返回 } // _dicAllUiForms 中,如果没有记录,则直接返回(即关闭一个不存在的窗体) _dicAllUiForms.TryGetValue(uiFormName, out baseUiForm); if (baseUiForm == null) { return(false); } // 从所有的 内存 窗体中,删除需要关闭的 _allUiFormList.Remove(baseUiForm); // 根据窗体不同的显示类型,分别做不同的关闭处理 switch (baseUiForm.CurrentUiType.UiFormsShowMode) { // 将 窗体 从 _dicCurrentShowUiForms 中移除 case UIFormShowMode.Normal: // 普通窗体的关闭 ExitUiForms(uiFormName); break; case UIFormShowMode.ReverseChange: // 反向切换的关闭 PopUiForm(uiFormName); break; case UIFormShowMode.HideOther: // 隐藏其他的关闭 ExitUiFormsAndHideOther(uiFormName); break; } return(true); }
/// <summary> /// 打来"隐藏其他属性"的窗体,且隐藏其他所有窗体 /// </summary> /// <param name="uiFormName">需要打开的窗体名称</param> private void EnterUiFormsAndHideOther(string uiFormName) { UIFormBase baeUiFormFromAll = null; _dicAllUiForms.TryGetValue(uiFormName, out baeUiFormFromAll); if (baeUiFormFromAll == null) { return; } // 把 _dicCurrentShowUiForms 和 _stackCurrentUiForms 中所有的窗体都隐藏 foreach (UIFormBase baseuiForm in _dicCurrentShowUiForms.Values) { baseuiForm.Hiding(); } foreach (UIFormBase uiForm in _stackCurrentUiForms) { uiForm.Hiding(); } // 加入到 _dicCurrentShowUiForms _dicCurrentShowUiForms.Add(uiFormName, baeUiFormFromAll); //显示当前窗体 baeUiFormFromAll.Display(); }