/// <summary> /// 加载指定名称的“UI窗体” /// 功能: /// 1:根据“UI窗体名称”,加载预设克隆体。 /// 2:根据不同预设克隆体中带的脚本中不同的“位置信息”,加载到“根窗体”下不同的节点。 /// 3:隐藏刚创建的UI克隆体。 /// 4:把克隆体,加入到“所有UI窗体”(缓存)集合中。 /// </summary> /// <returns>The UIF orm.</returns> /// <param name="uiFormName">User interface form name.</param> private BaseUIForm LoadUIForm(string uiFormName) { string strUIFormPaths = null; //UI窗体路径 GameObject goCloneUIPrefabs = null; //创建的UI克隆体预设 BaseUIForm baseUIForm = null; //窗体基类 //根据UI窗体名称,得到对应的加载路径 _DicFormsPaths.TryGetValue(uiFormName, out strUIFormPaths); //根据UI窗体名称,加载预设克隆体 if (!string.IsNullOrEmpty(strUIFormPaths)) { goCloneUIPrefabs = ResourcesMgr.GetInstance().LoadAsset(strUIFormPaths, false); } //设置UI克隆体的父节点 if (_TraCanvasTransform != null && goCloneUIPrefabs != null) { baseUIForm = goCloneUIPrefabs.GetComponent <BaseUIForm>(); if (baseUIForm == null) { Debug.Log("baseUIForm == null"); return(null); } switch (baseUIForm.CurrentUIType.UIForms_Type) { case UIFormType.Normal: //普通窗体节点 goCloneUIPrefabs.transform.SetParent(_TraNormal, false); break; case UIFormType.Fixed: //固定窗体节点 goCloneUIPrefabs.transform.SetParent(_TraFixed, false); break; case UIFormType.Popup: //弹出窗体节点 goCloneUIPrefabs.transform.SetParent(_TraPopup, false); break; default: break; } //设置隐藏 goCloneUIPrefabs.SetActive(false); //把克隆体,加入到“所有UI窗体”(缓存)集合中。 _DicAllUIForms.Add(uiFormName, baseUIForm); return(baseUIForm); } else { Debug.Log("_TraCanvasTransform == null || goCloneUIPrefabs == null"); return(null); } }
/// <summary> /// 显示(打开)UI窗体 /// 功能: /// 1: 根据UI窗体的名称,加载到“所有UI窗体”缓存集合中 /// 2: 根据不同的UI窗体的“显示模式”,分别作不同的加载处理 /// </summary> /// <param name="uiFormName">UI窗体预设的名称</param> public void ShowUIForms(string uiFormName, Action <BaseUIForm> setParamHandler = null) { BaseUIForm baseUIForms = null; //UI窗体基类 //参数的检查 if (string.IsNullOrEmpty(uiFormName)) { return; } //根据UI窗体的名称,加载到“所有UI窗体”缓存集合中 baseUIForms = LoadFormsToAllUIFormsCatch(uiFormName); if (baseUIForms == null) { return; } //是否清空“栈集合”中得数据 if (baseUIForms.CurrentUIType.IsClearStack) { ClearStackArray(); } //设置参数 if (setParamHandler != null) { setParamHandler(baseUIForms); } //根据不同的UI窗体的显示模式,分别作不同的加载处理 switch (baseUIForms.CurrentUIType.UIForms_ShowMode) { case UIFormShowMode.Normal: //“普通显示”窗口模式 //把当前窗体加载到“当前窗体”集合中。 LoadUIToCurrentCache(uiFormName); break; case UIFormShowMode.ReverseChange: //需要“反向切换”窗口模式 PushUIFormToStack(uiFormName); break; case UIFormShowMode.HideOther: //“隐藏其他”窗口模式 EnterUIFormsAndHideOther(uiFormName); break; default: break; } }
/// <summary> /// 加载指定名称的“UI窗体” /// 功能: /// 1:根据“UI窗体名称”,加载预设克隆体。 /// 2:根据不同预设克隆体中带的脚本中不同的“位置信息”,加载到“根窗体”下不同的节点。 /// 3:隐藏刚创建的UI克隆体。 /// 4:把克隆体,加入到“所有UI窗体”(缓存)集合中。 /// /// </summary> /// <param name="uiFormName">UI窗体名称</param> private BaseUIForm LoadUIForm(string uiFormName) { GameObject goCloneUIPrefabs = null; //创建的UI克隆体预设 BaseUIForm baseUiForm = null; //窗体基类 goCloneUIPrefabs = ResMgr.instance.LoadAsset(uiFormName, false); //设置“UI克隆体”的父节点(根据克隆体中带的脚本中不同的“位置信息”) if (_TraCanvasTransfrom != null && goCloneUIPrefabs != null) { baseUiForm = goCloneUIPrefabs.GetComponent <BaseUIForm>(); if (baseUiForm == null) { Debug.Log("baseUiForm==null! ,请先确认窗体预设对象上是否加载了baseUIForm的子类脚本! 参数 uiFormName=" + uiFormName); return(null); } switch (baseUiForm.CurrentUIType.UIForms_Type) { case UIFormType.Normal: //普通窗体节点 goCloneUIPrefabs.transform.SetParent(_TraNormal, false); break; case UIFormType.Fixed: //固定窗体节点 goCloneUIPrefabs.transform.SetParent(_TraFixed, false); break; case UIFormType.PopUp: //弹出窗体节点 goCloneUIPrefabs.transform.SetParent(_TraPopUp, false); break; default: break; } //设置隐藏(注意,改过) //goCloneUIPrefabs.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); }//Mehtod_end
/// <summary> /// 根据UI窗体的名称,加载到“所有UI窗体”缓存集合中 /// 功能: 检查“所有UI窗体”集合中,是否已经加载过,否则才加载。 /// </summary> /// <param name="uiFormsName">UI窗体(预设)的名称</param> /// <returns></returns> private void LoadFormsToAllUIFormsCatch(string uiFormsName) { BaseUIForm baseUIResult = null; //加载的返回UI窗体基类 _DicALLUIForms.TryGetValue(uiFormsName, out baseUIResult); if (baseUIResult == null) { //加载指定名称的“UI窗体” LoadUIForm(uiFormsName); } else { //如果没有本语句,则ShowUIForm 会执行无限循环。 _BaseUIForm = baseUIResult; } }
/// <summary> /// 反转窗体界面关闭 /// </summary> private void ReverseCloseUIForm() { if (_StaCurrentUIForm.Count >= 2) { BaseUIForm topUIForm = _StaCurrentUIForm.Pop(); topUIForm.Hiding(); BaseUIForm nextUIForm = _StaCurrentUIForm.Peek(); nextUIForm.Redisplay(); } else if (_StaCurrentUIForm.Count == 1) { BaseUIForm topUIForm = _StaCurrentUIForm.Pop(); topUIForm.Hiding(); } }
//反向切换属性窗体的出栈逻辑 private void PropUIForm() { if (_StaCurrentUIForms.Count >= 2) { BaseUIForm topUIForm = _StaCurrentUIForms.Pop(); topUIForm.Hiding(); //出栈后,下一个窗体做重新显示 BaseUIForm nextUIForm = _StaCurrentUIForms.Peek(); nextUIForm.ReDisplay(); } else if (_StaCurrentUIForms.Count == 1) { //出栈处理 BaseUIForm topUIForm = _StaCurrentUIForms.Pop(); topUIForm.Hiding(); } }
/// <summary> /// 公共方法:打开指定名称的窗体 /// 功能: /// 1.加载与判断指定的UI窗体的名称,加载到“所有UI窗体缓冲集合”中。 /// 2.根据不同的UI窗体的显示模式,分别作不同的加载处理。 /// </summary> /// <param name="uiFormName">窗体的名称</param> public void OpenUIForm(string uiFormName) { //参数检查 if (string.IsNullOrEmpty(uiFormName)) { return; } BaseUIForm baseUIForm = null; //UI窗体基类 //根据UI窗体的名称加载到“UI窗体缓冲集合”中 baseUIForm = LoadUIFormToAll(uiFormName); if (baseUIForm == null) { return; } //是否清空栈集合中的数据的判断 if (baseUIForm.CurrentUIType.IsCleanStack) { CleanStackArray(); } //作不同的加载处理 //TODO switch (baseUIForm.CurrentUIType.UIForms_ShowType) { //普通类型 case UIFormShowType.Normal: EnterUIForm(uiFormName); break; //反向切换类型 case UIFormShowType.ReverseChange: PushUIForm(uiFormName); break; //隐藏其他类型 case UIFormShowType.HideOther: EnterUIForm_HideOther(uiFormName); break; } }
/// <summary> /// 显示(打开)UI窗体 /// 功能: /// 1: 根据UI窗体的名称,加载到“所有UI窗体”缓存集合中 /// 2: 根据不同的UI窗体的“显示模式”,分别作不同的加载处理 /// </summary> /// <param name="uiFormName">UI窗体预设的名称</param> public void ShowUIForms(string uiFormName) { BaseUIForm baseUIForms = null; //UI窗体基类 //参数的检查 if (string.IsNullOrEmpty(uiFormName)) { return; } //根据UI窗体的名称,加载到“所有UI窗体”缓存集合中 baseUIForms = LoadFormsToAllUIFormsCatch(uiFormName); if (baseUIForms == null) { return; } //一个栈结构跳转到另外一个栈结构 需要清空之前的栈 if (baseUIForms.CurrentUIType.isClearStack) { ClearStack(); } //根据不同的UI窗体的显示模式,分别作不同的加载处理 switch (baseUIForms.CurrentUIType.UIForms_ShowMode) { case UIFormShowMode.Normal: //“普通显示”窗口模式 //Todo..... LoadUIToCurrentCache(uiFormName); break; case UIFormShowMode.ReverseChange: //需要“反向切换”窗口模式 PushUIFormToStack(uiFormName); break; case UIFormShowMode.HideOther: //“隐藏其他”窗口模式 EnterUIFormHideOthers(uiFormName); break; default: break; } }
/// <summary> /// UI窗体入栈 /// </summary> /// <param name="uiFormName">窗体名称</param> private void PushUIFormToStack(string uiFormName) { BaseUIForm baseUIForm; if (_StaCurrentUIForms.Count > 0) { BaseUIForm topUIForm = _StaCurrentUIForms.Peek(); topUIForm.Freeze(); } _DicAllUIForms.TryGetValue(uiFormName, out baseUIForm); if (baseUIForm != null) { baseUIForm.Display(); _StaCurrentUIForms.Push(baseUIForm); } else { Debug.Log("baseUIForm == null"); } }
/// <summary> /// 反向切换类型的窗体的退出 /// (反向切换类型的窗体的出栈,退出这个窗体) /// </summary> private void PopUIForm() { if (_StaCurrentUIForms.Count > 1) { //出栈处理 BaseUIForm topUIForm = _StaCurrentUIForms.Pop(); //做隐藏处理 topUIForm.Hiding(); //下一个窗体重新显示 BaseUIForm nextUIForm = _StaCurrentUIForms.Peek(); nextUIForm.Redisplay(); } else if (_StaCurrentUIForms.Count == 1) { //出栈处理 BaseUIForm topUIForm = _StaCurrentUIForms.Pop(); //做隐藏处理 topUIForm.Hiding(); } }
//(“反向切换”属性)窗体的出栈逻辑 private void PopUIFroms() { if (_StaCurrentUIForms.Count >= 2) { //出栈处理 BaseUIForm topUIForms = _StaCurrentUIForms.Pop(); //做隐藏处理 topUIForms.Hiding(); //出栈后,下一个窗体做“重新显示”处理。 BaseUIForm nextUIForms = _StaCurrentUIForms.Peek(); nextUIForms.Redisplay(); } else if (_StaCurrentUIForms.Count == 1) { //出栈处理 BaseUIForm topUIForms = _StaCurrentUIForms.Pop(); //做隐藏处理 topUIForms.Hiding(); } }
/// <summary> /// 反向切换类型的窗体的进入 /// (UI窗体的入栈,显示指定名称的窗体) /// </summary> /// <param name="uiFormName">窗体的名称</param> private void PushUIForm(string uiFormName) { BaseUIForm baseUIForm; //UI窗体 //判断栈集合中,是否有其他的窗体,有则进行冻结处理 if (_StaCurrentUIForms.Count > 0) { BaseUIForm topUIForm = _StaCurrentUIForms.Peek(); topUIForm.Freeze(); } //判断“所有UI窗体”集合是否有指定的UI窗体,有则处理 _DicAllUIForms.TryGetValue(uiFormName, out baseUIForm); if (baseUIForm == null) { return; } //把指定的UI窗体入栈 _StaCurrentUIForms.Push(baseUIForm); //显示窗体 baseUIForm.Display(); }
/// <summary> /// UI窗体入栈 /// </summary> /// <param name="窗体名字"></param> private void PushUIFormToStack(string uiFormName) { BaseUIForm currentUIForm; //判断栈集合中 是否有其他窗体 如果有 冻结处理 if (_StaCurrentUIForm.Count > 0) { BaseUIForm topUIForm = _StaCurrentUIForm.Peek(); topUIForm.Freeze(); } //判断UI所有窗体 是否有指定UI 有则处理 没有报错 _DicALLUIForms.TryGetValue(uiFormName, out currentUIForm); if (currentUIForm != null) { currentUIForm.Display(); //入栈 _StaCurrentUIForm.Push(currentUIForm); } else { Debug.LogError("UI 加载错误"); } }
/// <summary> /// 显示(打开)UI窗体 /// 1: 根据UI窗体的名称,加载到“所有UI窗体”缓存集合中 /// 2: 根据不同的UI窗体的“显示模式”,分别作不同的加载处理 /// </summary> /// <param name="uiFormName">UI窗体预设的名称</param> public void ShowUIForms(string uiFormName) { BaseUIForm baseUIForm = null; //UI窗体基类 if (string.IsNullOrEmpty(uiFormName)) { return; } baseUIForm = LoadFormsToAllUIFormsCatch(uiFormName); if (baseUIForm == null) { return; } //是否清空栈集合中的数据 if (baseUIForm.CurrentUIType.IsClearStack) { ClearStackArray(); } switch (baseUIForm.CurrentUIType.UIForms_ShowMode) { case UIFormShowMode.Normal: LoadUIToCurrentCache(uiFormName); break; case UIFormShowMode.ReverseChange: PushUIFormToStack(uiFormName); break; case UIFormShowMode.HideOther: EnterUIFormsAndHideOther(uiFormName); break; default: break; } }
/// <summary> /// 显示(打开)UI窗体 /// 功能: /// 1: 根据UI窗体的名称,加载到“所有UI窗体”缓存集合中 /// 2: 根据不同的UI窗体的“显示模式”,分别作不同的加载处理 /// /// /// 修改记录: /// 本方法修改目的是让大量UI窗体可以直接打开相应的目标窗体。 /// 即不受窗体位置(UIFormType)与窗体显示类型(UIFormShowMode)的限制。 /// /// /// </summary> /// <param name="uiFormName">UI窗体预设的名称</param> /// <param name="IsRedirection">是否直接转向目标窗体</param> public IEnumerator ShowUIForm(string uiFormName, bool IsRedirection = false) { BaseUIForm baseUIForms = null; //UI窗体基类 //参数的检查 if (string.IsNullOrEmpty(uiFormName)) { yield break; } //等待UI根窗体初始化完毕 while (!_IsUIRootNodeInitFinish) { yield return(null); //等待 } //根据UI窗体的名称,加载到“所有UI窗体”缓存集合中 LoadFormsToAllUIFormsCatch(uiFormName);//此时UI预设窗体(根据“位置模式”)已经加载到层级试图的相应位置了 //等待UI窗体父类对象被赋值 while (_BaseUIForm == null) { yield return(null); //等待 } baseUIForms = _BaseUIForm; //是否清空“栈集合”中得数据(如果直接转向,则直接清空“栈集合”) if (IsRedirection || baseUIForms.CurrentUIType.IsClearStack)//Modify by 20180918 { ClearStackArray(); } //直接转向 if (IsRedirection) //Adding by 20180918 { //“隐藏其他”窗口模式 EnterUIFormsAndHideOther(uiFormName); } else { //根据不同的UI窗体的显示模式,分别作不同的加载处理 switch (baseUIForms.CurrentUIType.UIForms_ShowMode) { case UIFormShowMode.Normal: //“普通显示”窗口模式 //把当前窗体加载到“当前窗体”集合中。 LoadUIToCurrentCache(uiFormName); break; case UIFormShowMode.ReverseChange: //需要“反向切换”窗口模式 PushUIFormToStack(uiFormName); break; case UIFormShowMode.HideOther: //“隐藏其他”窗口模式 EnterUIFormsAndHideOther(uiFormName); break; default: break; } } //UI窗体父类对象,置空处理,为下一次加载窗体服务 _BaseUIForm = null; }//ShowUIForms()_end
/// <summary> /// 加载指定名称的“UI窗体” /// 功能: /// 1:根据“UI窗体名称”,加载预设克隆体。 /// 2:根据不同预设克隆体中带的脚本中不同的“位置信息”,加载到“根窗体”下不同的节点。 /// 3:隐藏刚创建的UI克隆体。 /// 4:把克隆体,加入到“所有UI窗体”(缓存)集合中。 /// /// </summary> /// <param name="uiFormName">UI窗体名称</param> private BaseUIForm LoadUIForm(string uiFormName) { string strUIFormPaths = null; //UI窗体路径 GameObject goCloneUIPrefabs = null; //创建的UI克隆体预设 BaseUIForm baseUiForm = null; //窗体基类 //根据UI窗体名称,得到对应的加载路径 _DicFormsPaths.TryGetValue(uiFormName, out strUIFormPaths); //根据“UI窗体名称”,加载“预设克隆体” if (!string.IsNullOrEmpty(strUIFormPaths)) { goCloneUIPrefabs = ResourcesMgr.GetInstance().LoadAsset(strUIFormPaths, false); } //设置“UI克隆体”的父节点(根据克隆体中带的脚本中不同的“位置信息”) if (_TraCanvasTransfrom != null && goCloneUIPrefabs != null) { baseUiForm = goCloneUIPrefabs.GetComponent <BaseUIForm>(); if (baseUiForm == null) { Debug.Log("baseUiForm==null! ,请先确认窗体预设对象上是否加载了baseUIForm的子类脚本! 参数 uiFormName=" + uiFormName); return(null); } switch (baseUiForm.CurrentUIType.UIForms_Type) { case UIFormType.Normal: //普通窗体节点 goCloneUIPrefabs.transform.SetParent(_TraNormal, false); break; case UIFormType.Fixed: //固定窗体节点 goCloneUIPrefabs.transform.SetParent(_TraFixed, false); break; case UIFormType.PopUp: //弹出窗体节点 goCloneUIPrefabs.transform.SetParent(_TraPopUp, false); break; case UIFormType.Tips: goCloneUIPrefabs.transform.SetParent(_TraTips, false); break; default: break; } if (Loadinitialization != null) { Loadinitialization(uiFormName, baseUiForm); } //设置隐藏 goCloneUIPrefabs.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); }//Mehtod_end
/// <summary> /// 加载指定名称的“UI窗体” /// 功能: /// 1:根据“UI窗体名称”,加载预设克隆体。 /// 2:根据不同预设克隆体中带的脚本中不同的“位置信息”,加载到“根窗体”下不同的节点。 /// 3:隐藏刚创建的UI克隆体。 /// 4:把克隆体,加入到“所有UI窗体”(缓存)集合中。 /// /// </summary> /// <param name="uiFormName">UI窗体名称</param> private BaseUIForm LoadUIForm(string uiFormName) { string strUIFormPaths = uiFormName; //UI窗体路径 GameObject goCloneUIPrefabs = null; //创建的UI克隆体预设 BaseUIForm baseUiForm = null; //窗体基类 //根据UI窗体名称,得到对应的加载路径 //_DicFormsPaths.TryGetValue(uiFormName, out strUIFormPaths); //根据“UI窗体名称”,加载“预设克隆体” if (!string.IsNullOrEmpty(strUIFormPaths)) { goCloneUIPrefabs = OpenUIPanel(strUIFormPaths); } UIControlData ctrlData = goCloneUIPrefabs.GetComponent <UIControlData>(); CBLuaPanel luaPanel = GetLuaPanel(uiFormName, ctrlData); if (luaPanel == null) { //C# 脚本逻辑 IBindableUI uiA = Activator.CreateInstance(Type.GetType(uiFormName)) as IBindableUI; baseUiForm = uiA as BaseUIForm; } else { //Lua 逻辑 baseUiForm = luaPanel as BaseUIForm; } baseUiForm.Source = goCloneUIPrefabs; if (ctrlData != null) { ctrlData.BindDataTo(baseUiForm); } //设置“UI克隆体”的父节点(根据克隆体中带的脚本中不同的“位置信息”) if (_TraCanvasTransfrom != null && goCloneUIPrefabs != null) { //baseUiForm = goCloneUIPrefabs.GetComponent<BaseUIForm>(); if (baseUiForm == null) { Debug.Log("baseUiForm==null! ,请先确认窗体预设对象上是否加载了baseUIForm的子类脚本! 参数 uiFormName=" + uiFormName); return(null); } baseUiForm.OnReady(); switch (baseUiForm.CurrentUIType.UIForms_Type) { case UIFormType.Normal: //普通窗体节点 goCloneUIPrefabs.transform.SetParent(_TraNormal, false); break; case UIFormType.Fixed: //固定窗体节点 goCloneUIPrefabs.transform.SetParent(_TraFixed, false); break; case UIFormType.PopUp: //弹出窗体节点 goCloneUIPrefabs.transform.SetParent(_TraPopUp, false); break; default: break; } //设置隐藏 goCloneUIPrefabs.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); }//Mehtod_end
void DisPlay(BaseUIForm baseForm) { baseForm.Display(); }