using Cysharp.Threading.Tasks; using UnityEngine; using UnityEngine.UI; using System.Collections.Generic; using System.Threading; public class HeroCollectionCardCell : MonoBehaviour { [SerializeField] Button heroCardBtn; [SerializeField] Image heroCardBG; [SerializeField] UIHeroController heroModel; [SerializeField] List starImgList; [SerializeField] Image countryImg; [SerializeField] Image jobImg; [SerializeField] Text nameText; [SerializeField] Image trainStateImg; [SerializeField] RedpointBehaviour redpoint; // [SerializeField] Button bookLVBtn; [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]; var heroConfig = HeroConfig.Get(heroID); this.gameObject.name = $"herocard_{heroID}"; HB122_tagSCHeroInfo.tagSCHero colData; HeroUIManager.Instance.TryGetHeroBookInfo(heroID, out colData); heroCardBG.SetSprite("herocardbg" + heroConfig.Quality); //分为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); countryImg.SetSprite(HeroUIManager.Instance.GetCountryIconName(heroConfig.Country)); jobImg.SetSprite(HeroUIManager.Instance.GetJobIconName(heroConfig.Class)); // 去抖加载:快速滚动时延迟2帧再创建Spine,如果卡片在延迟内被复用则取消旧加载 displayCts?.Cancel(); displayCts?.Dispose(); displayCts = new CancellationTokenSource(); DelayedCreateSpine(heroConfig.SkinIDList[0], heroConfig.UIScale, displayCts.Token).Forget(); redpoint.redpointId = MainRedDot.HeroCardCollectRedpoint * 10000000 + heroID; if (funcState == 3 || funcState == 4) { trainStateImg.SetActive(true); trainStateImg.SetSprite("herofuncstate4"); } else { trainStateImg.SetActive(false); } nameText.text = heroConfig.Name; for (int i = 0; i < starImgList.Count; i++) { starImgList[i].SetActive(false); } heroCardBtn.AddListener(() => { HeroUIManager.Instance.selectCollectHeroID = heroID; var state = HeroUIManager.Instance.GetHeroBookState(heroID, quality); if (state == 1 || state == 3 || state == 4) { UIManager.Instance.OpenWindowAsync().Forget(); } else { HeroUIManager.Instance.selectForPreviewHeroID = heroID; UIManager.Instance.OpenWindowAsync().Forget(); } }); // bookLVBtn.AddListener(() => // { // HeroUIManager.Instance.selectCollectHeroID = heroID; // UIManager.Instance.OpenWindow(); // }); } 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(); } }