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