通用框架(五)Time管理

计时器是我们每个项目中都会用到的一个处理时间的一个管理器。

以前写项目基本都是哪个地方用到了,在哪个地方写,非常不规范也不好维护。

刚好趁这次写framework也给集成进去。

其实计时器没什么好写的,我就把我的思路大概写一下。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace JIANING
{
    /// <summary>
    /// 定时器
    /// </summary>
    public class TimeAction
    {
        /// <summary>
        /// 是否运行中
        /// </summary>
        public bool IsRuning
        {
            get;
            private set;
        }

        /// <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 表示无限循环
        /// 0 也会循环一次
        /// </summary>
        private int m_Loop;

        //开始运行
        private Action m_OnStart;
        //运行中 参数表示剩余次数
        private Action<int> m_OnUpdate;
        //结束运行
        private Action m_OnComplete;

        /// <summary>
        /// 初始化
        /// </summary>
        public TimeAction Init(
            float DelayTime,
            float Interval,
            int Loop,
            Action OnStart,
            Action<int> OnUpdate,
            Action OnComplete
            )
        {
            m_DelayTime = DelayTime;
            m_Interval = Interval;
            m_Loop = Loop;
            m_OnStart = OnStart;
            m_OnUpdate = OnUpdate;
            m_OnComplete = OnComplete;
            m_CurrLoop = 0;

            return this;
        }

        public void Run()
        {
            //1.需要先把自己时间管理器的链表中
            GameEntry.Time.RegisterTimeAction(this);

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

        }

        public void Pause()
        {
            IsRuning = false;
        }

        public void Stop()
        {
            m_OnComplete?.Invoke();

            IsRuning = false;

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

        }


        /// <summary>
        /// 每帧执行
        /// </summary>
        public void OnUpdate()
        {
            if (!IsRuning && Time.time > m_CurrRunTime + m_DelayTime)
            {
                //程序执行到这里的时候 表示已经过了第一次延迟时间
                IsRuning = true;
                m_CurrRunTime = Time.time;


                m_OnStart?.Invoke();
            }

            if (!IsRuning) return;

            if (Time.time > m_CurrRunTime)
            {
                m_CurrRunTime = Time.time + m_Interval;

                //以下代码 间隔interval时间 执行一次
                m_OnUpdate?.Invoke(m_Loop - m_CurrLoop);
              
                if (m_Loop > -1)
                {
                    m_CurrLoop++;
                    if (m_CurrLoop >= m_Loop)
                    {
                        Stop();
                    }
                }

            }
        }
    }
}

刚好写了一个对象池,把对象池给用上

测试脚本

留下评论

邮箱地址不会被公开。 必填项已用*标注