【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;
}
}