using System.Linq; using UnityEngine; using UnityEngine.UI; //用于显示获得物品的窗口 public class CommonGetItemWin : UIBase { [SerializeField] ScrollerController scroller; [SerializeField] RichText desc; [SerializeField] Button sureBtn; [SerializeField] Text sureText; [SerializeField] TextEx closeText; float openTime; protected override void InitComponent() { base.InitComponent(); Debug.Log("初始化通用获得物品窗口"); sureBtn.SetListener(() => UIManager.Instance.CloseWindow()); } public override void HandleOpen() { base.HandleOpen(); Debug.Log("打开通用获得物品窗口"); Refresh(); } public override void HandleClose() { base.HandleClose(); Debug.Log("关闭通用获得物品窗口"); } public override void Refresh() { base.Refresh(); Debug.Log("刷新通用获得物品窗口"); } protected override void OnPreOpen() { ItemLogicUtility.Instance.OnGetItemShowEvent += OnGetItemShowEvent; scroller.OnRefreshCell += OnRefreshCell; desc.SetActive(!string.IsNullOrEmpty(ItemLogicUtility.Instance.getItemInfo)); desc.text = ItemLogicUtility.Instance.getItemInfo; sureText.text = ItemLogicUtility.Instance.getItemBtnText; CreateScroller(); closeText.text = Language.Get("L2004"); openTime = Time.time; } protected override void OnPreClose() { ItemLogicUtility.Instance.OnGetItemShowEvent -= OnGetItemShowEvent; scroller.OnRefreshCell -= OnRefreshCell; ItemLogicUtility.Instance.OnGetItem?.Invoke(); ItemLogicUtility.Instance.ClearGetItem(); } void CreateScroller() { scroller.Refresh(); var keys = ItemLogicUtility.Instance.totalShowItems.Keys.ToList(); int rowCount = (int)Mathf.Ceil((float)keys.Count / 5); for (int i = 0; i < rowCount; i++) { scroller.AddCell(ScrollerDataType.Header, i); } scroller.Restart(); } float needRefreshTime; //避免封包过多卡顿 void OnGetItemShowEvent() { needRefreshTime = Time.time + 0.3f; } void RefreshScroller() { if (needRefreshTime <= 0) return; if (Time.time < needRefreshTime) return; if (scroller.GetNumberOfCells(scroller.m_Scorller) != ItemLogicUtility.Instance.totalShowItems.Count) { CreateScroller(); } else { scroller.m_Scorller.RefreshActiveCellViews(); } needRefreshTime = 0; } protected void LateUpdate() { RefreshScroller(); if (ItemLogicUtility.Instance.closeSeconds == 0) return; float closeTime = ItemLogicUtility.Instance.closeSeconds - (Time.time - openTime); if (closeTime <= 0) { UIManager.Instance.CloseWindow(); return; } closeText.text = Language.Get("AutoCloseAfterSeconds", (int)closeTime); } void OnRefreshCell(ScrollerDataType type, CellView cell) { var _cell = cell as CommonGetItemCell; _cell?.Display(cell.index); } }