| using System; | 
| using System.Collections.Generic; | 
| using UnityEngine; | 
|   | 
| /// <summary> | 
| /// 延迟几秒执行事件 | 
| /// </summary> | 
| public class WaitCallBack : MonoBehaviour | 
| { | 
|     internal float waitTime = 2.0f; | 
|   | 
|     public bool doOnAwake = false; | 
|     /// <summary> | 
|     /// 时间到达回调 | 
|     /// </summary> | 
|     public Action<Component> OnCompelete; | 
|     /// <summary> | 
|     /// 每帧回调 | 
|     /// </summary> | 
|     public Action<Component> OnWait; | 
|   | 
|     internal static Dictionary<GameObject, WaitCallBack> waitDic = new Dictionary<GameObject, WaitCallBack>(); | 
|   | 
|     private float m_Time = 0; | 
|   | 
|     private bool start = false; | 
|   | 
|     private Component m_Comp; | 
|   | 
|     private void Awake() | 
|     { | 
|         if (doOnAwake) | 
|         { | 
|             Play(); | 
|         } | 
|     } | 
|   | 
|     private void OnDisable() | 
|     { | 
|         Stop(); | 
|     } | 
|   | 
|     private void Update() | 
|     { | 
|         if (start) | 
|         { | 
|             m_Time += Time.deltaTime; | 
|             if (m_Time >= waitTime) | 
|             { | 
|                 Stop(); | 
|                 if (OnCompelete != null) | 
|                     OnCompelete(m_Comp); | 
|             } | 
|             if (OnWait != null && start) | 
|                 OnWait(m_Comp); | 
|         } | 
|     } | 
|   | 
|     internal void Play() | 
|     { | 
|         start = true; | 
|     } | 
|   | 
|     internal void Restart() | 
|     { | 
|         m_Time = 0; | 
|         Play(); | 
|     } | 
|   | 
|     internal void Stop() | 
|     { | 
|         m_Time = 0; | 
|         start = false; | 
|     } | 
|   | 
|     internal void Pause() | 
|     { | 
|         start = false; | 
|     } | 
|   | 
|     private void OnDestroy() | 
|     { | 
|         if (waitDic.ContainsKey(gameObject)) | 
|         { | 
|             waitDic.Remove(gameObject); | 
|         } | 
|     } | 
|   | 
|     internal void AddWaitDic(Component go) | 
|     { | 
|         m_Comp = go; | 
|         waitDic.Add(go.gameObject, this); | 
|     } | 
| } | 
|   | 
| public static class Helper | 
| { | 
|     public static void DoWaitStart(this Component go) | 
|     { | 
|         if (GetWait(go) == null) | 
|             return; | 
|         GetWait(go).Play(); | 
|     } | 
|   | 
|     public static void OnWaitCompelete(this Component go, Action<Component> func) | 
|     { | 
|         WaitCallBack wait = GetWait(go); | 
|         if (wait == null) | 
|             return; | 
|         wait.OnCompelete = func; | 
|     } | 
|   | 
|     public static void OnWait(this Component go, Action<Component> func) | 
|     { | 
|         WaitCallBack wait = GetWait(go); | 
|         if (wait == null) | 
|             return; | 
|         wait.OnWait = func; | 
|     } | 
|   | 
|     public static void DoWaitRestart(this Component go) | 
|     { | 
|         if (GetWait(go) == null) | 
|             return; | 
|         GetWait(go).Restart(); | 
|     } | 
|   | 
|     public static void DoWaitStop(this Component go) | 
|     { | 
|         if (GetWait(go) == null) | 
|             return; | 
|         GetWait(go).Stop(); | 
|     } | 
|   | 
|     public static void DoWaitPause(this Component go) | 
|     { | 
|         if (GetWait(go) == null) | 
|             return; | 
|         GetWait(go).Pause(); | 
|     } | 
|   | 
|     public static WaitCallBack GetWait(Component go) | 
|     { | 
|         WaitCallBack wait = null; | 
|         if (go == null) | 
|             return null; | 
|         WaitCallBack.waitDic.TryGetValue(go.gameObject, out wait); | 
|         if (wait == null) | 
|         { | 
|             wait = go.GetComponent<WaitCallBack>(); | 
|             if (wait == null) | 
|             { | 
|                 wait = go.gameObject.AddComponent<WaitCallBack>(); | 
|             } | 
|             wait.AddWaitDic(go); | 
|         } | 
|         return wait; | 
|     } | 
|   | 
|     public static void SetWait(this Component comp, float time) | 
|     { | 
|         WaitCallBack wait = GetWait(comp); | 
|         if (wait != null) | 
|         { | 
|             wait.waitTime = time; | 
|         } | 
|     } | 
| } |