yyl
2026-05-11 51b0f6ed9f4e1d3bb6f8144470b46908c7699a96
Main/System/HeroUI/HeroCollectionCardCell.cs
@@ -1,3 +1,4 @@
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;
@@ -6,82 +7,97 @@
{
    [SerializeField] Button heroCardBtn;
    [SerializeField] Image heroCardBG;
    [SerializeField] Material glowMaterial; // 流光效果材质
    [SerializeField] Text lvText;
    [SerializeField] UIHeroController heroModel;
    [SerializeField] List<Image> starImgList;
    [SerializeField] Image countryImg;
    [SerializeField] Image jobImg;
    [SerializeField] UIHeroController heroModel;
    [SerializeField] Image onStateImg;
    [SerializeField] RedpointBehaviour redpoint;
    [SerializeField] Image trainStateImg;
    [SerializeField] Text nameText;
    [SerializeField] Image awakeImg;
    [SerializeField] Text awakeLVText;
    [SerializeField] List<Image> starImgList;
    [SerializeField] Image trainStateImg;
    [SerializeField] RedpointBehaviour redpoint;
    // [SerializeField] Button bookLVBtn;
    [SerializeField] GameObject unGetObj;
    [SerializeField] GameObject activeObj; // 可激活带流光效果材质
    [SerializeField] GameObject actLimitObj; // 活动限定
    string guid;
    public void Display(int index)
    private int displayVersion;
    public void Display(int index, int quality)
    {
        guid = HeroUIManager.Instance.heroSortList[index];
        var hero = HeroManager.Instance.GetHero(guid);
        if (hero == null)
        {
            this.gameObject.SetActive(false);
            return;
        }
        displayVersion++;
        int version = displayVersion;
        this.gameObject.SetActive(true);
        heroCardBG.SetSprite("herocardbg" + hero.Quality);
        if (glowMaterial != null)
        {
            heroCardBG.material = glowMaterial;
        }
        lvText.text = Language.Get("L1094") + hero.heroLevel.ToString();
        var heroConfig = hero.heroConfig;
        countryImg.SetSprite(HeroUIManager.Instance.GetCountryIconName(heroConfig.Country));
        jobImg.SetSprite(HeroUIManager.Instance.GetJobIconName(heroConfig.Class));
        heroModel.Create(heroConfig.SkinIDList[hero.SkinIndex], heroConfig.UIScale);
        onStateImg.SetActive(hero.IsInTeamByTeamType(TeamType.Story));
        var heroID = HeroUIManager.Instance.heroCollectDict[quality][index];
        var heroConfig = HeroConfig.Get(heroID);
        redpoint.redpointId = MainRedDot.HeroCardRedpoint * 1000 + hero.itemHero.gridIndex;
        var funcState = hero.funcState;
        if (funcState > 0)
        this.gameObject.name = $"herocard_{heroID}";
        HB122_tagSCHeroInfo.tagSCHero colData;
        HeroUIManager.Instance.TryGetHeroBookInfo(heroID, out colData);
        LoadImageAsync(heroCardBG, "herocardbg" + heroConfig.Quality, version).Forget();
        //分为0未获得、1可激活、2常规、3突破升级、4、星升级、5已满级
        int funcState = HeroUIManager.Instance.GetHeroBookState(heroID, quality);
        activeObj.SetActive(funcState == 1);
        // bookLVBtn.SetActive(funcState > 1);
        unGetObj.SetActive(funcState == 0);
        actLimitObj.SetActive(heroConfig.IsActLimit == 1);
        LoadImageAsync(countryImg, HeroUIManager.Instance.GetCountryIconName(heroConfig.Country), version).Forget();
        LoadImageAsync(jobImg, HeroUIManager.Instance.GetJobIconName(heroConfig.Class), version).Forget();
        DelayedCreateSpine(heroConfig.SkinIDList[0], heroConfig.UIScale, version).Forget();
        redpoint.redpointId = MainRedDot.HeroCardCollectRedpoint * 10000000 + heroID;
        if (funcState == 3 || funcState == 4)
        {
            trainStateImg.SetActive(true);
            trainStateImg.SetSprite("herofuncstate" + hero.funcState);
            LoadImageAsync(trainStateImg, "herofuncstate4", version).Forget();
        }
        else
        {
            trainStateImg.SetActive(false);
        }
        nameText.text = hero.breakLevel == 0 ? heroConfig.Name : Language.Get("herocardbreaklv", heroConfig.Name, hero.breakLevel);
        awakeImg.SetActive(hero.awakeLevel > 0);
        awakeLVText.text = hero.awakeLevel.ToString();
        nameText.text = heroConfig.Name;
        for (int i = 0; i < starImgList.Count; i++)
        {
            if (hero.heroStar == 0 && i == 0)
            {
                // 无星级 特殊处理
                starImgList[i].SetActive(true);
                starImgList[i].SetSprite("herostar" + hero.heroStar);
            }
            else if ((hero.heroStar - 1) % starImgList.Count >= i)
            {
                starImgList[i].SetActive(true);
                starImgList[i].SetSprite("herostar" + (((hero.heroStar - 1) / starImgList.Count) + 1) * starImgList.Count);
            }
            else
            {
                starImgList[i].SetActive(false);
            }
            starImgList[i].SetActive(false);
        }
        heroCardBtn.AddListener(() =>
        {
            HeroUIManager.Instance.selectHeroGuid = guid;
            UIManager.Instance.OpenWindow<HeroTrainWin>();
            HeroUIManager.Instance.selectCollectHeroID = heroID;
            var state = HeroUIManager.Instance.GetHeroBookState(heroID, quality);
            if (state == 1 || state == 3 || state == 4)
            {
                UIManager.Instance.OpenWindowAsync<HeroCollectionLvUpWin>().Forget();
            }
            else
            {
                HeroUIManager.Instance.selectForPreviewHeroID = heroID;
                UIManager.Instance.OpenWindowAsync<HeroBestBaseWin>().Forget();
            }
        });
    }
    private async UniTaskVoid LoadImageAsync(Image image, string iconKey, int version)
    {
        var sprite = await UILoader.LoadSpriteAsync(iconKey);
        if (displayVersion != version) return;
        if (image != null && sprite != null)
            image.overrideSprite = sprite;
    }
    private async UniTaskVoid DelayedCreateSpine(int skinID, float scale, int version)
    {
        await UniTask.NextFrame();
        await UniTask.NextFrame();
        if (displayVersion != version) return;
        heroModel.Create(skinID, scale).Forget();
    }
}