【MVC界面框架搭建 一】

21 篇文章 1 订阅
17 篇文章 0 订阅

【MVC界面框架搭建】
1.界面的Ctrl 层基类
Ctrl 的分类,
总界面:PanelCtrl
子界面 :SubCtrl
单元界面: ItemCtrl
总界面可以加载子界面, 总界面,子界面,单元界面都可以再次载入单元界面
减少大量子界面,单元界面的重复构建,加快界面的开发效率:
支持界面的Prefab 的摧毁和恢复,Ctrl 层的动态数据保存,可以用类恢复界面

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using YooAsset;

namespace UIFrameWork 
{
    public enum CtrlType
    { 
        None =0,
        PanelCtrl,  //总面板
        SubCtrl,    //子面板
        ItemCtrl    //单元界面    
    }
    public enum PanalShowType
    { 
        None=0,
        Full,   //全屏界面
        Big,    //大型弹窗
        Mid,    //中型弹窗
        Small,  //小型弹窗
    }
    public abstract class UICtrlBase
    {
        protected Flow openFlow;        //打开
        protected Flow closeFlow;       //关闭
        protected Flow restoreFlow;     //恢复Prefab
        protected Flow destoryFlow;     //清理Prefab

        protected virtual string AssetPath { get { return ""; } } //资源地址
        public virtual string AssetName { get { return ""; } } //资源名称

        public virtual CtrlType ctrlType { get { return CtrlType.PanelCtrl; } }
        public virtual PanalShowType showType { get { return PanalShowType.Full; } }
        private int depth;

        protected GameObject panelGo;
        protected GameObject panelParent;
        protected ViewReference viewReference;

        private AssetOperationHandle Handle {set; get; }
        private System.Action<bool> loadCallBack;

        private EventG.StringObjectEvent ctrlEvent;
        protected UIViewBase uiViewBase;
        private System.Action<bool> openFinish;
        private System.Action closeFinish;
        
        protected object data;
        public void SetDepth(int pDepth) { depth = pDepth;}
        public void SetParent(GameObject pParent){ panelParent = pParent;}
        public void SetPanelGo(GameObject pPanelGO){panelGo = pPanelGO;}
        protected PolicyBase policyBase;
        public void SetPolicyBase(PolicyBase pPolicyBase) {policyBase = pPolicyBase;}
        private System.Action<UICtrlBase,System.Action<GameObject, GameObject>> getGoAndItemFunc;

        //注册获取Parent 和Panel 的方法
        public void SetFillPanelAndParentAction(System.Action<UICtrlBase,System.Action<GameObject,GameObject>> pGetGoAndItemFunc) {
            getGoAndItemFunc = pGetGoAndItemFunc;
        }
        //填充界面面板和父物体
        protected void FillPanelAndParent() {
            getGoAndItemFunc?.Invoke(this,(oParent, oPanelGo) => { if(panelGo == null)SetParent(oParent);if(panelGo == null) SetPanelGo(oPanelGo); });
        }
        protected virtual void OnInit() { }
        public void DoInit() { OnInit();}
        private bool isAddEvent = false;
        protected void DoAddEvents() {
            if (isAddEvent)
                return;
            isAddEvent = true;
            ctrlEvent = new EventG.StringObjectEvent();
            OnAddEvents();
        }
        protected virtual void OnAddEvents() { }
        protected void AddCtrlEvent(string eventkey,System.Action<object> eventvalue) {
            ctrlEvent.AddListener(eventkey, eventvalue);}
        protected void RemoveCtrlEvent(string eventkey, System.Action<object> eventvalue){
            ctrlEvent.RemoveListener(eventkey, eventvalue);
        }
        protected virtual void OnPostData(System.Action<bool> onFinish) { onFinish?.Invoke(true); }
        //界面切到前台
        public virtual void OnForward() { }
        protected void DoAttackCtrlsForward() {
            OnAttachCtrlsForward();
        }
        //附加Ctrls 切到前台
        protected virtual void OnAttachCtrlsForward() { 
            
        }
        //初始化界面显示
        protected void DoViewInit() { if(uiViewBase == null) OnViewInit(); }
        private bool isAttachCtrl = false;
        protected void DoAttachCtrls() { 
            if (isAttachCtrl) 
                return;
            OnAttachCtrls();
            isAttachCtrl = true;
        }
        //添加附加Ctrls
        protected virtual void OnAttachCtrls() { }
        //初始化界面信息
        protected virtual void OnViewInit() { }

