yyl
2025-07-29 b0a5d4688f1af73b5ad03ccc2df11c9aac1523a9
Main/System/Message/WaitCallBack.cs
@@ -2,168 +2,168 @@
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 延迟几秒执行事件
/// </summary>
public class WaitCallBack : MonoBehaviour
{
    internal float waitTime = 2.0f;
    public bool doOnAwake = false;
    /// <summary>
    /// 延迟几秒执行事件
    /// 时间到达回调
    /// </summary>
    public class WaitCallBack : MonoBehaviour
    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()
    {
        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)
        {
            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
    private void OnDisable()
    {
        public static void DoWaitStart(this Component go)
        {
            if (GetWait(go) == null)
                return;
            GetWait(go).Play();
        }
        Stop();
    }
        public static void OnWaitCompelete(this Component go, Action<Component> func)
    private void Update()
    {
        if (start)
        {
            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)
            m_Time += Time.deltaTime;
            if (m_Time >= waitTime)
            {
                wait = go.GetComponent<WaitCallBack>();
                if (wait == null)
                {
                    wait = go.gameObject.AddComponent<WaitCallBack>();
                }
                wait.AddWaitDic(go);
                Stop();
                if (OnCompelete != null)
                    OnCompelete(m_Comp);
            }
            return wait;
        }
        public static void SetWait(this Component comp, float time)
        {
            WaitCallBack wait = GetWait(comp);
            if (wait != null)
            {
                wait.waitTime = time;
            }
            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;
        }
    }
}