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;
        }
    }
  • 相关阅读:
    新年新气象~
    北京不下雪,自己来点雪花看看吧~(附效果图)
    没事写个游戏自己玩~
    原生js实现简单的焦点图效果
    php xdebug扩展无法进入断点问题
    (转)没有IE就没有伤害!浏览器兼容性问题解决方案汇总
    利用mvc filterconfig属性实现权限验证
    c# 替换所有中文、标点符号,全角转半角
    go web 第三天 学习笔记 --mysql
    go web 第二天 学习笔记之文件上传
  • 原文地址:https://www.cnblogs.com/sanyejun/p/12165768.html
Copyright © 2011-2022 走看看