        protected virtual void SetUIViewBase(UIViewBase pUIViewBase){
            uiViewBase = pUIViewBase;
            uiViewBase.SetCtrlEvnet(ctrlEvent);
        }

        //界面切到后台不显示
        public virtual void OnBackground() { }

        private bool isShow = false;
        public virtual void OnShow() { if (isShow) return;  panelGo?.SetActive(true); isShow = true; }
        public void DoHide() {OnHide();}
        protected virtual void OnHide() { if (!isShow) return; panelGo?.SetActive(false); isShow = false; }

        private void HandleCompleted(AssetOperationHandle handle)
        {
            if (handle.AssetObject == null)
            {
                loadCallBack?.Invoke(false);
                return;
            }
            // 实例化对象
            panelGo = handle.InstantiateSync(panelParent.transform);
            panelGo.transform.localPosition = new Vector3(0,0,0);
            viewReference = panelGo?.GetComponent<ViewReference>();
            loadCallBack?.Invoke(true);
        }
        protected void DoSetDepth() {
            OnSetDepth();
        }
        //设置深度
        protected void OnSetDepth() {
            panelGo.transform.localPosition = new Vector3(0, 0, -depth);
            var canvas = panelGo.GetComponentOrAdd<Canvas>();
            canvas.overrideSorting = true;
            canvas.sortingOrder = depth;
            panelGo.GetComponentOrAdd<UnityEngine.UI.GraphicRaycaster>();
        }
        //加载
        protected void OnLoad(System.Action<bool> pOnFinish)
        {
            if (panelGo != null)
            {
                if(viewReference == null)
                    viewReference = panelGo?.GetComponent<ViewReference>();
                pOnFinish?.Invoke(true);
            }
            else
            {
                loadCallBack = pOnFinish;
                Handle = YooAssets.LoadAssetAsync<GameObject>(AssetName);
                Handle.Completed += HandleCompleted;
            }
        }
        //卸载
        protected void OnUnLoad()
        {
            //释放引用
            if (Handle != null)
            {
                Handle.Release();
                Handle = null;
            }
            // 销毁面板对象
            if (panelGo != null)
            {
                OnDestroy();
                GameObject.Destroy(panelGo);
                panelGo = null;
                uiViewBase = null;
                viewReference = null;
            }
        }
        
        public void DoDestory() {
            DoRemoveEvents();
            OnUnLoad();
            isShow = false;
        }
        protected void DoRemoveEvents() {
            if (!isAddEvent)
                return;
            isAddEvent = false;
            OnRemoveEvents();
            ctrlEvent?.Clear();
            ctrlEvent = null;
        }
        protected virtual void OnRemoveEvents() { }
        protected virtual void OnDestroy() { }

        //打开界面
        public virtual void Open(System.Action<bool> pOnFinish){
            if (openFlow == null){
                pOnFinish?.Invoke(false);
                return;
            }
            openFinish = pOnFinish;
            openFlow.ResetAndPlay((oSuccess) => {
                Debug.Log($" panel open {this.AssetName} result {oSuccess}!!");
                openFinish?.Invoke(oSuccess);
            });
        }
        //关闭界面
        public virtual void Close(System.Action pOnFinish){
            if (closeFlow == null) {
                pOnFinish?.Invoke();
                return;
            }
            closeFinish = pOnFinish;
            closeFlow.ResetAndPlay((oSuccess) => {
                Debug.Log($" panel{AssetName} close result {oSuccess}!!");
                closeFinish?.Invoke();
            });
        }

