Unity通用计时器
Unity通用计时器
- 计时器支持开始、暂停、继续、取消等功能,可设置计时时间和重复计时的次数。
- 计时器由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通用计时器相关推荐
- unity简单计时器_简单且悦目的Pomodoro计时器
unity简单计时器 拟态 (pomotroid) Pomotroid is a simple and configurable Pomodoro timer. It aims to provide ...
- unity 后台计时器实现
问题:最近在做一个倒计时的功能,发现倒计时在程序切换到后台是会停止计时,发现unity 安卓后台运行时,计时器不在运行,再次切回App时从切到后台的时间点计时,例如切到后台时位10,后台切回app还是 ...
- stm32学习笔记——通用计时器基本原理
stm32f10x最多有8个定时器,stm32f103zet6就有8个定时器,分别是4个通用定时器,2个高级定时器,2个基本定时器. 定时器种类 位数 计时器模式 产生DMA请求 捕获 ...
- Unity - 通用渲染管线(URP)1.渲染、后处理
这是一篇详细讲解URP的文章,涉及具体的使用和原理,翻译自Unity官方的文档. 本文由 祝你万事顺利 出品,转载请注明出处. 简介 URP是一种预置的可编程渲染管线.可以实现快速的渲染而不需要sha ...
- Unity之计时器功能(转)
Unity时钟定时器插件--Vision Timer源码分析之二 前面的已经介绍了vp_Timer(点击前往查看),vp_TimeUtility相对简单很多,vp_TimeUtility定义了个表示时 ...
- Unity 通用弹出框
因为项目中要经常用到一些提示框,弹出框之类的通用组建,所以写了一个,方便以后使用 效果展示: 预设物结构: 代码展示: using UnityEngine; using UnityEngine.UI; ...
- Microsoft.Practices.Unity 通用类
类库的用法网上有很多,就不多说了,下面稍微封装了一下,记个笔记. //2015-11-03 环境 .net 4.5 unity 3.x 结合泛型接口类型和配置文件,得到IUnityContainer实 ...
- Arm通用计时器简介
所有使用Arm处理器的系统中都会包含一个标准化的通用定时器(Generic Timer)框架.这个通用定时器系统提供了一个系统计数器(System Counter)和一组定时器(Timer).其结构如 ...
- Unity秒表计时器
最终显示效果: 感谢提供代码的小伙伴(づ ̄ 3 ̄)づ https://blog.csdn.net/ixiaochouyu/article/details/46858545 我简单改了一下,添加了一个指 ...
- TI的C55XX系列DSP芯片的通用计时器原理一目了然(有图有真相)
最新文章
- 1.15 克隆虚拟机
- 【成长之路】【python】python基础5-模块
- SVM学习笔记1-问题定义
- 安装Typora情况下,Windows右键新建菜单中增加新建md文件
- openGl学习之基本图元
- React开发(228):ant design table根据宽度自动忽略
- 基础、语法都不是最重要的,学Python最重要的是什么?编程思路!
- NoSQL数据库--简介
- VirtualBox Failed to open/create the internal network 错误处理
- Java语言中的常用包、访问控制
- GDAL和GeoPandas的安装
- IMU与Gyro及其它相关
- waves系统服务器,waves服务器:插件挂多了电脑宕机了?Impact Server服务器拯救你的电脑CPU!...
- wordpress友联_Wordpress进阶:个性化友情链接调用
- 游走仙境稻城亚丁,稻城亚丁新攻略
- @Value读取properties中文乱码解决方案
- 关于微软IIS7安全性
- [CreatorCocos]自定义线条 + 物理引擎
- 第07课:使用 HTML 5 API 创建子窗口
- springboot毕设项目基于微服务的闪聚支付系统设计vwt4i(java+VUE+Mybatis+Maven+Mysql)
热门文章
- 跑revit计算机硬件要求,什么样的电脑能流畅跑Revit?Revit对电脑配置要求
- 马未都说收藏:陶瓷篇(3、4、5)宋瓷-官窑-汝官哥钧定
- MIPS汇编指令翻译机器码
- 【小区物业管理系统——开题报告 分享(仅供参考呀)】
- android--GooglePay 谷歌支付内购接入(1)
- 程序员出身的史玉柱,曾写了50万行代码,他的编程水平怎样?
- jmeter做秒杀活动测试
- 成功实现有线路由器和无线路由器连接上网
- 台式计算机无线接入,台式计算机有线连接路由器WiFi方法图步骤,可以详细设置无线内容(...
- java获取中文首字母