Unity通用计时器

  1. 计时器支持开始、暂停、继续、取消等功能,可设置计时时间和重复计时的次数。
  2. 计时器由Timer和TimerDriver控制,其中Timer设置计时器参数,TimerDriver实现计时

代码:

Timer管理器,负责创建TimerDriver

    using UnityEngine;public class TimerManager : MonoSingleton<TimerManager>{private void Awake(){gameObject.hideFlags = HideFlags.HideInHierarchy;}/// <summary>/// 创建计时驱动器/// </summary>/// <param name="data"></param>public TimerDriver CreateTimerDriver(Timer data){GameObject driverTarget = new GameObject();driverTarget.name = "TimeDriver";driverTarget.transform.SetParent(transform);TimerDriver driver = driverTarget.AddComponent<TimerDriver>();driver.InitTimerDriver(data);return driver;}}

Timer:负责创建计时器,暂停、继续等功能,存储计时相关数据

    using System;public class Timer{/// <summary>/// 延迟时间/// </summary>public float delayTime { get; private set; }/// <summary>/// 持续时间/// </summary>public float duration { get; private set; }/// <summary>/// 计时检测间隔/// </summary>internal float intervalTime { get; private set; }/// <summary>/// 重复次数/// </summary>public int repeatCount { get; private set; }/// <summary>/// 重复间隔/// </summary>public float repeatTime { get; private set; }/// <summary>/// 已重复计时次数/// </summary>public int repeatedCount { get; private set; }/// <summary>/// 当前次 已计时时间/// </summary>public float passedTime { get; private set; }internal enum TimerState{/// <summary>/// 开始计时/// </summary>Start,/// <summary>/// 准备计时/// </summary>Prepare,/// <summary>/// 计时中/// </summary>Timing,/// <summary>/// 暂停计时/// </summary>Pause,/// <summary>/// 停止计时/// </summary>Stop,}/// <summary>/// 计时器状态/// </summary>internal TimerState currentTimerState { get; private set; }/// <summary>/// 是否忽略时间速率/// </summary>internal bool ignoreTimeScale { get; private set; }/// <summary>/// 开始/// </summary>private Action onStart;/// <summary>/// 暂停/// </summary>private Action onPause;/// <summary>/// 继续/// </summary>private Action onResume;/// <summary>/// 完成/// </summary>private Action onCompleted;/// <summary>/// 取消/// </summary>private Action onCancel;/// <summary>/// 正在计时中/// </summary>private Action<float> onTiming;/// <summary>/// 重开始/// </summary>private Action onReStart;/// <summary>/// 驱动器 暂停/// </summary>private Action onDriverPause;/// <summary>/// 驱动器 继续/// </summary>private Action onDriverResume;private Timer(){repeatedCount = 0;passedTime = 0;}~Timer(){onStart = null;onPause = null;onResume = null;onCompleted = null;onCancel = null;onTiming = null;onReStart = null;onDriverPause = null;onDriverResume = null;}/// <summary>/// 开始计时/// </summary>/// <param name="duration">计时时长(/s)</param>/// <param name="intervalTime">检测间隔(/s)</param>/// <param name="completed">计时完成回调</param>/// <param name="ignoreTimeScale">是否忽略时间速率</param>/// <returns></returns>public static Timer Start(float duration, Action completed, float intervalTime = 1, bool ignoreTimeScale = false){return Start(duration, 0, intervalTime, 0, 0, null, null, completed, null, null, null, null, ignoreTimeScale);}/// <summary>/// 开始计时/// </summary>/// <param name="duration">计时时长(/s)</param>/// <param name="delayTime">延时计时时长(/s)</param>/// <param name="intervalTime">检测间隔(/s)</param>/// <param name="completed">计时完成回调</param>/// <param name="ignoreTimeScale">是否忽略时间速率</param>/// <returns></returns>public static Timer Start(float duration, float delayTime, Action completed, float intervalTime = 1, bool ignoreTimeScale = false){return Start(duration, delayTime, intervalTime, 0, 0, null, null, completed, null, null, null, null, ignoreTimeScale);}/// <summary>/// 开始计时/// </summary>/// <param name="duration">计时时长(/s)</param>/// <param name="intervalTime">检测间隔(/s)</param>/// <param name="completed">计时完成回调</param>/// <param name="update">计时中回调</param>/// <param name="ignoreTimeScale">是否忽略时间速率</param>/// <returns></returns>public static Timer Start(float duration, Action<float> update, Action completed, float intervalTime = 1, bool ignoreTimeScale = false){return Start(duration, 0, intervalTime, 0, 0, null, update, completed, null, null, null, null, ignoreTimeScale);}/// <summary>/// 开始计时/// </summary>/// <param name="duration">计时时长(/s)</param>/// <param name="delayTime">延时计时时长(/s)</param>/// <param name="intervalTime">检测间隔(/s)</param>/// <param name="update">计时中回调</param>/// <param name="completed">计时完成回调</param>/// <param name="ignoreTimeScale">是否忽略时间速率</param>/// <returns></returns>public static Timer Start(float duration, float delayTime, Action<float> update, Action completed, float intervalTime = 1, bool ignoreTimeScale = false){return Start(duration, delayTime, intervalTime, 0, 0, null, update, completed, null, null, null, null, ignoreTimeScale);}/// <summary>/// 开始计时/// </summary>/// <param name="duration">计时时长(/s)</param>/// <param name="intervalTime">检测间隔(/s)</param>/// <param name="start">开始计时回调</param>/// <param name="update">计时中回调</param>/// <param name="completed">计时完成回调</param>/// <param name="pause">计时暂停回调</param>/// <param name="resume">计时继续回调</param>/// <param name="cancel">计时取消回调</param>/// <param name="restart">计时重开始回调</param>/// <param name="ignoreTimeScale">是否忽略时间速率</param>/// <returns></returns>public static Timer Start(float duration, Action start, Action<float> update, Action completed, Action pause, Action resume, Action cancel, Action restart, float intervalTime = 1, bool ignoreTimeScale = false){return Start(duration, 0, intervalTime, 0, 0, start, update, completed, pause, resume, cancel, restart, ignoreTimeScale);}/// <summary>/// 开始计时/// </summary>/// <param name="duration">计时时长(/s)</param>/// <param name="delayTime">延时计时时长(/s)</param>/// <param name="intervalTime">检测间隔(/s)</param>/// <param name="start">开始计时回调</param>/// <param name="update">计时中回调</param>/// <param name="completed">计时完成回调</param>/// <param name="pause">计时暂停回调</param>/// <param name="resume">计时继续回调</param>/// <param name="cancel">计时取消回调</param>/// <param name="restart">计时重开始回调</param>/// <param name="ignoreTimeScale">是否忽略时间速率</param>/// <returns></returns>public static Timer Start(float duration, float delayTime, Action start, Action<float> update, Action completed, Action pause, Action resume, Action cancel, Action restart, float intervalTime = 1, bool ignoreTimeScale = false){return Start(duration, delayTime, intervalTime, 0, 0, start, update, completed, pause, resume, cancel, restart, ignoreTimeScale);}/// <summary>/// 开始计时/// </summary>/// <param name="duration">计时时长(/s)</param>/// <param name="intervalTime">检测间隔(/s)</param>/// <param name="repeatCount">重复计时次数 value <0 无限次 =0/1 1次</param>/// <param name="repeatTime">重复计时等待间隔</param>/// <param name="completed">计时完成回调</param>/// <param name="ignoreTimeScale">是否忽略时间速率</param>/// <returns></returns>public static Timer Start(float duration, int repeatCount, float repeatTime, Action completed, float intervalTime = 1, bool ignoreTimeScale = false){return Start(duration, 0, intervalTime, repeatCount, repeatTime, null, null, completed, null, null, null, null, ignoreTimeScale);}/// <summary>/// 开始计时/// </summary>/// <param name="duration">计时时长(/s)</param>/// <param name="delayTime">延时计时时长(/s)</param>/// <param name="intervalTime">检测间隔(/s)</param>/// <param name="repeatCount">重复计时次数 value <0 无限次 =0/1 1次</param>/// <param name="repeatTime">重复计时等待间隔</param>/// <param name="completed">计时完成回调</param>/// <param name="ignoreTimeScale">是否忽略时间速率</param>public static Timer Start(float duration, float delayTime, int repeatCount, float repeatTime, Action completed, float intervalTime = 1, bool ignoreTimeScale = false){return Start(duration, delayTime, intervalTime, repeatCount, repeatTime, null, null, completed, null, null, null, null, ignoreTimeScale);}/// <summary>/// 开始计时/// </summary>/// <param name="duration">计时时长(/s)</param>/// <param name="intervalTime">检测间隔(/s)</param>/// <param name="repeatCount">重复计时次数 value <0 无限次 =0/1 1次</param>/// <param name="repeatTime">重复计时等待间隔</param>/// <param name="update">计时中回调</param>/// <param name="completed">计时完成回调</param>/// <param name="ignoreTimeScale">是否忽略时间速率</param>/// <returns></returns>public static Timer Start(float duration, int repeatCount, float repeatTime, Action<float> update, Action completed, float intervalTime = 1, bool ignoreTimeScale = false){return Start(duration, 0, intervalTime, repeatCount, repeatTime, null, update, completed, null, null, null, null, ignoreTimeScale);}/// <summary>/// 开始计时/// </summary>/// <param name="duration">计时时长(/s)</param>/// <param name="delayTime">延时计时时长(/s)</param>/// <param name="intervalTime">检测间隔(/s)</param>/// <param name="repeatCount">重复计时次数 value <0 无限次 =0/1 1次</param>/// <param name="repeatTime">重复计时等待间隔</param>/// <param name="update">计时中回调</param>/// <param name="completed">计时完成回调</param>/// <param name="ignoreTimeScale">是否忽略时间速率</param>public static Timer Start(float duration, float delayTime, int repeatCount, float repeatTime, Action<float> update, Action completed, float intervalTime = 1, bool ignoreTimeScale = false){return Start(duration, delayTime, intervalTime, repeatCount, repeatTime, null, update, completed, null, null, null, null, ignoreTimeScale);}/// <summary>/// 开始计时/// </summary>/// <param name="duration">计时时长(/s)</param>/// <param name="delayTime">延时计时时长(/s)</param>/// <param name="intervalTime">检测间隔(/s)</param>/// <param name="repeatCount">重复计时次数 value <0 无限次 =0/1 1次</param>/// <param name="repeatTime">重复计时等待间隔</param>/// <param name="start">开始计时回调</param>/// <param name="update">计时中回调</param>/// <param name="completed">计时完成回调</param>/// <param name="pause">计时暂停回调</param>/// <param name="resume">计时继续回调</param>/// <param name="cancel">计时取消回调</param>/// <param name="restart">计时重开始回调</param>/// <param name="ignoreTimeScale">是否忽略时间速率</param>/// <returns></returns>public static Timer Start(float duration, int repeatCount, float repeatTime, Action start, Action<float> update, Action completed, Action pause, Action resume, Action cancel, Action restart, float intervalTime = 1, bool ignoreTimeScale = false){return Start(duration, 0, intervalTime, repeatCount, repeatTime, start, update, completed, pause, resume, cancel, restart, ignoreTimeScale);}/// <summary>/// 开始计时/// </summary>/// <param name="duration">计时时长(/s)</param>/// <param name="delayTime">延时计时时长(/s)</param>/// <param name="intervalTime">检测间隔(/s)</param>/// <param name="repeatCount">重复计时次数 value <0 无限次 =0/1 1次</param>/// <param name="repeatTime">重复计时等待间隔</param>/// <param name="start">开始计时回调</param>/// <param name="update">计时中回调</param>/// <param name="completed">计时完成回调</param>/// <param name="pause">计时暂停回调</param>/// <param name="resume">计时继续回调</param>/// <param name="cancel">计时取消回调</param>/// <param name="restart">计时重开始回调</param>/// <param name="ignoreTimeScale">是否忽略时间速率</param>/// <returns></returns>public static Timer Start(float duration, float delayTime, float intervalTime, int repeatCount, float repeatTime, Action start, Action<float> update, Action completed, Action pause, Action resume, Action cancel, Action restart, bool ignoreTimeScale = false){Timer newTimer = new Timer{duration = duration,delayTime = delayTime > 0 ? delayTime : 0,intervalTime = intervalTime,repeatCount = repeatCount,repeatTime = repeatTime,ignoreTimeScale = ignoreTimeScale,onStart = start,onTiming = update,onCompleted = completed,onPause = pause,onResume = resume,onCancel = cancel,onReStart = restart,};newTimer.currentTimerState = TimerState.Start;TimerManager.Instance.CreateTimerDriver(newTimer);return newTimer;}/// <summary>/// 暂停/// </summary>public void Pause(){if (currentTimerState != TimerState.Timing && currentTimerState != TimerState.Prepare)return;currentTimerState = TimerState.Pause;if (onDriverPause != null)onDriverPause.Invoke();if (onPause != null)onPause.Invoke();}/// <summary>/// 继续/// </summary>public void Resume(){if (currentTimerState != TimerState.Pause)return;if (onDriverResume != null)onDriverResume.Invoke();if (onResume != null)onResume.Invoke();}/// <summary>/// 重新开始/// </summary>/// <param name="delay">延迟开始时间</param>public void ReStart(float delay = 0){delayTime = delay;repeatedCount = 0;passedTime = 0;if (currentTimerState == TimerState.Stop)TimerManager.Instance.CreateTimerDriver(this);currentTimerState = TimerState.Start;if (onReStart != null)onReStart.Invoke();}/// <summary>/// 取消计时/// </summary>public void Cancel(){currentTimerState = TimerState.Stop;if (onCancel != null)onCancel.Invoke();}/// <summary>/// 添加持续时间/// </summary>/// <param name="time"></param>public void AddDuration(float time){duration += time;}/// <summary>/// 添加重复次数/// </summary>/// <param name="count"></param>public void AddRepeatCount(int count){repeatCount += count;}/// <summary>/// 开始回调/// </summary>internal void OnStart(){if (onStart != null)onStart.Invoke();}/// <summary>/// 更新/// </summary>/// <param name="time">计时时间</param>internal void OnUpdate(float time){passedTime = time;if (onTiming != null)onTiming.Invoke(time);}/// <summary>/// 结束计时/// </summary>internal void OnStop(){repeatedCount++;currentTimerState = TimerState.Stop;if (onCompleted != null)onCompleted.Invoke();}/// <summary>/// 开始计时状态/// </summary>internal void SetTimerState(TimerState state){currentTimerState = state;}/// <summary>/// 注册驱动器Action/// </summary>/// <param name="pause"></param>/// <param name="resume"></param>internal void InitDriverAction(Action pause, Action resume){onDriverPause = pause;onDriverResume = resume;}}

TimerDriver:计时器,负责实际计时处理

    using UnityEngine;public class TimerDriver : MonoBehaviour{private Timer m_currentTimer;/// <summary>/// 当前时间/// </summary>private float CurrentTime{get { return m_currentTimer.ignoreTimeScale ? Time.realtimeSinceStartup : Time.time; }}/// <summary>/// 开始计时时间/// </summary>private float m_startTime;/// <summary>/// 当前计时时间/// </summary>private float m_currentTime;/// <summary>/// 已计时的时间/// </summary>private float m_passedTime;/// <summary>/// 计时时间间隔/// </summary>private float m_duration;/// <summary>/// 上次间隔时间/// </summary>private float m_lastTime;/// <summary>/// 是否开始计时/// </summary>private bool m_isTimerPrepared;/// <summary>/// 已计时次数/// </summary>private int m_passedCount;/// <summary>/// 是否计时/// </summary>private bool IsTiming{get{return m_currentTimer.currentTimerState != Timer.TimerState.Pause &&m_currentTimer.currentTimerState != Timer.TimerState.Stop;}}/// <summary>/// 初始化驱动器/// </summary>/// <param name="data"></param>public void InitTimerDriver(Timer data){m_currentTimer = data;m_currentTimer.InitDriverAction(OnPause, OnResume);}private void Update(){if (m_currentTimer == null)return;if (!IsTiming){if (m_currentTimer.currentTimerState == Timer.TimerState.Stop)//结束计时CloseTimerDriver();return;}if (m_currentTimer.currentTimerState == Timer.TimerState.Start)//初始计时数据{m_startTime = CurrentTime + m_currentTimer.delayTime;m_passedTime = 0;m_lastTime = 0;m_isTimerPrepared = false;m_passedCount = 0;m_currentTimer.SetTimerState(Timer.TimerState.Prepare);}else //开始计时{m_duration = CurrentTime - m_startTime; //计时的时间if (m_duration < 0) //等待计时{}else //正式计时{if (!m_isTimerPrepared){m_isTimerPrepared = true;m_currentTimer.OnStart();m_currentTimer.SetTimerState(Timer.TimerState.Timing);}if (m_duration - m_lastTime >= m_currentTimer.intervalTime) //计时间隔{m_lastTime = m_duration;m_currentTime = m_duration + m_passedTime; //计时时间m_currentTimer.OnUpdate(m_currentTime);if (m_currentTime >= m_currentTimer.duration) //计时完成{m_currentTimer.OnStop();if (m_currentTimer.repeatCount < 0) //无限次计时{OnRepeat();m_currentTimer.SetTimerState(Timer.TimerState.Prepare);}else if (m_currentTimer.repeatCount > 0) //重复计时{OnRepeat();m_passedCount++;if (m_passedCount >= m_currentTimer.repeatCount) //达到重复次数CloseTimerDriver();elsem_currentTimer.SetTimerState(Timer.TimerState.Prepare);}else{CloseTimerDriver();}}}}}}/// <summary>/// 暂停/// </summary>private void OnPause(){m_passedTime = m_duration + m_passedTime;m_lastTime = m_duration - m_lastTime;}/// <summary>/// 继续/// </summary>private void OnResume(){if (!m_isTimerPrepared)m_currentTimer.SetTimerState(Timer.TimerState.Prepare);elsem_currentTimer.SetTimerState(Timer.TimerState.Timing);m_startTime = CurrentTime;m_lastTime = -m_lastTime;}/// <summary>/// 重复计时/// </summary>private void OnRepeat(){m_startTime = CurrentTime + m_currentTimer.repeatTime;m_passedTime = 0;m_lastTime = 0;m_isTimerPrepared = false;}/// <summary>/// 关闭计时器/// </summary>private void CloseTimerDriver(){m_currentTimer = null;Destroy(gameObject);}/// <summary>/// 暂停游戏时/// </summary>/// <param name="isPause"></param>private void OnApplicationPause(bool isPause){if(isPause)m_currentTimer.Pause();elsem_currentTimer.Resume();}}

测试及使用:

    using UnityEngine;public class TimeTest : MonoBehaviour{private Timer timer;private Timer timer1;private void OnEnable(){timer = Timer.Start(10, 5, 1, 5, 5, () =>{print("开始计时");}, (float time) =>{print("计时中:" + time);}, () =>{print("计时结束" + timer.repeatedCount);}, () =>{print("暂停计时");}, () =>{print("继续计时");}, () =>{print("取消计时");},()=>{print("重开始");}, false);//timer1 = Timer.Start(30, 2, 1, 1, 0, () =>//{//    print("2开始计时");//}, (float time) =>//{//    print("2计时中:" + time);//}, () =>//{//    print("2计时结束");//}, () =>//{//    print("2暂停计时");//}, () =>//{//    print("2继续计时");//}, () =>//{//    print("2取消计时");//}, () => {//    print("2重开始");//}, false);}private void OnGUI(){if(GUILayout.Button("1暂停",GUILayout.Width(100),GUILayout.Height(50))){timer.Pause();}if (GUILayout.Button("1继续", GUILayout.Width(100), GUILayout.Height(50))){timer.Resume();}if (GUILayout.Button("1取消", GUILayout.Width(100), GUILayout.Height(50))){timer.Cancel();}if (GUILayout.Button("1重开始", GUILayout.Width(100), GUILayout.Height(50))){timer.ReStart(10);}if (GUILayout.Button("2暂停", GUILayout.Width(100), GUILayout.Height(50))){timer1.Pause();}if (GUILayout.Button("2继续", GUILayout.Width(100), GUILayout.Height(50))){timer1.Resume();}if (GUILayout.Button("2取消", GUILayout.Width(100), GUILayout.Height(50))){timer1.Cancel();}if (GUILayout.Button("2重开始", GUILayout.Width(100), GUILayout.Height(50))){timer1.ReStart(10);}}}

测试效果图

Unity通用计时器相关推荐

  1. unity简单计时器_简单且悦目的Pomodoro计时器

    unity简单计时器 拟态 (pomotroid) Pomotroid is a simple and configurable Pomodoro timer. It aims to provide ...

  2. unity 后台计时器实现

    问题:最近在做一个倒计时的功能,发现倒计时在程序切换到后台是会停止计时,发现unity 安卓后台运行时,计时器不在运行,再次切回App时从切到后台的时间点计时,例如切到后台时位10,后台切回app还是 ...

  3. stm32学习笔记——通用计时器基本原理

    stm32f10x最多有8个定时器,stm32f103zet6就有8个定时器,分别是4个通用定时器,2个高级定时器,2个基本定时器. 定时器种类         位数 计时器模式 产生DMA请求 捕获 ...

  4. Unity - 通用渲染管线(URP)1.渲染、后处理

    这是一篇详细讲解URP的文章,涉及具体的使用和原理,翻译自Unity官方的文档. 本文由 祝你万事顺利 出品,转载请注明出处. 简介 URP是一种预置的可编程渲染管线.可以实现快速的渲染而不需要sha ...

  5. Unity之计时器功能(转)

    Unity时钟定时器插件--Vision Timer源码分析之二 前面的已经介绍了vp_Timer(点击前往查看),vp_TimeUtility相对简单很多,vp_TimeUtility定义了个表示时 ...

  6. Unity 通用弹出框

    因为项目中要经常用到一些提示框,弹出框之类的通用组建,所以写了一个,方便以后使用 效果展示: 预设物结构: 代码展示: using UnityEngine; using UnityEngine.UI; ...

  7. Microsoft.Practices.Unity 通用类

    类库的用法网上有很多,就不多说了,下面稍微封装了一下,记个笔记. //2015-11-03 环境 .net 4.5 unity 3.x 结合泛型接口类型和配置文件,得到IUnityContainer实 ...

  8. Arm通用计时器简介

    所有使用Arm处理器的系统中都会包含一个标准化的通用定时器(Generic Timer)框架.这个通用定时器系统提供了一个系统计数器(System Counter)和一组定时器(Timer).其结构如 ...

  9. Unity秒表计时器

    最终显示效果: 感谢提供代码的小伙伴(づ ̄ 3 ̄)づ https://blog.csdn.net/ixiaochouyu/article/details/46858545 我简单改了一下,添加了一个指 ...

  10. TI的C55XX系列DSP芯片的通用计时器原理一目了然(有图有真相)

最新文章

  1. 1.15 克隆虚拟机
  2. 【成长之路】【python】python基础5-模块
  3. SVM学习笔记1-问题定义
  4. 安装Typora情况下,Windows右键新建菜单中增加新建md文件
  5. openGl学习之基本图元
  6. React开发(228):ant design table根据宽度自动忽略
  7. 基础、语法都不是最重要的,学Python最重要的是什么?编程思路!
  8. NoSQL数据库--简介
  9. VirtualBox Failed to open/create the internal network 错误处理
  10. Java语言中的常用包、访问控制
  11. GDAL和GeoPandas的安装
  12. IMU与Gyro及其它相关
  13. waves系统服务器,waves服务器:插件挂多了电脑宕机了?Impact Server服务器拯救你的电脑CPU!...
  14. wordpress友联_Wordpress进阶:个性化友情链接调用
  15. 游走仙境稻城亚丁,稻城亚丁新攻略
  16. @Value读取properties中文乱码解决方案
  17. 关于微软IIS7安全性
  18. [CreatorCocos]自定义线条 + 物理引擎
  19. 第07课:使用 HTML 5 API 创建子窗口
  20. springboot毕设项目基于微服务的闪聚支付系统设计vwt4i(java+VUE+Mybatis+Maven+Mysql)

热门文章

  1. 跑revit计算机硬件要求,什么样的电脑能流畅跑Revit?Revit对电脑配置要求
  2. 马未都说收藏:陶瓷篇(3、4、5)宋瓷-官窑-汝官哥钧定
  3. MIPS汇编指令翻译机器码
  4. 【小区物业管理系统——开题报告 分享(仅供参考呀)】
  5. android--GooglePay 谷歌支付内购接入(1)
  6. 程序员出身的史玉柱,曾写了50万行代码,他的编程水平怎样?
  7. jmeter做秒杀活动测试
  8. 成功实现有线路由器和无线路由器连接上网
  9. 台式计算机无线接入,台式计算机有线连接路由器WiFi方法图步骤,可以详细设置无线内容(...
  10. java获取中文首字母