| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 | 
							- using System.Collections.Generic;
 
- using System.Collections;
 
- using UnityEngine;
 
- namespace FairyGUI
 
- {
 
-     public delegate void TimerCallback(object param);
 
-     /// <summary>
 
-     /// 
 
-     /// </summary>
 
-     public class Timers
 
-     {
 
-         public static int repeat;
 
-         public static float time;
 
-         public static bool catchCallbackExceptions = false;
 
-         Dictionary<TimerCallback, Anymous_T> _items;
 
-         Dictionary<TimerCallback, Anymous_T> _toAdd;
 
-         List<Anymous_T> _toRemove;
 
-         List<Anymous_T> _pool;
 
-         TimersEngine _engine;
 
-         GameObject gameObject;
 
-         private static Timers _inst;
 
-         public static Timers inst
 
-         {
 
-             get
 
-             {
 
-                 if (_inst == null)
 
-                     _inst = new Timers();
 
-                 return _inst;
 
-             }
 
-         }
 
-         public Timers()
 
-         {
 
-             _inst = this;
 
-             gameObject = new GameObject("[FairyGUI.Timers]");
 
-             gameObject.hideFlags = HideFlags.HideInHierarchy;
 
-             gameObject.SetActive(true);
 
-             Object.DontDestroyOnLoad(gameObject);
 
-             _engine = gameObject.AddComponent<TimersEngine>();
 
-             _items = new Dictionary<TimerCallback, Anymous_T>();
 
-             _toAdd = new Dictionary<TimerCallback, Anymous_T>();
 
-             _toRemove = new List<Anymous_T>();
 
-             _pool = new List<Anymous_T>(100);
 
-         }
 
-         public void Add(float interval, int repeat, TimerCallback callback)
 
-         {
 
-             Add(interval, repeat, callback, null);
 
-         }
 
-         /**
 
-          * @interval in seconds
 
-          * @repeat 0 indicate loop infinitely, otherwise the run count
 
-          **/
 
-         public void Add(float interval, int repeat, TimerCallback callback, object callbackParam)
 
-         {
 
-             if (callback == null)
 
-             {
 
-                 Debug.LogWarning("timer callback is null, " + interval + "," + repeat);
 
-                 return;
 
-             }
 
-             Anymous_T t;
 
-             if (_items.TryGetValue(callback, out t))
 
-             {
 
-                 t.set(interval, repeat, callback, callbackParam);
 
-                 t.elapsed = 0;
 
-                 t.deleted = false;
 
-                 return;
 
-             }
 
-             if (_toAdd.TryGetValue(callback, out t))
 
-             {
 
-                 t.set(interval, repeat, callback, callbackParam);
 
-                 return;
 
-             }
 
-             t = GetFromPool();
 
-             t.interval = interval;
 
-             t.repeat = repeat;
 
-             t.callback = callback;
 
-             t.param = callbackParam;
 
-             _toAdd[callback] = t;
 
-         }
 
-         public void CallLater(TimerCallback callback)
 
-         {
 
-             Add(0.001f, 1, callback);
 
-         }
 
-         public void CallLater(TimerCallback callback, object callbackParam)
 
-         {
 
-             Add(0.001f, 1, callback, callbackParam);
 
-         }
 
-         public void AddUpdate(TimerCallback callback)
 
-         {
 
-             Add(0.001f, 0, callback);
 
-         }
 
-         public void AddUpdate(TimerCallback callback, object callbackParam)
 
-         {
 
-             Add(0.001f, 0, callback, callbackParam);
 
-         }
 
-         public void StartCoroutine(IEnumerator routine)
 
-         {
 
-             _engine.StartCoroutine(routine);
 
-         }
 
-         public bool Exists(TimerCallback callback)
 
-         {
 
-             if (_toAdd.ContainsKey(callback))
 
-                 return true;
 
-             Anymous_T at;
 
-             if (_items.TryGetValue(callback, out at))
 
-                 return !at.deleted;
 
-             return false;
 
-         }
 
-         public void Remove(TimerCallback callback)
 
-         {
 
-             Anymous_T t;
 
-             if (_toAdd.TryGetValue(callback, out t))
 
-             {
 
-                 _toAdd.Remove(callback);
 
-                 ReturnToPool(t);
 
-             }
 
-             if (_items.TryGetValue(callback, out t))
 
-                 t.deleted = true;
 
-         }
 
-         private Anymous_T GetFromPool()
 
-         {
 
-             Anymous_T t;
 
-             int cnt = _pool.Count;
 
-             if (cnt > 0)
 
-             {
 
-                 t = _pool[cnt - 1];
 
-                 _pool.RemoveAt(cnt - 1);
 
-                 t.deleted = false;
 
-                 t.elapsed = 0;
 
-             }
 
-             else
 
-                 t = new Anymous_T();
 
-             return t;
 
-         }
 
-         private void ReturnToPool(Anymous_T t)
 
-         {
 
-             t.callback = null;
 
-             _pool.Add(t);
 
-         }
 
-         public void Update()
 
-         {
 
-             float dt = Time.unscaledDeltaTime;
 
-             Dictionary<TimerCallback, Anymous_T>.Enumerator iter;
 
-             if (_items.Count > 0)
 
-             {
 
-                 iter = _items.GetEnumerator();
 
-                 while (iter.MoveNext())
 
-                 {
 
-                     Anymous_T i = iter.Current.Value;
 
-                     if (i.deleted)
 
-                     {
 
-                         _toRemove.Add(i);
 
-                         continue;
 
-                     }
 
-                     i.elapsed += dt;
 
-                     if (i.elapsed < i.interval)
 
-                         continue;
 
-                     i.elapsed -= i.interval;
 
-                     if (i.elapsed < 0 || i.elapsed > 0.03f)
 
-                         i.elapsed = 0;
 
-                     if (i.repeat > 0)
 
-                     {
 
-                         i.repeat--;
 
-                         if (i.repeat == 0)
 
-                         {
 
-                             i.deleted = true;
 
-                             _toRemove.Add(i);
 
-                         }
 
-                     }
 
-                     repeat = i.repeat;
 
-                     if (i.callback != null)
 
-                     {
 
-                         if (catchCallbackExceptions)
 
-                         {
 
-                             try
 
-                             {
 
-                                 i.callback(i.param);
 
-                             }
 
-                             catch (System.Exception e)
 
-                             {
 
-                                 i.deleted = true;
 
-                                 Debug.LogWarning("FairyGUI: timer(internal=" + i.interval + ", repeat=" + i.repeat + ") callback error > " + e.Message);
 
-                             }
 
-                         }
 
-                         else
 
-                             i.callback(i.param);
 
-                     }
 
-                 }
 
-                 iter.Dispose();
 
-             }
 
-             int len = _toRemove.Count;
 
-             if (len > 0)
 
-             {
 
-                 for (int k = 0; k < len; k++)
 
-                 {
 
-                     Anymous_T i = _toRemove[k];
 
-                     if (i.deleted && i.callback != null)
 
-                     {
 
-                         _items.Remove(i.callback);
 
-                         ReturnToPool(i);
 
-                     }
 
-                 }
 
-                 _toRemove.Clear();
 
-             }
 
-             if (_toAdd.Count > 0)
 
-             {
 
-                 iter = _toAdd.GetEnumerator();
 
-                 while (iter.MoveNext())
 
-                     _items.Add(iter.Current.Key, iter.Current.Value);
 
-                 iter.Dispose();
 
-                 _toAdd.Clear();
 
-             }
 
-         }
 
-     }
 
-     class Anymous_T
 
-     {
 
-         public float interval;
 
-         public int repeat;
 
-         public TimerCallback callback;
 
-         public object param;
 
-         public float elapsed;
 
-         public bool deleted;
 
-         public void set(float interval, int repeat, TimerCallback callback, object param)
 
-         {
 
-             this.interval = interval;
 
-             this.repeat = repeat;
 
-             this.callback = callback;
 
-             this.param = param;
 
-         }
 
-     }
 
-     class TimersEngine : MonoBehaviour
 
-     {
 
-         void Update()
 
-         {
 
-             Timers.inst.Update();
 
-         }
 
-     }
 
- }
 
 
  |