using System.Collections.Generic; using Cysharp.Threading.Tasks; using UnityEngine; public class TimingGiftWin : UIBase { [SerializeField] ScrollerController tabScroller; [SerializeField] ScrollerController ctgIdScroller; [SerializeField] ScrollerController awardScroller; [SerializeField] TextEx timeText; [SerializeField] TextEx rateText; [SerializeField] ImageEx bgImage; [SerializeField] ImageEx IconImage; [SerializeField] TextEx giftNameText; [SerializeField] ButtonEx buyButton; [SerializeField] TextEx buyText; [SerializeField] ButtonEx leftButton; [SerializeField] ButtonEx rightButton; TimingGiftManager manager { get { return TimingGiftManager.Instance; } } int type; List currectTimingGiftIdList; protected override void InitComponent() { buyButton.SetListener(() => { RechargeManager.Instance.CTG(manager.selectCtgId); }); leftButton.SetListener(() => UpdateTabSelection(-1)); rightButton.SetListener(() => UpdateTabSelection(1)); } protected override void OnPreOpen() { type = functionOrder; #if UNITY_EDITOR if (manager.isLogShow) { Debug.Log($"[TimingGift] 打开界面,被{type}类型触发"); } #endif tabScroller.OnRefreshCell += OnRefreshTabCell; ctgIdScroller.OnRefreshCell += OnRefreshCtgIdCell; awardScroller.OnRefreshCell += OnRefreshAwardCell; manager.OnSelectTabIndexChangeEvent += OnSelectTabIndexChangeEvent; manager.OnSelectCtgIdIndexChangeEvent += OnSelectCtgIdIndexChangeEvent; manager.OnRemoveExpiredEvent += OnRemoveExpiredEvent; GlobalTimeEvent.Instance.secondEvent += OnSecondEvent; RechargeManager.Instance.rechargeCountEvent += OnRechargeCountEvent; CreateAll(); } protected override void OnPreClose() { tabScroller.OnRefreshCell -= OnRefreshTabCell; ctgIdScroller.OnRefreshCell -= OnRefreshCtgIdCell; awardScroller.OnRefreshCell -= OnRefreshAwardCell; manager.OnSelectTabIndexChangeEvent -= OnSelectTabIndexChangeEvent; manager.OnSelectCtgIdIndexChangeEvent -= OnSelectCtgIdIndexChangeEvent; manager.OnRemoveExpiredEvent -= OnRemoveExpiredEvent; GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent; RechargeManager.Instance.rechargeCountEvent -= OnRechargeCountEvent; } private void OnRechargeCountEvent(int obj) { DisplayGift(); } private void OnSecondEvent() { RefreshTime(); } private void OnRemoveExpiredEvent() { var list = manager.GetCurrectTimingGiftIdList(); if (list.IsNullOrEmpty()) { DelayCloseWindow().Forget(); return; } CreateAll(); } private void OnSelectTabIndexChangeEvent() { InitializeSelectedCtgConfig(manager.selectTabGiftId); tabScroller.m_Scorller.RefreshActiveCellViews(); CreateCtgIdScroller(); CreateAwardScroller(); DisplayGift(); } private void OnSelectCtgIdIndexChangeEvent() { ctgIdScroller.m_Scorller.RefreshActiveCellViews(); CreateAwardScroller(); DisplayGift(); } private void InitializeSelectedCtgConfig(int giftId) { if (!TimingGiftConfig.TryGetTimingGiftConfig(manager.selectTabGiftId, out TimingGiftConfig config)) return; manager.selectCtgIds = config.CTGIDs; int index = 0; manager.selectCtgId = manager.GetArrValue(index, config.CTGIDs); if (!CTGConfig.HasKey(manager.selectCtgId)) return; CTGConfig ctgConfig = CTGConfig.Get(manager.selectCtgId); manager.selectGainItemList = ctgConfig.GainItemList; manager.selectCtgIdIndex = index; } private void UpdateTabSelection(int direction) { int maxIndex = currectTimingGiftIdList.Count - 1; int tempIndex = manager.selectTabIndex + direction; int realIndex = tempIndex < 0 ? maxIndex : (tempIndex > maxIndex ? 0 : tempIndex); manager.selectTabGiftId = manager.GetListValue(realIndex, currectTimingGiftIdList); manager.selectTabIndex = realIndex; tabScroller.JumpIndex(manager.selectTabIndex); InitializeSelectedCtgConfig(manager.selectTabGiftId); } private void RefreshTime() { int times = manager.GetRemainingSeconds(manager.selectTabGiftId); timeText.text = times <= 0 ? Language.Get("TimingGift04") : Language.Get("TimingGift03", TimeUtility.SecondsToHMS(times)); timeText.colorType = times <= 0 ? TextColType.Red : TextColType.DarkGreen; } private int FindTypeIndex(int type) { for (int i = 0; i < currectTimingGiftIdList.Count; i++) { int id = currectTimingGiftIdList[i]; if (!TimingGiftConfig.TryGetTimingGiftConfig(id, out TimingGiftConfig config)) continue; if (config.GiftType == type) return i; } return 0; } private void CreateAll() { currectTimingGiftIdList = manager.GetCurrectTimingGiftIdList(isSort: true); int index = FindTypeIndex(type); manager.selectTabGiftId = manager.GetListValue(index, currectTimingGiftIdList); manager.selectTabIndex = index; InitializeSelectedCtgConfig(manager.selectTabGiftId); CreateTabScroller(); tabScroller.JumpIndex(manager.selectTabIndex); CreateCtgIdScroller(); CreateAwardScroller(); DisplayGift(); } private void CreateTabScroller() { if (currectTimingGiftIdList.Count < 2) { tabScroller.SetActive(false); return; } tabScroller.SetActive(true); tabScroller.Refresh(); for (int i = 0; i < currectTimingGiftIdList.Count; i++) { tabScroller.AddCell(ScrollerDataType.Header, i); } tabScroller.Restart(); } private void CreateCtgIdScroller() { ctgIdScroller.Refresh(); if (!manager.selectCtgIds.IsNullOrEmpty()) { for (int i = 0; i < manager.selectCtgIds.Length; i++) { ctgIdScroller.AddCell(ScrollerDataType.Header, i); } } ctgIdScroller.Restart(); } private void CreateAwardScroller() { awardScroller.Refresh(); if (!manager.selectGainItemList.IsNullOrEmpty()) { for (int i = 0; i < manager.selectGainItemList.Length; i++) { awardScroller.AddCell(ScrollerDataType.Header, i); } } awardScroller.Restart(); } private void DisplayGift() { if (!TimingGiftConfig.TryGetTimingGiftConfig(manager.selectTabGiftId, out TimingGiftConfig config)) return; if (!CTGConfig.HasKey(manager.selectCtgId)) return; CTGConfig ctgConfig = CTGConfig.Get(manager.selectCtgId); if (!RechargeManager.Instance.TryGetOrderInfo(manager.selectCtgId, out var orderInfoConfig)) return; bool isShowSwitch = currectTimingGiftIdList.Count > 1; leftButton.SetActive(isShowSwitch); rightButton.SetActive(isShowSwitch); bgImage.SetSprite($"TimingGiftBg_{manager.selectTabGiftId}"); IconImage.SetSprite($"TimingGiftIcon_{manager.selectTabGiftId}"); giftNameText.text = Language.Get("TimingGift01", config.GiftName); rateText.text = Language.Get("TimingGift02", ctgConfig.Percentage); bool isBuy = manager.IsBuy(manager.selectCtgId); buyText.text = !isBuy ? Language.Get("PayMoneyNum", orderInfoConfig.PayRMBNumOnSale) : Language.Get("storename11"); buyButton.interactable = !isBuy; RefreshTime(); } private void OnRefreshTabCell(ScrollerDataType type, CellView cell) { var _cell = cell.GetComponent(); _cell?.Display(cell.index); } private void OnRefreshCtgIdCell(ScrollerDataType type, CellView cell) { var _cell = cell.GetComponent(); _cell?.Display(cell.index, manager.selectCtgIds); } private void OnRefreshAwardCell(ScrollerDataType type, CellView cell) { var _cell = cell.GetComponent(); _cell?.Display(cell.index, manager.selectGainItemList); } }