using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class HeroReturnSkinWin : UIBase { [SerializeField] float modelScale = 1f; [SerializeField] RawImage bgImage; [SerializeField] ImageEx heroNameImage; [SerializeField] ImageEx skinInfoImage; [SerializeField] ImageEx awardBgImage; [SerializeField] TextEx timeText; [SerializeField] ButtonEx buyButton; [SerializeField] ImageEx buyImage; [SerializeField] ImageEx countryImage; [SerializeField] TextEx buyText; [SerializeField] ButtonEx closeButton; [SerializeField] UIHeroController uiHeroController; [SerializeField] UIHeroController lhController; [SerializeField] ScrollerController awardScroller; [SerializeField] ScrollerController tabScroller; [SerializeField] Color numColor; [SerializeField] TextEx[] wearAttrText; [SerializeField] TextEx[] roleAttrText; [SerializeField] ButtonEx infoButton; HeroReturnManager manager => HeroReturnManager.Instance; protected override void InitComponent() { closeButton.SetListener(CloseWindow); infoButton.SetListener(() => { int heroID = manager.GetHeroIDBySkinID(manager.currentChooseSkinID); HeroUIManager.Instance.selectForPreviewHeroID = heroID; HeroUIManager.Instance.selectSkinIndex = manager.GetSkinIndexInHeroConfig(heroID, manager.currentChooseSkinID); UIManager.Instance.OpenWindow(1); }); } protected override void OnPreOpen() { GlobalTimeEvent.Instance.secondEvent += OnSecondEvent; RechargeManager.Instance.rechargeCountEvent += OnRechargeCountEvent; awardScroller.OnRefreshCell += OnRefreshAwardCell; tabScroller.OnRefreshCell += OnRefreshTabCell; manager.OnCurrentChooseSkinIDChangeEevent += OnCurrentChooseSkinIDChange; CreateTabScroller(); Display(); } protected override void OnPreClose() { GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent; RechargeManager.Instance.rechargeCountEvent -= OnRechargeCountEvent; awardScroller.OnRefreshCell -= OnRefreshAwardCell; tabScroller.OnRefreshCell -= OnRefreshTabCell; manager.OnCurrentChooseSkinIDChangeEevent -= OnCurrentChooseSkinIDChange; } private void OnCurrentChooseSkinIDChange() { tabScroller.m_Scorller.RefreshActiveCellViews(); Display(); } void OnRefreshTabCell(ScrollerDataType type, CellView cell) { var _cell = cell as HeroReturnSkinTabCell; _cell.Display(cell.index, skinIDList); } List skinIDList; void CreateTabScroller() { var act = manager.GetOperationHeroAppearInfo(); if (act == null) return; var config = ActHeroAppearConfig.Get(act.CfgID); if (config == null) return; int heroID = manager.GetFirstHeroId(); var artConfig = ActHeroReturnArtConfig.Get(heroID); if (artConfig == null) return; skinIDList = manager.GetSkinIDList(act.CfgID, heroID, artConfig.MainSkinID); if (skinIDList.IsNullOrEmpty()) return; manager.currentChooseSkinID = skinIDList[0]; tabScroller.Refresh(); for (int i = 0; i < skinIDList.Count; i++) { tabScroller.AddCell(ScrollerDataType.Header, i); } tabScroller.Restart(); } int[][] arr = null; void OnRefreshAwardCell(ScrollerDataType type, CellView cell) { var _cell = cell as HeroReturnSkinAwardCell; _cell.Display(cell.index, arr); } void CreateAwardScroller(int[][] sourceArr) { if (sourceArr == null) return; // 1. 获取已拥有的 ID 集合 (使用 LINQ 简洁明了) var ownedItems = HeroSkinAttrConfig.GetItemList(); var itemIds = ownedItems != null ? new HashSet(ownedItems) : new HashSet(); // 2. 过滤掉 items 中已有的项,并直接赋值给成员变量 // arr[i][0] 假设为判断是否存在于 items 中的 ID this.arr = System.Array.FindAll(sourceArr, row => !itemIds.Contains(row[0])); // 3. 刷新 UI awardScroller.Refresh(); for (int i = 0; i < this.arr.Length; i++) { awardScroller.AddCell(ScrollerDataType.Header, i); } awardScroller.Restart(); } private void OnSecondEvent() { manager.GetActTimeStr(timeText); } private void OnRechargeCountEvent(int obj) { Display(); } public void Display() { var act = manager.GetOperationHeroAppearInfo(); if (act == null) return; var config = ActHeroAppearConfig.Get(act.CfgID); if (config == null) return; int heroID = manager.GetFirstHeroId(); var artConfig = ActHeroReturnArtConfig.Get(heroID); if (artConfig == null) return; var heroConfig = HeroConfig.Get(heroID); if (heroConfig == null) return; int skinID = manager.currentChooseSkinID; var heroSkinAttrConfig = HeroSkinAttrConfig.Get(skinID); if (heroSkinAttrConfig == null) return; if (heroSkinAttrConfig.WearAttrIDList == null) return; if (heroSkinAttrConfig.WearAttrValueList == null) return; if (heroSkinAttrConfig.RoleAttrIDList == null) return; if (heroSkinAttrConfig.RoleAttrValueList == null) return; var skinIDList = manager.GetSkinIDList(act.CfgID, heroID, skinID); if (skinIDList.IsNullOrEmpty()) return; int ctgId = manager.GetCtgIDBySkinID(skinID); var ctgConfig = CTGConfig.Get(ctgId); if (ctgConfig == null) return; if (!RechargeManager.Instance.TryGetOrderInfo(ctgId, out var orderConfig)) return; if (!RechargeManager.Instance.TryGetRechargeCount(ctgId, out var rechargeCount)) return; if (!RechargeManager.Instance.TryGetRechargeItem(ctgId, out var rechargeItemList)) return; bgImage.SetTexture2D(StringUtility.Concat("HeroReturnSkinBG_", skinID.ToString())); heroNameImage.SetSprite(StringUtility.Concat("HeroReturnSkinHeroName_", skinID.ToString())); heroNameImage.SetNativeSize(); skinInfoImage.SetSprite(StringUtility.Concat("HeroReturnSkinInfo_", skinID.ToString())); skinInfoImage.SetNativeSize(); awardBgImage.SetSprite(StringUtility.Concat("HeroReturnSkinAwardBG_", skinID.ToString())); awardBgImage.SetNativeSize(); uiHeroController.Create(skinID, modelScale); lhController.Create(skinID, 1, motionName: "", isLh: true); countryImage.SetSprite(HeroUIManager.Instance.GetCountryIconName(heroConfig.Country)); OnSecondEvent(); CreateAwardScroller(ctgConfig.GainItemList); bool isCanBuy = manager.IsNoSellOutCTGID(ctgId); //buyImage.gray = !isCanBuy; buyText.text = !isCanBuy ? Language.Get("storename11") : Language.Get("PayMoneyNum", UIHelper.GetMoneyFormat(orderConfig.PayRMBNumOnSale)); buyButton.interactable = isCanBuy; buyButton.SetListener(() => { RechargeManager.Instance.CTG(ctgId); }); for (int i = 0; i < wearAttrText.Length; i++) SetAttrInfo(0, i, heroSkinAttrConfig, wearAttrText[i]); for (int i = 0; i < roleAttrText.Length; i++) SetAttrInfo(1, i, heroSkinAttrConfig, roleAttrText[i]); } // type 0 穿戴属性值 1 主公属性 public void SetAttrInfo(int type, int index, HeroSkinAttrConfig heroSkinAttrConfig, TextEx info) { if (heroSkinAttrConfig == null) return; int[] arrID = type == 0 ? heroSkinAttrConfig.WearAttrIDList : heroSkinAttrConfig.RoleAttrIDList; int[] arrValue = type == 0 ? heroSkinAttrConfig.WearAttrValueList : heroSkinAttrConfig.RoleAttrValueList; if (arrID?.Length <= index || arrValue?.Length <= index) { info.text = string.Empty; return; } info.text = GetFullDescription(arrID[index], arrValue[index]); } string GetFullDescription(int id, long value) { var config = PlayerPropertyConfig.Get(id); if (config == null) return string.Empty; return Language.Get("HeroDebut33", config.ShowName, PlayerPropertyConfig.GetValueDescription(id, value)); } }