hch
2025-12-19 ed63aa36ced400b4eef79862e85498213ae40c4a
Main/System/Tip/ScrollTipWin.cs
@@ -1,11 +1,12 @@
//--------------------------------------------------------
//    [Author]:           第二世界
//--------------------------------------------------------
//    [Author]:           玩个游戏
//    [  Date ]:           Saturday, October 07, 2017
//--------------------------------------------------------
using System;
using System.Collections;
using System.Collections.Generic;
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.UI;
@@ -26,6 +27,8 @@
    float m_TipMoveTime = 0.2f;
    [SerializeField, Header("隐藏时间")]
    float m_TipHideTime = 0.5f;
    bool isLoopRunning = false;
    protected override void InitComponent()
    {
@@ -44,18 +47,48 @@
    protected override void OnPreClose()
    {
        ScrollTip.OnTipReceiveEvent -= OnTipReceiveEvent;
        ScrollTip.OnTipReceiveEvent -= OnAddTipEvent;
        ScrollTip.ReleaseAll();
    }
    protected override void OnPreOpen()
    {
        ScrollTip.tipMoveTime = m_TipMoveTime;
        ScrollTip.OnTipReceiveEvent += OnTipReceiveEvent;
        ScrollTip.OnTipReceiveEvent += OnAddTipEvent;
        mask.sizeDelta = mask.sizeDelta.SetY(tipDisplayCnt * m_TipHeight + (tipDisplayCnt - 1) * (m_TipDistance - m_TipHeight) + 10);
        for (int i = 0; i < ScrollTip.m_Hints.Count; i++)
        // 如果有待处理的提示,立即启动循环
        if (ScrollTip.m_Hints.Count > 0)
        {
            OnTipReceiveEvent();
            LoopTipReceiveEvent().Forget();
        }
    }
    async UniTask LoopTipReceiveEvent()
    {
        if (isLoopRunning) return; // 防止重复启动
        isLoopRunning = true;
        try
        {
            while (ScrollTip.m_Hints.Count > 0)
            {
                OnTipReceiveEvent();
                await UniTask.Delay(100);
            }
        }
        finally
        {
            isLoopRunning = false;
        }
    }
    void OnAddTipEvent()
    {
        // 只有在没有循环运行时才启动新的循环
        if (!isLoopRunning)
        {
            LoopTipReceiveEvent().Forget();
        }
    }
@@ -66,19 +99,16 @@
            if (ScrollTip.m_ActiveTips.Count >= tipDisplayCnt)
            {
                ScrollTip.Release(ScrollTip.m_ActiveTips[0], false);
            }
            if (ScrollTip.m_ActiveTips.Count >= tipDisplayCnt)
            {
                ScrollTip.tipMoveTime = Time.deltaTime;
            }
            else
            {
                ScrollTip.tipMoveTime = m_TipMoveTime;
            }
            for (int i = 0; i < ScrollTip.m_ActiveTips.Count; i++)
            {
                ScrollTip.m_ActiveTips[i].Play(ScrollTip.ScrollTipState.Move);
            }
            // for (int i = 0; i < ScrollTip.m_ActiveTips.Count; i++)
            // {
            //     ScrollTip.m_ActiveTips[i].Play(ScrollTip.ScrollTipState.Move);
            // }
            ScrollTipDetail tipDetail = ScrollTip.Request();
            if (tipDetail != null)
            {
@@ -91,20 +121,20 @@
                var _hint = ScrollTip.m_Hints[0];
                ScrollTip.m_Hints.RemoveAt(0);
                tipDetail.ShowTip(_hint);
                tipDetail.Play(ScrollTip.ScrollTipState.Idle);
                tipDetail.Play(ScrollTip.ScrollTipState.Move);
            }
        }
    }
    private bool IsCanAdd()
    {
        for (int i = 0; i < ScrollTip.m_ActiveTips.Count; i++)
        {
            if (ScrollTip.m_ActiveTips[i].presentState == ScrollTip.ScrollTipState.Move)
            {
                return false;
            }
        }
        // for (int i = 0; i < ScrollTip.m_ActiveTips.Count; i++)
        // {
        //     if (ScrollTip.m_ActiveTips[i].presentState == ScrollTip.ScrollTipState.Move)
        //     {
        //         return false;
        //     }
        // }
        return true;
    }
}