| | |
| | | using System; |
| | | using UnityEngine; |
| | | using System.Collections.Generic; |
| | | using UnityEngine.Events; |
| | | |
| | | public class Clock : MonoBehaviour |
| | | public class Clock |
| | | { |
| | | public bool stopped { get; private set; } |
| | | |
| | | public DateTime alarmTime { |
| | | get; set; |
| | | } |
| | | |
| | | DateTime alarmTime; |
| | | UnityAction alarmCallBack; |
| | | |
| | | public void AddListener(UnityAction _action) |
| | | public Clock(DateTime alarmTime, UnityAction callBack) |
| | | { |
| | | alarmCallBack += _action; |
| | | this.alarmTime = alarmTime; |
| | | this.alarmCallBack = callBack; |
| | | } |
| | | |
| | | public void Stop() |
| | | public bool CanAlarm() |
| | | { |
| | | stopped = true; |
| | | GameObject.Destroy(this.gameObject); |
| | | return DateTime.Now >= alarmTime; |
| | | } |
| | | |
| | | private void Awake() |
| | | public void Execute() |
| | | { |
| | | this.gameObject.hideFlags = HideFlags.HideInHierarchy; |
| | | } |
| | | |
| | | private void LateUpdate() |
| | | { |
| | | if (System.DateTime.Now > alarmTime) |
| | | if (alarmCallBack != null) |
| | | { |
| | | try |
| | | 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(int 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)) |
| | | { |
| | | clocks.Remove(clock); |
| | | } |
| | | } |
| | | |
| | | static void OnUpdate() |
| | | { |
| | | for (var i = clocks.Count - 1; i >= 0; i--) |
| | | { |
| | | var clock = clocks[i]; |
| | | if (clock.CanAlarm()) |
| | | { |
| | | if (alarmCallBack != null) |
| | | try |
| | | { |
| | | alarmCallBack(); |
| | | alarmCallBack = null; |
| | | clock.Execute(); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | Debug.LogException(e); |
| | | } |
| | | finally |
| | | { |
| | | clocks.RemoveAt(i); |
| | | } |
| | | } |
| | | catch (System.Exception ex) |
| | | { |
| | | DebugEx.Log(ex); |
| | | } |
| | | finally |
| | | { |
| | | Stop(); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | public static Clock Create(DateTime _alarmTime, UnityAction _action) |
| | | { |
| | | var carrier = new GameObject(); |
| | | GameObject.DontDestroyOnLoad(carrier); |
| | | |
| | | var clock = carrier.AddComponent<Clock>(); |
| | | clock.alarmTime = _alarmTime; |
| | | clock.AddListener(_action); |
| | | |
| | | return clock; |
| | | } |
| | | |
| | | public static Clock Create(int _seconds, UnityAction _action) |
| | | { |
| | | var carrier = new GameObject(); |
| | | GameObject.DontDestroyOnLoad(carrier); |
| | | |
| | | var clock = carrier.AddComponent<Clock>(); |
| | | clock.alarmTime = System.DateTime.Now + new TimeSpan(_seconds * TimeSpan.TicksPerSecond); |
| | | clock.AddListener(_action); |
| | | |
| | | return clock; |
| | | } |
| | | |
| | | } |