| using System; | 
| using System.Collections; | 
| using System.Collections.Generic; | 
| using UnityEngine; | 
|   | 
|   | 
| public class TimeDownMgr : SingletonMonobehaviour<TimeDownMgr> { | 
|   | 
|   | 
|     public enum CoolTimeType | 
|     { | 
|         Test=0, | 
|         BagSort=1, | 
|         DepotSort=2, | 
|         DeadCD = 3, //距离玩家复活的时间 | 
|         DeadTiredCD = 4, //距离清除玩家复活疲劳的时间  | 
|         BossAutoReborn = 5, //在Boss附近被玩家击杀复活 | 
|         DuplicatesReborn = 6, //副本死亡类型 | 
|         SyncServerTime=7,//同步服务器时间 | 
|         HeavenBattleReaminTime = 8, //仙魔之争剩余时间 | 
|         prepareBetRemainTime = 9,  //最终比分预测 | 
|         firstBetRemainTime = 10,  //第一阶段比分预测 | 
|         secondBetRemainTime = 11,  //第二阶段比分预测 | 
|         thirdBetRemainTime = 12,   //第三阶段比分预测 | 
|         BattlePrepareTime = 13, //战斗前倒计时 | 
|         HappyFreeBestXB = 14,//极品寻宝免费时间倒计时 废弃 | 
|         HappyFreeRuneXB = 15,  //符印寻宝免费时间倒计时 废弃 | 
|         HappyXBWarehouse = 16,  //寻宝仓库整理倒计时 | 
|         FlashRushToBuyAppointment = 17, //限时抢购预约倒计时 | 
|         DungeonAssistCoolTime = 18, //副本助战一键召唤倒计时 | 
|     } | 
|   | 
|     public void Begin(CoolTimeType type, float duration,Action<float> func,float tick=1.0f) | 
|     { | 
|         CoolTimeData data = coolTimeList.Find((CoolTimeData x) => { | 
|             return x.type==type; | 
|         }); | 
|         if (data != null) | 
|         { | 
|             coolTimeList.Remove(data); | 
|             data = null; | 
|         } | 
|         data = new CoolTimeData(); | 
|         data.time = 0; | 
|         data.type = type; | 
|         data.tick = tick; | 
|         data.duration = duration; | 
|         data.func = func; | 
|         coolTimeList.Add(data); | 
|     } | 
|   | 
|     public void Stop(CoolTimeType type) | 
|     { | 
|         CoolTimeData value = null; | 
|         if (Get(type,out value)) | 
|         { | 
|             coolTimeList.Remove(value); | 
|         } | 
|     } | 
|   | 
|     public bool Get(CoolTimeType type,out CoolTimeData value) | 
|     { | 
|         CoolTimeData data = coolTimeList.Find((CoolTimeData x) => { | 
|             return x.type == type; | 
|         }); | 
|         value = null; | 
|         if (data!=null) { | 
|             value = data; | 
|             return true; | 
|         } | 
|         return false; | 
|     } | 
|   | 
|     public class CoolTimeData | 
|     { | 
|         public CoolTimeType type; | 
|         public float tick; | 
|         public float duration; | 
|         public float time; | 
|         private Action<float> m_func; | 
|         public Action<float> func | 
|         { | 
|             get { return m_func; } | 
|             set | 
|             { | 
|                 if (m_func == null) m_func = value; | 
|                 else | 
|                 { | 
|                     if (Array.IndexOf(m_func.GetInvocationList(), value) == -1) | 
|                     { | 
|                         m_func += value; | 
|                     } | 
|                 } | 
|                  | 
|             } | 
|         } | 
|   | 
|   | 
|     } | 
|   | 
|     private List<CoolTimeData> coolTimeList = new List<CoolTimeData>(); | 
|   | 
|     private void LateUpdate() | 
|     { | 
|         for (int i = 0; i < coolTimeList.Count; i++) { | 
|             CoolTimeData data = coolTimeList[i]; | 
|             data.time += Time.deltaTime; | 
|             if (data.time >= data.tick) { | 
|                 if (data.func != null) data.func(Mathf.CeilToInt(data.duration-data.time)); | 
|                 data.tick += 1; | 
|                 data.tick = Mathf.Min(data.tick, data.duration); | 
|             } | 
|             if (data.time >= data.duration) { | 
|                 data = null; | 
|                 coolTimeList.RemoveAt(i); | 
|                 i--; | 
|             } | 
|         } | 
|     } | 
|   | 
|   | 
| } |