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