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();
}
}
}