using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using TableConfig; namespace Snxxz.UI { public class KnapsackTimeCDMgr : SingletonMonobehaviour { private List itemCDList = new List(); public event Action RefresCoolTimeAct; public event Action RefreshItemOverdueTimeAct; public event Action RefreshItemOverdueAct; int secondBuf = -1; int minuteBuf = -1; private void LateUpdate() { CheckItemCoolTime(TimeRefreshType.Frame); var minute = DateTime.Now.Minute; if (minute != minuteBuf) { CheckItemCoolTime(TimeRefreshType.Minute); minuteBuf = minute; } } private void CheckItemCoolTime(TimeRefreshType type) { for (int i = itemCDList.Count - 1; i > -1; i--) { double remianCD = itemCDList[i].GetRemainTime(); switch (type) { case TimeRefreshType.Frame: if (RefresCoolTimeAct != null) { RefresCoolTimeAct(itemCDList[i].guid); } break; case TimeRefreshType.Minute: if(RefreshItemOverdueTimeAct != null) { RefreshItemOverdueTimeAct(itemCDList[i].guid); } break; } if (remianCD <= 0) { string guid = itemCDList[i].guid; itemCDList.RemoveAt(i); if (RefreshItemOverdueAct != null) { RefreshItemOverdueAct(guid); } } } } public void Register(string guid,int itemId,double cdTime) { int index; if (ContainsItemCD(guid,out index)) { itemCDList[index].SetTime(cdTime); } else { ItemCDCool cool = new ItemCDCool(guid,itemId,cdTime); itemCDList.Add(cool); } } public void UnRegister(string guid) { int index; if (ContainsItemCD(guid, out index)) { itemCDList.RemoveAt(index); } } public ItemCDCool GetItemCoolById(string guid) { int index; if (ContainsItemCD(guid, out index)) { return itemCDList[index]; } return null; } List typeCoollist = new List(); public List GetItemCoolByCDType(int type,out bool isCool) { typeCoollist.Clear(); isCool = false; for (int i = 0; i < itemCDList.Count; i++) { ItemConfig itemConfig = Config.Instance.Get(itemCDList[i].itemId); if(itemConfig != null && itemConfig.CDType == type && itemCDList[i].GetRemainTime() > 0) { typeCoollist.Add(itemCDList[i]); isCool = true; } } return typeCoollist; } private bool ContainsItemCD(string guid, out int index) { index = 0; for (int i = 0; i < itemCDList.Count; i++) { if (itemCDList[i].guid == guid) { index = i; return true; } } return false; } public enum TimeRefreshType { Frame, //每帧 Second, //每秒 Minute //每分 } } public class ItemCDCool { public string guid; public int itemId; public double totalTime; public DateTime startTime { get; private set; } public ItemCDCool(string guid,int itemId,double totalTime) { this.guid = guid; this.itemId = itemId; this.totalTime = totalTime; this.startTime = DateTime.Now; } public void SetTime(double totalTime) { this.totalTime = totalTime; this.startTime = DateTime.Now; } public double GetRemainTime() { double remainTime = totalTime - (DateTime.Now - startTime).TotalSeconds; if(remainTime <= 0) { remainTime = 0; } return remainTime; } } }