/// <summary> /// 加载指定名称的“UI窗体” /// 功能: /// 1:根据“UI窗体名称”,加载预设克隆体。 /// 2:根据不同预设克隆体中带的脚本中不同的“位置信息”,加载到“根窗体”下不同的节点。 /// 3:隐藏刚创建的UI克隆体。 /// 4:把克隆体,加入到“所有UI窗体”(缓存)集合中。 /// </summary> /// <param name="uiFormName">UI窗体名称</param> private BaseUiFrame LoadUiForm(string uiFormName) { GameObject cloneUiPrefabs = null; //创建的UI克隆体预设 UiWind uiWind = (UiWind)Enum.Parse(typeof(UiWind), uiFormName); //根据UI窗体名称,得到对应的加载路径 _dicFormsPaths.TryGetValue(uiWind, out string strUiFormPaths); //根据“UI窗体名称”,加载“预设克隆体” if (strUiFormPaths != null) { cloneUiPrefabs = ResourcesMgr.Instance().LoadAsset(strUiFormPaths, false); } //设置“UI克隆体”的父节点(根据克隆体中带的脚本中不同的“位置信息”) if (CanvasTrans != null && cloneUiPrefabs != null) { BaseUiFrame baseUiForm = cloneUiPrefabs.GetComponent <BaseUiFrame>(); //窗体基类 if (baseUiForm == null) { Debug.Log("baseUiForm==null! ,请先确认窗体预设对象上是否加载了baseUIForm的子类脚本! 参数 uiFormName=" + uiFormName); return(null); } switch (baseUiForm.CurrentUiType.UiWindType) { case UiWindType.Normal: //普通窗体节点 cloneUiPrefabs.transform.SetParent(_normalTrans, false); break; case UiWindType.Fixed: //固定窗体节点 cloneUiPrefabs.transform.SetParent(_fixedTrans, false); break; case UiWindType.PopUp: //弹出窗体节点 cloneUiPrefabs.transform.SetParent(_popUpTrans, false); break; } //设置隐藏 cloneUiPrefabs.SetActive(false); //把克隆体,加入到“所有UI窗体”(缓存)集合中。 _dicAllUiForms.Add(uiFormName, baseUiForm); return(baseUiForm); } else { Debug.Log("_TraCanvasTransfrom==null Or goCloneUIPrefabs==null!! ,Plese Check!, 参数uiFormName=" + uiFormName); } Debug.Log("出现不可以预估的错误,请检查,参数 uiFormName=" + uiFormName); return(null); }
//(“反向切换”属性)窗体的出栈逻辑 private void PopUiForms() { if (_staCurrentUiForms.Count >= 2) { //出栈处理 BaseUiFrame topUiForms = _staCurrentUiForms.Pop(); //做隐藏处理 topUiForms.Hiding(); //出栈后,下一个窗体做“重新显示”处理。 BaseUiFrame nextUiForms = _staCurrentUiForms.Peek(); nextUiForms.Redisplay(); } else if (_staCurrentUiForms.Count == 1) { //出栈处理 BaseUiFrame topUiForms = _staCurrentUiForms.Pop(); //做隐藏处理 topUiForms.Hiding(); } }
/// <summary> /// UI窗体入栈 /// </summary> /// <param name="uiFormName">窗体的名称</param> private void PushUiFormToStack(string uiFormName) { //判断“栈”集合中,是否有其他的窗体,有则“冻结”处理。 if (_staCurrentUiForms.Count > 0) { BaseUiFrame topUiForm = _staCurrentUiForms.Peek(); //栈顶元素作冻结处理 topUiForm.Freeze(); } //判断“UI所有窗体”集合是否有指定的UI窗体,有则处理。 _dicAllUiForms.TryGetValue(uiFormName, out BaseUiFrame baseWind); if (baseWind != null) { baseWind.Display();//当前窗口显示状态 //把指定的UI窗体,入栈操作。 _staCurrentUiForms.Push(baseWind); } else { Debug.Log("baseUIForm==null,Please Check, 参数 uiFormName=" + uiFormName); } }