| using System; | 
| using UnityEngine; | 
| using System.Collections.Generic; | 
| using UnityEngine.Events; | 
|   | 
|   | 
| public class Clock | 
| { | 
|     public bool stopped { get; set; } | 
|     DateTime alarmTime; | 
|     UnityAction alarmCallBack; | 
|   | 
|     public Clock(DateTime alarmTime, UnityAction callBack) | 
|     { | 
|         this.alarmTime = alarmTime; | 
|         this.alarmCallBack = callBack; | 
|     } | 
|   | 
|     public bool CanAlarm() | 
|     { | 
|         return DateTime.Now >= alarmTime; | 
|     } | 
|   | 
|     public void Execute() | 
|     { | 
|         if (alarmCallBack != null) | 
|         { | 
|             alarmCallBack(); | 
|             alarmCallBack = null; | 
|         } | 
|     } | 
|   | 
|     static List<Clock> clocks = new List<Clock>(); | 
|   | 
|     public static void Init() | 
|     { | 
|         new LogicUpdate().Start(OnUpdate); | 
|     } | 
|   | 
|     public static Clock AlarmAt(DateTime alarmTime, UnityAction callBack) | 
|     { | 
|         var clock = new Clock(alarmTime, callBack); | 
|   | 
|         clocks.Add(clock); | 
|         return clock; | 
|     } | 
|   | 
|     public static Clock AlarmAfter(double seconds, UnityAction callBack) | 
|     { | 
|         var clock = new Clock(DateTime.Now.AddSeconds(seconds), callBack); | 
|   | 
|         clocks.Add(clock); | 
|         return clock; | 
|     } | 
|   | 
|     public static void Stop(Clock clock) | 
|     { | 
|         if (clocks.Contains(clock)) | 
|         { | 
|             clock.stopped = true; | 
|         } | 
|     } | 
|   | 
|     static void OnUpdate() | 
|     { | 
|         for (var i = clocks.Count - 1; i >= 0; i--) | 
|         { | 
|             var clock = clocks[i]; | 
|             if (clock.stopped) | 
|             { | 
|                 clocks.RemoveAt(i); | 
|                 continue; | 
|             } | 
|   | 
|             if (clock.CanAlarm()) | 
|             { | 
|                 try | 
|                 { | 
|                     clock.Execute(); | 
|                     clocks.RemoveAt(i); | 
|                 } | 
|                 catch (Exception e) | 
|                 { | 
|                     Debug.LogException(e); | 
|                 } | 
|             } | 
|         } | 
|     } | 
|   | 
| } |