        //还原界面 主要是恢复Prefab
        public virtual void Restore(System.Action<bool> pOnFinish) {
            restoreFlow.ResetAndPlay((oSuccess) => {
                Debug.Log($" panel{AssetName} Restore result {oSuccess}!!");
                pOnFinish?.Invoke(oSuccess);
            });
        }

        //仅销毁prefab 后续可恢复还原
        public virtual void DestoryPrefab(System.Action pOnFinish) {
            destoryFlow.ResetAndPlay((oSuccess) =>{
                Debug.Log($" panel{AssetName} DestoryPrefab result {oSuccess}!!");
                pOnFinish?.Invoke();
            });
        }

        private List<UICtrlItem> itemCtrls = new List<UICtrlItem>();

        //装载一个单元界面
        public void OpenItemCtrl(UICtrlItem pItemCtrl, System.Action<bool> pOnResult,bool pIsAdd = true)
        {
            pItemCtrl.DoInit();
            pItemCtrl.Open((oSuccess) => {
                if (oSuccess){
                    if(pIsAdd && !itemCtrls.Contains(pItemCtrl))
                        itemCtrls.Add(pItemCtrl);
                }
                pOnResult?.Invoke(oSuccess);
            });
        }

        //关闭所有单元界面
        public void CloseAllItemCtrls()
        {
            itemCtrls.ForEach((oCtrl) => {
                oCtrl.Close(null);
            });
            itemCtrls.Clear();
        }

        //摧毁单元界面
        public void DestoryAllItemCtrls() {
            itemCtrls.ForEach((oCtrl) => {
                oCtrl.DestoryPrefab(null);
            });
        }

        //还原单元界面
        public void RestoreAllItemCtrls(System.Action<bool> pOnFinish) 
        {
            if (itemCtrls.Count < 1)
            {
                pOnFinish?.Invoke(true);
            }
            else
            {
                int finishCount = 0;
                var mulCall = new MutilCall(itemCtrls.Count,()=> {
                    pOnFinish?.Invoke(finishCount >= itemCtrls.Count);
                });
                itemCtrls.ForEach((oCtrl) => {
                    oCtrl.Restore((oSuccess)=> {
                        if (oSuccess)
                            finishCount = finishCount + 1;
                        mulCall.OnOneFinish();
                    });
                });
            }
        }
    }
}


a.总界面:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using YooAsset;

namespace UIFrameWork
{
    /// <summary>
    /// 总面板的Ctrl 
    /// </summary>
    public class UICtrlPanel : UICtrlBase
    {
        private List<UICtrlSub> subCtrls = new List<UICtrlSub>();//子面板
           
