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); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
} 
 |