| using System.Collections.Generic; | 
| using UnityEngine; | 
|   | 
| /// <summary> | 
| /// 弹窗处理器 - 负责管理游戏中的弹窗队列,按顺序显示弹窗窗口 | 
| /// 避免多个窗口同时弹出造成界面混乱 | 
| /// 只有在homewin打开的情况下才触发 | 
| /// </summary> | 
| public class PopupWindowsProcessor : SingletonMonobehaviour<PopupWindowsProcessor> | 
| { | 
|     // 弹窗队列,存储待处理的弹窗请求 | 
|     List<PopupWindow> popupWindowQueue = new List<PopupWindow>(); | 
|   | 
|     // 当前正在显示的弹窗 | 
|     PopupWindow currentWindow; | 
|   | 
|     float firstTime = 0; //打开HomeWin时的时间 | 
|     float stayTime; | 
|     bool homeWinFirstOpened = false; //HomeWin是否第一次打开 | 
|   | 
|   | 
|     // 上次弹窗时间,用于控制弹窗之间的间隔 | 
|     float lastTime = 0; //上次弹窗时间 | 
|   | 
|     /// <summary> | 
|     /// 添加一个弹窗到处理队列 | 
|     /// </summary> | 
|     /// <param name="name">窗口名称</param> | 
|     /// <param name="functionId">功能ID,用于指定窗口的具体功能或显示模式</param> | 
|     public void Add(string name, bool isNeedHomeWin = true, int functionId = 0) | 
|     { | 
|         var popupWindow = new PopupWindow() | 
|         { | 
|             window = name, | 
|             isNeedHomeWin = isNeedHomeWin, | 
|             functionId = functionId, | 
|         }; | 
|   | 
|         if (popupWindowQueue.Contains(popupWindow)) | 
|         { | 
|             popupWindowQueue.Remove(popupWindow); | 
|         } | 
|   | 
|         popupWindowQueue.Add(popupWindow); | 
|         popupWindowQueue.Sort((x, y) => y.isNeedHomeWin.CompareTo(x.isNeedHomeWin)); | 
|     } | 
|   | 
|     /// <summary> | 
|     /// 从处理队列中移除指定的弹窗 | 
|     /// </summary> | 
|     /// <param name="name">窗口名称</param> | 
|     /// <param name="functionId">功能ID</param> | 
|     public void Remove(string name, bool isNeedHomeWin = true, int functionId = 0) | 
|     { | 
|         var popupWindow = new PopupWindow() | 
|         { | 
|             window = name, | 
|             isNeedHomeWin = isNeedHomeWin, | 
|             functionId = functionId, | 
|         }; | 
|   | 
|         if (popupWindowQueue.Contains(popupWindow)) | 
|         { | 
|             popupWindowQueue.Remove(popupWindow); | 
|         } | 
|     } | 
|   | 
|   | 
|     /// <summary> | 
|     /// LateUpdate中处理弹窗队列,确保在所有其他逻辑处理完毕后才显示弹窗 | 
|     /// </summary> | 
|     private void LateUpdate() | 
|     { | 
|         //打开窗口需要时间,不然会导致队列中的窗口全部同时打开 | 
|         if (Time.realtimeSinceStartup - lastTime < 1) | 
|             return; | 
|   | 
|         // 检查玩家是否完成登录加载 | 
|         if (!DTC0403_tagPlayerLoginLoadOK.finishedLogin) | 
|             return; | 
|   | 
|         // 检查是否进入游戏主场景 | 
|         if (StageManager.Instance.currentStage != StageName.Game) | 
|         { | 
|             return; | 
|         } | 
|   | 
|         // 检查是否在新手引导中 | 
|         if (NewBieCenter.Instance.inGuiding) | 
|         { | 
|             return; | 
|         } | 
|   | 
|         if (popupWindowQueue.Count == 0) | 
|         { | 
|             return; | 
|         } | 
|   | 
|         // 检查是否正在显示Loading窗口 | 
|         if (UIManager.Instance.IsOpened<LoadingWin>()) | 
|             return; | 
|   | 
|         if (!UIManager.Instance.IsOpened<HomeWin>() && popupWindowQueue[0].isNeedHomeWin) | 
|             return; | 
|   | 
|         // 进入游戏第一次推送做延迟处理 | 
|         if (!homeWinFirstOpened) | 
|         { | 
|             firstTime = Time.realtimeSinceStartup; | 
|             homeWinFirstOpened = true; | 
|             stayTime = float.Parse(FuncConfigConfig.Get("PopWin").Numerical1); | 
|             return; | 
|         } | 
|         // 等待x秒 | 
|         if (Time.realtimeSinceStartup - firstTime < stayTime) | 
|             return; | 
|          | 
|         // 只在“没有战斗”和“主线战斗”时允许弹窗 | 
|         string activeBattleName = BattleManager.Instance.GetActiveBattleName(); | 
|         if (activeBattleName != "" && activeBattleName != "StoryBattleField") | 
|             return; | 
|   | 
|         if (UIManager.Instance.IsOpened(popupWindowQueue[0].window)) | 
|         { | 
|             //当前模式可以打开多个相同窗口,增加防范 | 
|             return; | 
|         } | 
|   | 
|         if (UIManager.Instance.ExistAnyFullScreenOrMaskWin(popupWindowQueue[0].window)) | 
|             return; | 
|   | 
|         if (currentWindow != null && currentWindow.window != null) | 
|         { | 
|             //判断上一个推送是否关闭 | 
|             UIBase ui = UIManager.Instance.GetUI(currentWindow.window); | 
|             if (ui != null && ui.IsActive()) | 
|                 return; | 
|         } | 
|   | 
|         currentWindow = popupWindowQueue[0]; | 
|         popupWindowQueue.RemoveAt(0); | 
|         UIManager.Instance.OpenWindow(currentWindow.window, currentWindow.functionId); | 
|         Debug.LogFormat("推送窗口 " + currentWindow.window); | 
|   | 
|         lastTime = Time.realtimeSinceStartup; | 
|     } | 
|   | 
|     /// <summary> | 
|     /// 弹窗结构体,用于表示一个待处理的弹窗请求 | 
|     /// 包含窗口名称和功能ID,通过这两个字段可以唯一标识一个弹窗请求 | 
|     /// </summary> | 
|     public class PopupWindow | 
|     { | 
|         // 窗口名称 | 
|         public string window; | 
|   | 
|         // 功能ID,用于指定窗口的具体功能或显示模式 | 
|         public int functionId; | 
|   | 
|         public bool isNeedHomeWin; | 
|     } | 
|   | 
| } |