zoukankan      html  css  js  c++  java
  • Unity计时器系统

    很好用,方便

    using System;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class TimerManager : MonoBehaviour
    {
        private List<Timer> _usedTimes = new List<Timer>();
        private Queue<Timer> _canceledTimes = new Queue<Timer>();
    
        public void Update()
        {
            int count = _usedTimes.Count;
            for (int i = count -1; i >= 0; i--)
            {
                _usedTimes[i].Uptate();
            }
        }
        public void CancelTimer(Timer timer)
        {
            _usedTimes.Remove(timer);
    
            if(_canceledTimes.Count < 10)
            {
                timer.Cancel();
                _canceledTimes.Enqueue(timer);
            }
        }
        public Timer AddTimer(float delayTime, Action excuteFunc)
        {
            return AddTimer(delayTime, 1, delayTime, false, excuteFunc, null, null);
        }
        public Timer AddTimer(float duration, int loopTimes, Action excuteFunc)
        {
            return AddTimer(duration, loopTimes, duration, false, excuteFunc, null, null);
        }
        public Timer AddTimer(float duration, float loopTimes, float delayTime, Action excuteFunc)
        {
            return AddTimer(duration, loopTimes, delayTime, false, excuteFunc, null, null);
        }
        public Timer AddTimer(float duration, float loopTimes, float delayTime, bool isRealTime, Action excuteFunc)
        {
            return AddTimer(duration, loopTimes, delayTime, isRealTime, excuteFunc, null, null);
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="duration">2次执行的时间间隔</param>
        /// <param name="loopTimes">循环几次</param>
        /// <param name="delayTime">第一次的延迟</param>
        /// <param name="isRealTime">是否真实时间</param>
        /// <param name="excuteFunc">执行体</param>
        /// <param name="completeFunc">完成调用</param>
        /// <param name="finishFunc">取消时调用</param>
        /// <returns></returns>
        public Timer AddTimer(float duration, float loopTimes, float delayTime, bool isRealTime, Action excuteFunc, Action completeFunc, Action finishFunc)
        {
            Timer timer = null;
            if (_canceledTimes.Count > 0)
            {
                timer = _canceledTimes.Dequeue();
            }
            else
                timer = new Timer(this);
    
            timer.Create(duration, loopTimes, delayTime, isRealTime, excuteFunc, completeFunc, finishFunc);
            _usedTimes.Add(timer);
    
            return timer;
        }
    }
    using System;
    using UnityEngine;
    
    public class Timer
    {
        public Timer(TimerManager tm)
        {
            timerManager = tm;
        }
        
        public float duration;
        public float loopTimes;
        public float delayTime;
        public bool isRealTime;
        public Action completeFunc;
        public Action finishFunc;
        public Action excuteFunc;
    
        private TimerManager timerManager;
        private float _lastDoneTime;
        private float _startTime;
        public void Create(float duration, float loopTimes, float delayTime, bool isRealTime, Action excuteFunc, Action completeFunc, Action finishFunc)
        {
            this.duration = duration;
            this.loopTimes = loopTimes;
            this.delayTime = delayTime;
            this.isRealTime = isRealTime;
            this.completeFunc = completeFunc;
            this.finishFunc = finishFunc;
            this.excuteFunc = excuteFunc;
    
            float curTime = GetTime();
            _startTime = curTime + delayTime;
        }
        public void Uptate()
        {
            float curTime = GetTime();
            if (_lastDoneTime < 0)
            {
                // 第一次执行
                if(curTime >= _startTime)
                {
                    if (excuteFunc != null)
                        excuteFunc();
    
                    _lastDoneTime = curTime;
                    if(loopTimes != -1)
                    {
                        loopTimes--;
                        if(loopTimes == 0)
                        {
                            if (finishFunc != null)
                                finishFunc();
    
                            timerManager.CancelTimer(this);
                        }
                    }
                }
            }
            else
            {
                // 循环执行
                if (curTime - _lastDoneTime >= duration)
                {
                    if (excuteFunc != null)
                        excuteFunc();
    
                    _lastDoneTime = curTime;
                    if (loopTimes != -1)
                    {
                        loopTimes--;
                        if (loopTimes == 0)
                        {
                            if (finishFunc != null)
                                finishFunc();
    
                            timerManager.CancelTimer(this);
                        }
                    }
                }
            }
        }
        private float GetTime()
        {
            if (isRealTime)
                return Time.realtimeSinceStartup;
            else
                return Time.time;
        }
        public void Cancel()
        {
            _lastDoneTime = -1;
            _startTime = 0;
        }
    }
  • 相关阅读:
    开源交易所源码搜集
    域名
    国外大牛博客
    Fomo3D代码分析以及漏洞攻击演示
    Small组件化重构安卓项目
    html span和div的区别
    七牛云
    以太坊钱包安全性保证
    跨域问题
    checkout 到bit/master分支
  • 原文地址:https://www.cnblogs.com/sanyejun/p/12165768.html
Copyright © 2011-2022 走看看