lcy
6 天以前 29fd27541c91dc1bf6147c1de5cf5680dfc6cb38
Main/Component/UI/Common/PopupWindowsProcessor.cs
@@ -1,32 +1,38 @@
using System.Collections;
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, int functionId = 0)
    public void Add(string name, bool isNeedHomeWin = true, int functionId = 0)
    {
        var popupWindow = new PopupWindow()
        {
            window = name,
            isNeedHomeWin = isNeedHomeWin,
            functionId = functionId,
        };
@@ -36,6 +42,7 @@
        }
        popupWindowQueue.Add(popupWindow);
        popupWindowQueue.Sort((x, y) => y.isNeedHomeWin.CompareTo(x.isNeedHomeWin));
    }
    /// <summary>
@@ -43,11 +50,12 @@
    /// </summary>
    /// <param name="name">窗口名称</param>
    /// <param name="functionId">功能ID</param>
    public void Remove(string name, int functionId = 0)
    public void Remove(string name, bool isNeedHomeWin = true, int functionId = 0)
    {
        var popupWindow = new PopupWindow()
        {
            window = name,
            isNeedHomeWin = isNeedHomeWin,
            functionId = functionId,
        };
@@ -56,6 +64,7 @@
            popupWindowQueue.Remove(popupWindow);
        }
    }
    /// <summary>
    /// LateUpdate中处理弹窗队列,确保在所有其他逻辑处理完毕后才显示弹窗
@@ -77,11 +86,10 @@
        }
        // 检查是否在新手引导中
        // 注意:NewBieCenter在当前代码库中不存在,暂时注释掉相关检查
        // if (NewBieCenter.Instance.inGuiding)
        // {
        //     return;
        // }
        if (NewBieCenter.Instance.inGuiding)
        {
            return;
        }
        if (popupWindowQueue.Count == 0)
        {
@@ -92,30 +100,48 @@
        if (UIManager.Instance.IsOpened<LoadingWin>())
            return;
        // 检查是否存在全屏或遮罩窗口
        // 注意:ExistAnyFullScreenOrMaskWin方法在当前UIManager中不存在,暂时注释掉相关检查
        // if (UIManager.Instance.ExistAnyFullScreenOrMaskWin())
        //     return;
        if (!UIManager.Instance.IsOpened<HomeWin>() && popupWindowQueue[0].isNeedHomeWin)
            return;
        if (currentWindow.window != null)
        // 进入游戏第一次推送做延迟处理
        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);
        }
        else
        {
            currentWindow = popupWindowQueue[0];
            popupWindowQueue.RemoveAt(0);
            UIManager.Instance.OpenWindow(currentWindow.window, currentWindow.functionId);
            Debug.LogFormat("推送窗口 " + currentWindow.window);
        }
        currentWindow = popupWindowQueue[0];
        popupWindowQueue.RemoveAt(0);
        UIManager.Instance.OpenWindow(currentWindow.window, currentWindow.functionId);
        Debug.LogFormat("推送窗口 " + currentWindow.window);
        lastTime = Time.realtimeSinceStartup;
    }
@@ -123,39 +149,15 @@
    /// 弹窗结构体,用于表示一个待处理的弹窗请求
    /// 包含窗口名称和功能ID,通过这两个字段可以唯一标识一个弹窗请求
    /// </summary>
    public struct PopupWindow
    public class 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();
        }
        public bool isNeedHomeWin;
    }
}