using System.Collections; using System.Collections.Generic; using UnityEngine; /// /// 弹窗处理器 - 负责管理游戏中的弹窗队列,按顺序显示弹窗窗口 /// 避免多个窗口同时弹出造成界面混乱 /// 只有在homewin打开的情况下才触发 /// public class PopupWindowsProcessor : SingletonMonobehaviour { // 弹窗队列,存储待处理的弹窗请求 List popupWindowQueue = new List(); // 当前正在显示的弹窗 PopupWindow currentWindow; // 上次弹窗时间,用于控制弹窗之间的间隔 float lastTime = 0; //上次弹窗时间 /// /// 添加一个弹窗到处理队列 /// /// 窗口名称 /// 功能ID,用于指定窗口的具体功能或显示模式 public void Add(string name, int functionId = 0) { var popupWindow = new PopupWindow() { window = name, functionId = functionId, }; if (popupWindowQueue.Contains(popupWindow)) { popupWindowQueue.Remove(popupWindow); } popupWindowQueue.Add(popupWindow); } /// /// 从处理队列中移除指定的弹窗 /// /// 窗口名称 /// 功能ID public void Remove(string name, int functionId = 0) { var popupWindow = new PopupWindow() { window = name, functionId = functionId, }; if (popupWindowQueue.Contains(popupWindow)) { popupWindowQueue.Remove(popupWindow); } } /// /// LateUpdate中处理弹窗队列,确保在所有其他逻辑处理完毕后才显示弹窗 /// 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()) return; if (!UIManager.Instance.IsOpened()) return; if (UIManager.Instance.IsOpened(popupWindowQueue[0].window)) { //当前模式可以打开多个相同窗口,增加防范 return; } if (UIManager.Instance.ExistAnyFullScreenOrMaskWin(popupWindowQueue[0].window)) return; if (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; } /// /// 弹窗结构体,用于表示一个待处理的弹窗请求 /// 包含窗口名称和功能ID,通过这两个字段可以唯一标识一个弹窗请求 /// public struct PopupWindow { // 窗口名称 public string window; // 功能ID,用于指定窗口的具体功能或显示模式 public int functionId; public static bool operator ==(PopupWindow lhs, PopupWindow rhs) { return lhs.window == rhs.window && lhs.functionId == rhs.functionId; } public static bool operator !=(PopupWindow lhs, PopupWindow rhs) { return lhs.window != rhs.window || lhs.functionId != rhs.functionId; } // 添加GetHashCode和Equals方法以确保结构体可以正确比较 public override bool Equals(object obj) { if (obj is PopupWindow) { PopupWindow other = (PopupWindow)obj; return this.window == other.window && this.functionId == other.functionId; } return false; } public override int GetHashCode() { return window.GetHashCode() ^ functionId.GetHashCode(); } } }