yyl
2026-03-31 0fa617a09eedf6bdb25eda55fac1d3344859fd93
Main/System/HeroUI/HeroCollectionCardCell.cs
@@ -1,6 +1,8 @@
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;
using System.Threading;
public class HeroCollectionCardCell : MonoBehaviour
{
@@ -17,6 +19,8 @@
    [SerializeField] GameObject unGetObj;
    [SerializeField] GameObject activeObj; // 可激活带流光效果材质
    [SerializeField] GameObject actLimitObj; // 活动限定
    private CancellationTokenSource displayCts;
    public void Display(int index, int quality)
    {
        var heroID = HeroUIManager.Instance.heroCollectDict[quality][index];
@@ -38,7 +42,12 @@
        countryImg.SetSprite(HeroUIManager.Instance.GetCountryIconName(heroConfig.Country));
        jobImg.SetSprite(HeroUIManager.Instance.GetJobIconName(heroConfig.Class));
        heroModel.Create(heroConfig.SkinIDList[0], heroConfig.UIScale);
        // 去抖加载:快速滚动时延迟2帧再创建Spine,如果卡片在延迟内被复用则取消旧加载
        displayCts?.Cancel();
        displayCts?.Dispose();
        displayCts = new CancellationTokenSource();
        DelayedCreateSpine(heroConfig.SkinIDList[0], heroConfig.UIScale, displayCts.Token).Forget();
        redpoint.redpointId = MainRedDot.HeroCardCollectRedpoint * 10000000 + heroID;
@@ -64,12 +73,12 @@
            var state = HeroUIManager.Instance.GetHeroBookState(heroID, quality);
            if (state == 1 || state == 3 || state == 4)
            {
                UIManager.Instance.OpenWindow<HeroCollectionLvUpWin>();
                UIManager.Instance.OpenWindowAsync<HeroCollectionLvUpWin>().Forget();
            }
            else
            {
                HeroUIManager.Instance.selectForPreviewHeroID = heroID;
                UIManager.Instance.OpenWindow<HeroBestBaseWin>();
                UIManager.Instance.OpenWindowAsync<HeroBestBaseWin>().Forget();
            }
        });
        
@@ -79,5 +88,19 @@
        //     UIManager.Instance.OpenWindow<HeroCollectionLvUpWin>();
        // });
    }
    private async UniTaskVoid DelayedCreateSpine(int skinID, float scale, CancellationToken ct)
    {
        // 延迟2帧,快速滚动时卡片会被复用,CTS取消后不会继续创建Spine
        await UniTask.NextFrame(ct);
        await UniTask.NextFrame(ct);
        heroModel.Create(skinID, scale).Forget();
    }
    void OnDestroy()
    {
        displayCts?.Cancel();
        displayCts?.Dispose();
    }
}