        protected override void OnInit(){
            base.OnInit();
            //打开流程
            openFlow = new Flow("UICtrlPanelOpen");
            openFlow.AddNextSep((oResult) => {
                OnPostData((oSuccess)=> {
                    if (oSuccess){
                        oResult?.Invoke(StepResult.Next, 0, 0);
                    }
                    else{
                        oResult?.Invoke(StepResult.Stop, 0, 0);
                    }
                });
            });
            openFlow.AddNextSep((oResult) => {
                OnLoad((oSuccess) => {
                    if (oSuccess){
                        oResult?.Invoke(StepResult.Next, 0, 0);
                    }
                    else{
                        oResult?.Invoke(StepResult.Stop, 0, 0);
                    }
                });
            });
            openFlow.AddNextSep((oResult) => {
                DoSetDepth();
                DoAddEvents();
                DoViewInit();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            openFlow.AddNextSep((oResult) => {
                DoAttachCtrls();
                OnForward();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            openFlow.AddNextSep((oResult) =>{
                OnShow();
                DoAttackCtrlsForward();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            //关闭流程
            closeFlow = new Flow("UICtrlPanelClose");
            closeFlow.AddNextSep((oResult) => {
                OnHide();
                oResult?.Invoke( StepResult.Next,0,0);
            });
            closeFlow.AddNextSep((oResult) => {
                CloseAllSubCtrls();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            closeFlow.AddNextSep((oResult) => {
                DoDestory();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            //还原流程
            restoreFlow = new Flow("UICtrlPanelRestore");
            restoreFlow.AddNextSep((oResult) => {
                OnPostData((oSuccess) => {
                    if (oSuccess){
                        oResult?.Invoke(StepResult.Next, 0, 0);
                    }
                    else
                    {
                        oResult?.Invoke(StepResult.Stop, 0, 0);
                    }
                });
            });
            restoreFlow.AddNextSep((oResult) => {
                OnLoad((oSuccess) => {
                    if (oSuccess){
                        oResult?.Invoke(StepResult.Next, 0, 0);
                    }
                    else{
                        oResult?.Invoke(StepResult.Stop, 0, 0);
                    }
                });
            });
            restoreFlow.AddNextSep((oResult) => {
                DoSetDepth();
                DoAddEvents();
                DoViewInit();
                OnForward();
                OnShow();
                DoAttackCtrlsForward();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            restoreFlow.AddNextSep((oResult) => {
                RestoreAllSubCtrls((oSuccess) => {
                    if (oSuccess)
                        oResult?.Invoke(StepResult.Next, 0, 0);
                    else
                        oResult?.Invoke(StepResult.Stop, 0, 0);
                });
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            restoreFlow.AddNextSep((oResult) => {
                RestoreAllItemCtrls((oSuccess) => {
                    if (oSuccess)
                        oResult?.Invoke(StepResult.Next, 0, 0);
                    else
                        oResult?.Invoke(StepResult.Stop, 0, 0);
                });
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            //销毁界面流程(ctrl 存在可还原界面)
            destoryFlow = new Flow("UICtrlPanelDestory");
            destoryFlow.AddNextSep((oResult) => {
                DestoryAllItemCtrls();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            destoryFlow.AddNextSep((oResult) => {
                DestoryAllSubCtrls();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            destoryFlow.AddNextSep((oResult) => {
                DoDestory();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
        }
        
        //打开子界面
        public void OpenSubCtrl(UICtrlSub pSubCtrl,System.Action<bool> pOnResult,bool isNeedAdd = false) {
            pSubCtrl.DoInit();
            pSubCtrl.Open((oSuccess)=> {
                if (oSuccess) {
                    if(isNeedAdd && !subCtrls.Contains(pSubCtrl))
                        subCtrls.Add(pSubCtrl);
                }
                pOnResult?.Invoke(oSuccess);
            });
        }
        //关闭所有子界面
        public void CloseAllSubCtrls() {
            subCtrls.ForEach((oCtrl)=> {
                oCtrl.Close(null);
            });
            subCtrls.Clear();
        }
        //销毁子界面Prefab
        public void DestoryAllSubCtrls() {
            subCtrls.ForEach((oCtrl) => {
                oCtrl.DestoryPrefab(null);
            });
        }
        //还原子界面
        public void RestoreAllSubCtrls(System.Action<bool> pOnFinish) {
            if (subCtrls.Count < 1)
            {
                pOnFinish?.Invoke(true);
            }
            else
            {
                int finishCount = 0;
                var mulCall = new MutilCall(subCtrls.Count, () => {
                    pOnFinish?.Invoke(finishCount >= subCtrls.Count);
                });
                subCtrls.ForEach((oCtrl) => {
                    oCtrl.Restore((oSuccess) => {
                        if (oSuccess)
                            finishCount = finishCount + 1;
                        mulCall.OnOneFinish();
                    });
                });
            }
        }
    }
}


b.子界面:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using YooAsset;

namespace UIFrameWork
{
    /// <summary>
    /// 子面板的Ctrl 
    /// </summary>
    public class UICtrlSub : UICtrlBase
    {
        protected override void OnInit()
        {
            //打开界面流程
            openFlow = new Flow("UICtrlSubOpen");
            openFlow.AddNextSep((oResult) => {
                OnPostData((oSuccess) => {
                    if (oSuccess)
                        oResult?.Invoke(StepResult.Next, 0, 0);
                    else
                        oResult?.Invoke(StepResult.Stop, 0, 0);
                });
            });
            openFlow.AddNextSep((oResult) => {
                FillPanelAndParent();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            openFlow.AddNextSep((oResult) => {
                OnLoad((oSuccess) => {
                    if (oSuccess)
                        oResult?.Invoke(StepResult.Next, 0, 0);
                    else
                        oResult?.Invoke(StepResult.Stop, 0, 0);
                });
            });
            openFlow.AddNextSep((oResult) => {
                DoAddEvents();
                DoViewInit();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            openFlow.AddNextSep((oResult) => {
                DoAttachCtrls();
                OnForward();
                OnShow();
                DoAttackCtrlsForward();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            //关闭界面流程
            closeFlow = new Flow("UICtrlSubClose");
            closeFlow.AddNextSep((oResult) => {
                CloseAllItemCtrls();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            closeFlow.AddNextSep((oResult) => {
                DoDestory();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            //摧毁界面流程
            destoryFlow = new Flow("UICtrlItemDestory");
            destoryFlow.AddNextSep((oResult) => {
                DestoryAllItemCtrls();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            destoryFlow.AddNextSep((oResult) => {
                DoDestory();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            //还原流程
            restoreFlow = new Flow("UICtrlItemRestore");
            restoreFlow.AddNextSep((oResult) => {
                FillPanelAndParent();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            restoreFlow.AddNextSep((oResult) => {
                OnLoad((oSuccess) => {
                    if (oSuccess)
                        oResult?.Invoke(StepResult.Next, 0, 0);
                    else
                        oResult?.Invoke(StepResult.Stop, 0, 0);
                });
            });
            restoreFlow.AddNextSep((oResult) => {
                DoAddEvents();
                DoViewInit();
                OnForward();
                OnShow();
                DoAttackCtrlsForward();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            restoreFlow.AddNextSep((oResult) => {
                RestoreAllItemCtrls((oSuccess) => {
                    if (oSuccess)
                        oResult?.Invoke(StepResult.Next, 0, 0);
                    else
                        oResult?.Invoke(StepResult.Stop, 0, 0);
                });
            });        }
    }
}

c.单元界面:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace UIFrameWork
{
    /// <summary>
    /// 单元界面
    /// </summary>
    public class UICtrlItem : UICtrlBase
    {
        protected override void OnInit()
        {
            //打开界面流程
            openFlow = new Flow("UICtrlItemOpen");
            openFlow.AddNextSep((oResult) => {
                FillPanelAndParent();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            openFlow.AddNextSep((oResult) => {
                OnLoad((oSuccess) => {
                    if (oSuccess)
                        oResult?.Invoke(StepResult.Next, 0, 0);
                    else
                        oResult?.Invoke(StepResult.Stop, 0, 0);
                });
            });
            openFlow.AddNextSep((oResult) => {
                DoAddEvents();
                DoViewInit();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            openFlow.AddNextSep((oResult) => {
                DoAttachCtrls();
                OnForward();
                OnShow();
                DoAttackCtrlsForward();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            //关闭界面流程
            closeFlow = new Flow("UICtrlItemClose");
            closeFlow.AddNextSep((oResult) => {
                CloseAllItemCtrls();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            closeFlow.AddNextSep((oResult) => {
                DoDestory();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            //摧毁界面流程
            destoryFlow = new Flow("UICtrlItemDestory");
            destoryFlow.AddNextSep((oResult) => {
                DestoryAllItemCtrls();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            destoryFlow.AddNextSep((oResult) => {
                DoDestory();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });

            //还原流程
            restoreFlow = new Flow("UICtrlItemRestore");
            restoreFlow.AddNextSep((oResult) => {
                FillPanelAndParent();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            restoreFlow.AddNextSep((oResult) => {
                OnLoad((oSuccess) => {
                    if (oSuccess)
                        oResult?.Invoke(StepResult.Next, 0, 0);
                    else
                        oResult?.Invoke(StepResult.Stop, 0, 0);
                });
            });
            restoreFlow.AddNextSep((oResult) => {
                RestoreAllItemCtrls((oSuccess) => {
                    if (oSuccess)
                        oResult?.Invoke(StepResult.Next, 0, 0);
                    else
                        oResult?.Invoke(StepResult.Stop, 0, 0);
                });
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
            restoreFlow.AddNextSep((oResult) => {
                DoAddEvents();
                OnForward();
                DoAttackCtrlsForward();
                oResult?.Invoke(StepResult.Next, 0, 0);
            });
        }
    }
}


2.界面的打开策略:
a. 栈式打开策略 同一时间只允许一个打开操作
b.PolicySingle 打开单独界面 有界面的时候,不会再打开其他界面 比例系统级别的提示弹窗 ,加载界面等
c. 同时可以打开多个界面 比如tips 重复弹出之类的

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace UIFrameWork
{
    public enum LastPanelOp 
    { 
        None = 0,
        Hide = 1,
        Destory = 2,
    }
    /// <summary>
    /// 怎么打开界面的策略
    /// </summary>
    public class PolicyBase
    {
        public GameObject Root;
        public int startZ;
        public int offZ;
        protected List<UICtrlBase> ctrlBases = new List<UICtrlBase>();
        protected List<PerformData> performCatchDatas = new List<PerformData>();
        protected PerformData curPerformData;

        public PolicyBase() { }

        public int CtrlsCount() {
            return ctrlBases.Count;
        }
        public PolicyBase(GameObject pRoot, int pStartZ, int pOffZ)
        {
            this.Root = pRoot;
            startZ = pStartZ;
            offZ = pOffZ;
        }
        public int GetCurDepth() {
            return startZ + ctrlBases.Count * offZ;
        }
        public virtual void OpenCtrl(UICtrlBase pCtrlBase, System.Action pOnFinish, LastPanelOp pLastPanelOp = LastPanelOp.None, object pData = null) {}

        protected void LoopOpenAllCathePerfroms(System.Action pOnFinish) {
            if (curPerformData != null) {
                return;
            }
            if (performCatchDatas.Count < 1) {
                pOnFinish?.Invoke();
            }
            else
            {
                curPerformData = performCatchDatas[0];
                OpenCtrlInternal(curPerformData, () => {
                    performCatchDatas.RemoveAt(0);
                    curPerformData = null;
                    LoopOpenAllCathePerfroms(pOnFinish);
                });
            }
        }

        protected void OpenCtrlInternal(PerformData pPerformData, System.Action pOnFinish) {
            var ctrl = pPerformData.ctrlBase;
            var curDepth = GetCurDepth();
            ctrl.SetDepth(curDepth);
            ctrl.SetPolicyBase(this);
            ctrl.DoInit();
            ctrl.Open((oSuccess) => {
                if (oSuccess)
                {
                    if (pPerformData.lastPanelOp != LastPanelOp.None && ctrlBases.Count > 0)
                    {
                        var popCtrl = ctrlBases[ctrlBases.Count - 1];
                        if (popCtrl != null)
                        {
                            switch (pPerformData.lastPanelOp)
                            {
                                case LastPanelOp.Hide: //对上层界面进行隐藏处理
                                    popCtrl.OnBackground();
                                    popCtrl.DoHide();
                                    break;
                                case LastPanelOp.Destory://对上层界面进行销毁处理
                                    popCtrl.OnBackground();
                                    popCtrl.DoDestory();
                                    break;
                                default:
                                    popCtrl.OnBackground();
                                    break;
                            }
                        }
                    }
                    ctrlBases.Add(ctrl);
                }
                pPerformData.onFinish?.Invoke();
                pOnFinish?.Invoke();
            });
        }

        /// <summary>
        /// 关闭最上层界面 
        /// </summary>
        /// <param name="withFirst">//是否将最早打开的界面也关闭 </param>
        public virtual void CloseTopCtrl(bool withFirst = false) {
            if (ctrlBases.Count > 0) {
                if (ctrlBases.Count > 1)
                {
                    var lastTopCtrl = ctrlBases[ctrlBases.Count - 2];
                    var topCtrl = ctrlBases[ctrlBases.Count - 1];
                    lastTopCtrl.Open(null);
                    topCtrl.Close(null);
                    ctrlBases.Remove(topCtrl);
                }
                else
                {
                    if (withFirst) {
                        var topCtrl = ctrlBases[ctrlBases.Count - 1];
                        topCtrl.Close(null);
                    }
                }
            }
        }

        /// <summary>
        /// 关闭所有界面直到回到最底层界面
        /// </summary>
        public virtual void CloseToHomeCtrl() {
            if (ctrlBases.Count > 1)
            {
                for (var i = ctrlBases.Count - 1; i >= 0; i--) {
                    var ctrl = ctrlBases[i];
                    if (i > 0) {
                        ctrl.Close(null);
                        ctrlBases.RemoveAt(i);
                    }
                    else
                    {
                        ctrl.Open(null);
                    }
                }
            }
        }

        /// <summary>
        /// 关闭所有界面
        /// </summary>
        public virtual void CloseAllCtrl()
        {
            if (ctrlBases.Count > 0)
            {
                for (var i = ctrlBases.Count - 1; i >= 0; i--)
                {
                    var ctrl = ctrlBases[i];
                    ctrl.Close(null);
                    ctrlBases.RemoveAt(i);
                }
            }
        }

        //销毁所有界面 但是ctrl 保留后面可恢复
        public virtual void DestoryAllCtrl(System.Action pOnFinish) {
            if (ctrlBases.Count > 0)
            {
                for (var i = ctrlBases.Count - 1; i >= 0; i--)
                {
                    var ctrl = ctrlBases[i];
                    ctrl.Close(null);
                }
                pOnFinish?.Invoke();
            }
            else {
                pOnFinish?.Invoke();
            }
        }
        //还原所有界面
        public virtual void RestoreAllCtrl(System.Action pOnFinish)
        {
            if (ctrlBases.Count > 0)
            {
                var mulCall = new MutilCall(ctrlBases.Count, () =>
                {
                    pOnFinish?.Invoke();
                    pOnFinish = null;
                });
                for (var i = ctrlBases.Count - 1; i >= 0; i--)
                {
                    var ctrl = ctrlBases[i];
                    ctrl.Restore((oSuccess) =>
                    {
                        if (oSuccess)
                        {
                            ctrl.OnForward();
                            if (ctrl.showType == PanalShowType.Full)
                            {
                                pOnFinish?.Invoke();
                                pOnFinish = null;
                            }
                        }
                        else {
                            Debug.LogError($"{ctrl.AssetName} Restore fail!!");
                        }
                        mulCall.OnOneFinish();
                    });
                    if (ctrl.showType == PanalShowType.Full)
                    {
                        break;
                    }
                }
            }
            else {
                pOnFinish?.Invoke();
                pOnFinish = null;
            }
        }

        /// <summary>
        /// 关闭某一个界面
        /// </summary>
        /// <param name="pBaseCtrl"></param>
        public virtual void CloseCtrl(UICtrlBase pBaseCtrl) {
            var index = ctrlBases.IndexOf(pBaseCtrl);
            if (index >= 0) {
                if (index < ctrlBases.Count - 1)
                {
                    var ctrl = ctrlBases[index];
                    ctrl.Close(null);
                    ctrlBases.Remove(ctrl);
                }
                else {
                    CloseTopCtrl();
                }
            }
        }

    }
    public class PerformData{
        public UICtrlBase ctrlBase;
        public object data;
        public System.Action onFinish;
        public LastPanelOp lastPanelOp;
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值