修正定时器暂停延迟问题

定时器周期有延迟阶段和运行阶段,如果延迟阶段暂停,再开启,就直接进入运行阶段了。

一开始运行游戏会有延迟,延迟阶段,可以设置延迟时间,过了延迟时间就开始运行。

 

 

 

 public class TimeAction
    {
        /// <summary>
        /// 是否正在运行
        /// </summary>
        public bool IsRuning { get; private set; }

        /// <summary>
        /// 是否暂停
        /// </summary>
        public bool m_IsPause = false;

        /// <summary>
        /// 当前运行的时间
        /// </summary>
        private float m_CurrRunTime;

        /// <summary>
        /// 当前循环次数
        /// </summary>
        private int m_CurrLoop;

        /// <summary>
        /// 延迟时间
        /// </summary>
        private float m_DelayTime;

        /// <summary>
        /// 间隔(秒)
        /// </summary>
        private float m_Interval;

        /// <summary>
        /// 循环次数(-1 表示无限循环)
        /// </summary>
        private int m_Loop;

        /// <summary>
        /// 最后暂停时间
        /// </summary>
        private float m_LastPauseTime;

        /// <summary>
        /// 暂停了多久
        /// </summary>
        private float m_PauseTime;

        /// <summary>
        /// 开始运行
        /// </summary>
        private Action m_OnStar;
        /// <summary>
        /// 运行中 回调参数表示剩余次数
        /// </summary>
        private Action<int> m_OnUpdate;
        /// <summary>
        /// 运行完毕
        /// </summary>
        private Action m_OnComplete;

        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="delayTime">延迟时间</param>
        /// <param name="interval">间隔(秒)</param>
        /// <param name="loop">循环次数</param>
        /// <param name="onStar">开始运行</param>
        /// <param name="onUpdate">运行中 回调参数表示剩余次数</param>
        /// <param name="onComplete">运行完毕</param>
        /// <returns>this对象</returns>
        public TimeAction Init(float delayTime, float interval, int loop, Action onStar, Action<int> onUpdate, Action onComplete)
        {
            m_DelayTime = delayTime;
            m_Interval = interval;
            m_Loop = loop;
            m_OnStar = onStar;
            m_OnUpdate = onUpdate;
            m_OnComplete = onComplete;

            return this;
        }

        /// <summary>
        /// 开始运行
        /// </summary>
        public void Run()
        {
            //1.需要先把自己注册进时间管理器的链表中
            GameEntry.Time.RegisterTimeAction(this);

            //2.设置当前运行的时间
            m_CurrRunTime = Time.time;

            m_IsPause = false;
        }
        /// <summary>
        /// 停止
        /// </summary>
        public void Stop()
        {
            if (m_OnComplete != null) m_OnComplete();

            IsRuning = false;

            //把自己从时间管理器链表中移除
            GameEntry.Time.RemoveTimeAction(this);
        }

        /// <summary>
        /// 暂停
        /// </summary>
        public void Pause()
        {
            m_LastPauseTime = Time.time;
            m_IsPause = true;
        }
        /// <summary>
        /// 恢复(取消暂停)
        /// </summary>
        public void Resume()
        {
            m_IsPause = false;

            //计算暂停了多久
            m_PauseTime = Time.time - m_LastPauseTime;
        }


        internal void OnUpdate()
        {
            if (m_IsPause) return;

            //1延迟阶段阶段暂停,等待延迟时间
            //暂停时间+延时时间+暂停了多久
            if (Time.time > m_CurrRunTime + m_DelayTime + m_PauseTime )
            {
                Debug.Log("当程序执行到这里表示已经过了延迟时间");
                if (!IsRuning)
                {
                    //开始运行
                    m_CurrRunTime = Time.time;
                    m_PauseTime = 0;
                    if (m_OnStar != null) m_OnStar();

                    IsRuning = true;
                }
            }

            if (!IsRuning) return;


            //延迟阶段阶段暂停,加上暂停了多久
            if (Time.time > m_CurrRunTime + m_PauseTime)
            {
                m_CurrRunTime = Time.time + m_Interval;
                m_PauseTime = 0;

                //处理 循环间隔m_Interval 秒 执行一次
                if (m_OnUpdate != null) m_OnUpdate(m_Loop - m_CurrLoop);

                if (m_Loop > -1)//循环次数
                {
                    m_CurrLoop++;
                    if (m_CurrLoop >= m_Loop) Stop();
                }
            }
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值