TimerManager.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. //====================================
  2. /// Timer管理器
  3. //====================================
  4. using UnityEngine;
  5. using System.Collections;
  6. using System.Collections.Generic;
  7. using LuaInterface;
  8. using System;
  9. public class TimerManager : Singleton<TimerManager>
  10. {
  11. public ulong serverTime = 0; //单位ms
  12. public delegate void ServerTimeChangeFuc(int Time);
  13. public event ServerTimeChangeFuc EvtChangeTime = null;
  14. //Timer类型
  15. private enum enTimerType
  16. {
  17. Normal,
  18. FrameSync,
  19. };
  20. //Timer List
  21. private List<Timer>[] m_timers;
  22. private int m_timerSequence;
  23. public void SetServerTime(long timeStr)
  24. {
  25. //ulong.TryParse(timeStr.Substring(1), out serverTime);
  26. serverTime = (ulong)timeStr;
  27. //DebugHelper.LogError("------lastRecordTime---:" + lastRecordTicks);
  28. if (EvtChangeTime != null)
  29. {
  30. EvtChangeTime(LuaGetServerTime());
  31. }
  32. }
  33. //----------------------------------------------
  34. /// 初始化
  35. //----------------------------------------------
  36. public override void Init()
  37. {
  38. m_timers = new List<Timer>[System.Enum.GetValues(typeof(enTimerType)).Length];
  39. for (int i = 0; i < m_timers.Length; i++)
  40. {
  41. m_timers[i] = new List<Timer>();
  42. }
  43. m_timerSequence = 0;
  44. }
  45. //----------------------------------------------
  46. /// Update
  47. /// @这里只更新Normal类型的Timer
  48. //----------------------------------------------
  49. public void Update()
  50. {
  51. UpdateTimer((int)(Time.unscaledDeltaTime * 1000), enTimerType.Normal);
  52. serverTime += (ulong)(Time.unscaledDeltaTime * 1000);
  53. }
  54. public int LuaGetServerTime()
  55. {
  56. return (int)(serverTime * 0.001);
  57. }
  58. //----------------------------------------------
  59. /// UpdateLogic
  60. /// @这里只更新FrameSync类型的Timer
  61. //----------------------------------------------
  62. public void UpdateLogic(int delta)
  63. {
  64. UpdateTimer(delta, enTimerType.FrameSync);
  65. }
  66. //----------------------------------------------
  67. /// UpdateTimer
  68. /// @delata
  69. /// @timerType
  70. //----------------------------------------------
  71. private void UpdateTimer(int delta, enTimerType timerType)
  72. {
  73. List<Timer> timers = m_timers[(int)timerType];
  74. for (int i = timers.Count - 1; i >= 0; --i)
  75. {
  76. if (timers[i].IsFinished())
  77. {
  78. timers.RemoveAt(i);
  79. continue;
  80. }
  81. timers[i].Update(delta);
  82. }
  83. }
  84. //----------------------------------------------
  85. /// 添加Timer
  86. /// @time : 计时时间(ms)
  87. /// @loop : 循环次数
  88. /// @onTimeUpHandler : 时间到时的回调函数
  89. /// @return sequence of timer
  90. //----------------------------------------------
  91. public int AddTimer(int time, int loop, Timer.OnTimeUpHandler onTimeUpHandler)
  92. {
  93. return AddTimer(time, loop, onTimeUpHandler, false);
  94. }
  95. //----------------------------------------------
  96. /// 添加Timer(带参数版本)
  97. //----------------------------------------------
  98. public int AddTimer(int time, int loop, Timer.OnTimeUpWithParamsHandler onTimeUpWithParamsHandler, stTimerParams timerParams)
  99. {
  100. return AddTimer(time, loop, onTimeUpWithParamsHandler, false, timerParams);
  101. }
  102. //----------------------------------------------
  103. /// 添加Timer
  104. /// @time : 计时时间(ms)
  105. /// @loop : 循环次数
  106. /// @onTimeUpHandler : 时间到时的回调函数
  107. /// @useFrameSync : 是否使用桢同步
  108. /// @return sequence of timer
  109. //----------------------------------------------
  110. public int AddTimer(int time, int loop, Timer.OnTimeUpHandler onTimeUpHandler, bool useFrameSync)
  111. {
  112. m_timerSequence++;
  113. m_timers[(int)(useFrameSync ? enTimerType.FrameSync : enTimerType.Normal)].Add(new Timer(time, loop, onTimeUpHandler, m_timerSequence));
  114. return m_timerSequence;
  115. }
  116. //----------------------------------------------
  117. /// 添加Timer(带参数版本)
  118. //----------------------------------------------
  119. public int AddTimer(int time, int loop, Timer.OnTimeUpWithParamsHandler onTimeUpWithParamsHandler, bool useFrameSync, stTimerParams timerParams)
  120. {
  121. m_timerSequence++;
  122. m_timers[(int)(useFrameSync ? enTimerType.FrameSync : enTimerType.Normal)].Add(new Timer(time, loop, onTimeUpWithParamsHandler, m_timerSequence, timerParams));
  123. return m_timerSequence;
  124. }
  125. //----------------------------------------------
  126. /// 添加Timer(lua版本)
  127. //----------------------------------------------
  128. public int AddTimer(int time, int loop, bool useFrameSync, LuaFunction onTimeUpHandler, LuaTable timerParams)
  129. {
  130. m_timerSequence++;
  131. m_timers[(int)(useFrameSync ? enTimerType.FrameSync : enTimerType.Normal)].Add(new Timer(time, loop, m_timerSequence, onTimeUpHandler, timerParams));
  132. return m_timerSequence;
  133. }
  134. //----------------------------------------------
  135. /// 添加Timer(lua版本)
  136. //----------------------------------------------
  137. public int AddTimer(int time, int loop, LuaFunction onTimeUpHandler, LuaTable timerParams)
  138. {
  139. return AddTimer(time, loop, null,onTimeUpHandler,timerParams);
  140. }
  141. //----------------------------------------------
  142. /// 添加Timer(lua版本)
  143. //----------------------------------------------
  144. public int AddTimer(int time, int loop,LuaTable luaTable,LuaFunction onTimeUpHandler, LuaTable timerParams)
  145. {
  146. m_timerSequence++;
  147. m_timers[(int)(enTimerType.Normal)].Add(new Timer(time, loop, m_timerSequence,luaTable, onTimeUpHandler, timerParams));
  148. return m_timerSequence;
  149. }
  150. //----------------------------------------------
  151. /// 移除Timer
  152. /// @sequence
  153. //----------------------------------------------
  154. public void RemoveTimer(int sequence)
  155. {
  156. for (int i = 0; i < m_timers.Length; i++)
  157. {
  158. List<Timer> timers = m_timers[i];
  159. for (int j = 0; j < timers.Count; j++)
  160. {
  161. if (timers[j].IsSequenceMatched(sequence))
  162. {
  163. timers[j].Finish();
  164. return;
  165. }
  166. }
  167. }
  168. }
  169. //----------------------------------------------
  170. /// 移除Timer
  171. /// @sequence: ref,移除后清空
  172. //----------------------------------------------
  173. public void RemoveTimerSafely(ref int sequence)
  174. {
  175. if (sequence != 0)
  176. {
  177. RemoveTimer(sequence);
  178. sequence = 0;
  179. }
  180. }
  181. //----------------------------------------------
  182. /// 暂停Timer
  183. /// @sequence
  184. //----------------------------------------------
  185. public void PauseTimer(int sequence)
  186. {
  187. Timer timer = GetTimer(sequence);
  188. if (timer != null)
  189. {
  190. timer.Pause();
  191. }
  192. }
  193. //----------------------------------------------
  194. /// 恢复Timer
  195. /// @sequence
  196. //----------------------------------------------
  197. public void ResumeTimer(int sequence)
  198. {
  199. Timer timer = GetTimer(sequence);
  200. if (timer != null)
  201. {
  202. timer.Resume();
  203. }
  204. }
  205. //----------------------------------------------
  206. /// 重置Timer
  207. /// @sequence
  208. //----------------------------------------------
  209. public void ResetTimer(int sequence)
  210. {
  211. Timer timer = GetTimer(sequence);
  212. if (timer != null)
  213. {
  214. timer.Reset();
  215. }
  216. }
  217. //----------------------------------------------
  218. /// 重设Timer倒计时
  219. /// @sequence
  220. /// @totalTime
  221. //----------------------------------------------
  222. public void ResetTimerTotalTime(int sequence, int totalTime)
  223. {
  224. Timer timer = GetTimer(sequence);
  225. if (timer != null)
  226. {
  227. timer.ResetTotalTime(totalTime);
  228. }
  229. }
  230. //----------------------------------------------
  231. /// 获取Timer的当前时间
  232. /// @sequence
  233. //----------------------------------------------
  234. public int GetTimerCurrent(int sequence)
  235. {
  236. Timer timer = GetTimer(sequence);
  237. if (timer != null)
  238. {
  239. return timer.CurrentTime;
  240. }
  241. return -1;
  242. }
  243. //--------------------------------------
  244. /// 还差多少时间
  245. //--------------------------------------
  246. public int GetLeftTime(int sequence)
  247. {
  248. Timer timer = GetTimer(sequence);
  249. if (timer != null)
  250. {
  251. return timer.GetLeftTime() / 1000; //转成多少秒
  252. }
  253. return -1;
  254. }
  255. //----------------------------------------------
  256. /// 返回指定sequence的Timer
  257. //----------------------------------------------
  258. public Timer GetTimer(int sequence)
  259. {
  260. for (int i = 0; i < m_timers.Length; i++)
  261. {
  262. List<Timer> timers = m_timers[i];
  263. for (int j = 0; j < timers.Count; j++)
  264. {
  265. if (timers[j].IsSequenceMatched(sequence))
  266. {
  267. return timers[j];
  268. }
  269. }
  270. }
  271. return null;
  272. }
  273. //----------------------------------------------
  274. /// 移除Timer
  275. /// @onTimeUpHandler
  276. //----------------------------------------------
  277. public void RemoveTimer(Timer.OnTimeUpHandler onTimeUpHandler)
  278. {
  279. RemoveTimer(onTimeUpHandler, false);
  280. }
  281. //----------------------------------------------
  282. /// 移除Timer(带参数版本)
  283. //----------------------------------------------
  284. public void RemoveTimer(Timer.OnTimeUpWithParamsHandler onTimeUpWithParamsHandler)
  285. {
  286. RemoveTimer(onTimeUpWithParamsHandler, false);
  287. }
  288. public void RemoveTimer(LuaFunction onTimeUpHandler)
  289. {
  290. RemoveTimer(onTimeUpHandler, false);
  291. }
  292. //----------------------------------------------
  293. /// 移除Timer
  294. /// @onTimeUpHandler
  295. /// @useFrameSync
  296. //----------------------------------------------
  297. public void RemoveTimer(Timer.OnTimeUpHandler onTimeUpHandler, bool useFrameSync)
  298. {
  299. List<Timer> timers = m_timers[(int)(useFrameSync ? enTimerType.FrameSync : enTimerType.Normal)];
  300. for (int i = 0; i < timers.Count; i++)
  301. {
  302. if (timers[i].IsDelegateMatched(onTimeUpHandler))
  303. {
  304. timers[i].Finish();
  305. continue;
  306. }
  307. }
  308. }
  309. //----------------------------------------------
  310. /// 移除Timer(带参数版本)
  311. //----------------------------------------------
  312. public void RemoveTimer(Timer.OnTimeUpWithParamsHandler onTimeUpWithParamsHandler, bool useFrameSync)
  313. {
  314. List<Timer> timers = m_timers[(int)(useFrameSync ? enTimerType.FrameSync : enTimerType.Normal)];
  315. for (int i = 0; i < timers.Count; i++)
  316. {
  317. if (timers[i].IsDelegateWithParamsMatched(onTimeUpWithParamsHandler))
  318. {
  319. timers[i].Finish();
  320. continue;
  321. }
  322. }
  323. }
  324. public void RemoveTimer(LuaFunction onTimeUpHandler, bool useFrameSync)
  325. {
  326. List<Timer> timers = m_timers[(int)(useFrameSync ? enTimerType.FrameSync : enTimerType.Normal)];
  327. for (int i = 0; i < timers.Count; i++)
  328. {
  329. if (timers[i].IsLuaFunctionMatched(onTimeUpHandler))
  330. {
  331. timers[i].Finish();
  332. continue;
  333. }
  334. }
  335. }
  336. //----------------------------------------------
  337. /// 移除所有Timer
  338. /// @timerType
  339. //----------------------------------------------
  340. public void RemoveAllTimer(bool useFrameSync)
  341. {
  342. m_timers[(int)(useFrameSync ? enTimerType.FrameSync : enTimerType.Normal)].Clear();
  343. }
  344. //----------------------------------------------
  345. /// 移除所有Timer
  346. //----------------------------------------------
  347. public void RemoveAllTimer()
  348. {
  349. for (int i = 0; i < m_timers.Length; i++)
  350. {
  351. m_timers[i].Clear();
  352. }
  353. }
  354. };