Unity Timer两种计时器

Unity Timer两种计时器

  • Timer两种计时器
  • 一、倒计时计时器(常用语UI倒计时显示)
    • 计时器代码如下:
    • 用法如下:
  • 二、技能CD计时器
    • 代码如下:
    • 使用方法如下:

Timer两种计时器

一、倒计时计时器(常用语UI倒计时显示)

这个计时器是一个继承自MonoBehavior的脚本,使用的时候直接使用静态方法创建即可
可以同时控制多个物体互相不影响

计时器代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public delegate void TimerCompleteEvent();public delegate void UpdateEvent(int t);public class Timer : MonoBehaviour {/// <summary>/// 完成委托/// </summary>TimerCompleteEvent del;/// <summary>/// 实时委托/// </summary>UpdateEvent updatedel;/// <summary>/// 总秒数/// </summary>private int second = 10;/// <summary>/// 上前的时间/// </summary>private int previous = 10;/// <summary>/// 开关/// </summary>public bool isopen = false;/// <summary>/// 计时使用/// </summary>private float totalTime = 0;/// <summary>/// 计时器/// </summary>private void Timers(){//累加每帧消耗时间totalTime += Time.deltaTime;if (second == 0){if (del != null){del();}StopTimer();}if (totalTime >= 1)//每过1秒执行一次{second--;totalTime = 0;if (updatedel != null) updatedel(second);}}/// <summary>/// 开启计时器/// </summary>public void StartTimer(int total, TimerCompleteEvent timedel,UpdateEvent update){totalTime = 0;second = total;previous = total;isopen = true;del = timedel;updatedel = update;}/// <summary>/// 创建计时器/// </summary>/// <param name="name"></param>/// <returns></returns>public static Timer CreateTimer(string name){GameObject m_currTimer = new GameObject(name);Timer time = m_currTimer.AddComponent<Timer>();return time;}/// <summary>/// 暂停计时器/// </summary>public void PauseTimer(){isopen = false;}/// <summary>/// 继续计时器/// </summary>public void Continue(){isopen = true;}/// <summary>/// 重新计时/// </summary>public void ReStartTimer(){second = previous;totalTime = 0;}/// <summary>/// 停止计时/// </summary>public void StopTimer(){if (this == null) return;isopen = false;totalTime = 0;del = null;updatedel = null;Destroy(gameObject);}private void Update(){if (isopen){Timers();}}
}

用法如下:


using UnityEngine;public class TimerCtrl : MonoBehaviour {Timer tim;// Use this for initializationvoid Start () {tim = Timer.CreateTimer("TimerCtrl1");tim.StartTimer(10,()=> {Debug.LogError("TimerCtrl1完成");},(time)=> {Debug.LogError("TimerCtrl1:"+time);});}// Update is called once per framevoid Update () {if (Input.GetKeyDown(KeyCode.Q)){tim.PauseTimer();}if (Input.GetKeyDown(KeyCode.W)){tim.ReStartTimer();}if (Input.GetKeyDown(KeyCode.E)){tim.StopTimer();}}
}

二、技能CD计时器

代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public delegate void FinishEventHandler();public delegate void UpdateEventHandler(float time);public class MyTimer : MonoBehaviour {/// <summary>/// 打印开关/// </summary>public bool isLog = true;/// <summary>/// 实时调用委托/// </summary>UpdateEventHandler updateEvent;/// <summary>/// 实时调用委托/// </summary>FinishEventHandler finishEvent;/// <summary>/// 计时时间/// </summary>float timeTarget;/// <summary>/// 开始计时时间/// </summary>float timeStart;/// <summary>/// 现在时间/// </summary>float timeNow;/// <summary>/// 计时偏差/// </summary>float offsetTime;/// <summary>/// 是否开始计时/// </summary>bool isTimer;/// <summary>/// 计时结束后是否销毁/// </summary>bool isDestory = true;/// <summary>/// 计时是否结束/// </summary>bool isEnd;/// <summary>/// 是否忽略时间速率/// </summary>bool isIgnoreTimeScale = true;/// <summary>/// 是否重复/// </summary>bool isRepeate;/// <summary>/// 真实时间/// </summary>float _Time{get{/// realtimeSinceStartup 是开始运行的时间切换应用不对其影响(真是时间)/// time 是开始运行的时间切换应用不对其影响(实际时间)return isIgnoreTimeScale ? Time.realtimeSinceStartup : Time.time;}}/// <summary>/// 当前所用时间/// </summary>float now;private void Update(){if (!isTimer) return;timeNow = _Time - offsetTime;now = timeNow - timeStart;if (updateEvent != null) updateEvent(Mathf.Clamp01(now/timeTarget));//与目标值的比例当为1的时候完成if (now > timeTarget) //超过目标值{if (finishEvent != null) finishEvent();if (!isRepeate) Destory();else ReStartTimer();}}/// <summary>/// 经过的时间/// </summary>/// <returns></returns>public float GetLeftTime(){return Mathf.Clamp(timeTarget - now,0,timeTarget);}private void OnApplicationPause(bool pause){if (pause){PauseTimer();}else{ConnitueTimer();}}/// <summary>/// 计时结束/// </summary>private void Destory(){isTimer = false;isEnd = true;if (isDestory) Destroy(gameObject);}/// <summary>/// 暂停时间/// </summary>float _pauseTime;/// <summary>/// 暂停计时器/// </summary>public void PauseTimer(){if (isEnd){if (isLog) Debug.LogError("计时已经结束");}else{if (isTimer){isTimer = false;_pauseTime = _Time;}}}/// <summary>/// 重新计时/// </summary>public void ConnitueTimer(){if (isEnd){if (isLog) Debug.LogError("计时已经结束!请重新开始!");}else{if (!isTimer){offsetTime += (_Time - _pauseTime);isTimer = true;}}}/// <summary>/// 重新计时/// </summary>public void ReStartTimer(){if (!isTimer) isTimer = true;if (isEnd) isEnd = false;timeStart = _Time;offsetTime = 0;_pauseTime = 0;}/// <summary>/// 停止计时器/// </summary>public void StopTimer(){Destory();}/// <summary>/// 开始计时/// </summary>public void StartTiming(float _time,FinishEventHandler finishdel,UpdateEventHandler updatedel = null, bool _isIgnoreTimeScale = true, bool _isRepeate = false,bool _isDestory = true){//设置目标时长timeTarget = _time;//设置委托if (finishdel != null) finishEvent = finishdel;if (updatedel != null) updateEvent = updatedel;isDestory = _isDestory;isIgnoreTimeScale = _isIgnoreTimeScale;isRepeate = _isRepeate;timeStart = _Time;offsetTime = 0;isEnd = false;isTimer = true;}/// <summary>/// 创建计时器:名字/// </summary>/// <returns></returns>public static MyTimer CreateTimer(string objName = "Timer"){GameObject go = new GameObject(objName);MyTimer timer = go.AddComponent<MyTimer>();return timer;}
}

使用方法如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MyTimer1 : MonoBehaviour {MyTimer myTimer;// Use this for initializationvoid Start () {myTimer = MyTimer.CreateTimer();myTimer.StartTiming(5,()=>{Debug.LogError("完成回调=====>");},(t)=> {Debug.LogError("实时刷新Timer1=="+t);});}// Update is called once per framevoid Update () {if (Input.GetKeyDown(KeyCode.Q)){myTimer.PauseTimer();}if (Input.GetKeyDown(KeyCode.W)){myTimer.ConnitueTimer();}if (Input.GetKeyDown(KeyCode.E)){myTimer.ReStartTimer();}if (Input.GetKeyDown(KeyCode.R)){myTimer.StopTimer();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/580843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从 Google Gemini 到 OpenAI Q*(Q-Star):调研重塑生成人工智能(AI)的研究

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 这篇综述探讨了生成式人工智能不断发展的前景&#xff0c;重点关注混合专家&#xff08;MoE&#xff09;、多模态学习的变革性影响&#xff0c;以及对…

解决xcode15下载模拟器慢以及没有断点续传

问题描述&#xff1a;Xcode15 为了最小化安装包大小&#xff0c;iOS17模拟器需要单独安装。然而下载模拟器的时候&#xff0c;经常出现Could not download iOS... 的下载失败提示。 以下为解决方案&#xff1a; 一、直接下载IOS17模拟器的包 以下两种方式都可以 方法一&…

学习笔记:数据挖掘与机器学习

文章目录 一、数据挖掘、机器学习、深度学习的区别&#xff08;一&#xff09;数据挖掘&#xff08;二&#xff09;机器学习&#xff08;三&#xff09;深度学习&#xff08;四&#xff09;总结 二、数据挖掘体系三、数据挖掘的流程四、典型的数据挖掘系统 一、数据挖掘、机器学…

delphi中format日期格式的小要点

我要delphi中要用到会计期间的比较&#xff0c;环境是sqlserver数据库&#xff0c;用sql语句查询某一会计月度的数据记录。 1、问题 我先到的语句是 select count(*) as cnt from 销售订单 where format(日期,yyyy.mm)2023.12 数据库中明明是有2023.12的数据的&#xff0c;…

SpringBoot实用开发(一)-- SpringBoot整合Redis

目录 引言: 1. Redis的安装 2. Redis客户端的简单操作 2.1 启动客户端

CCRC信息安全认证适用的什么领域,申报材料是什么?

CCRC信息安全认证适用的领域主要包括信息安全服务领域&#xff0c;它涵盖了安全集成、安全运维、应急处理、风险评估、灾难备份与恢复、安全软件开发、网络安全审计、工业控制系统安全等多个方面。这些领域涉及到企业信息系统的安全保障&#xff0c;确保信息系统在开发、运行、…

2023:代码岁月如歌,技术之路踏实前行

前言 转眼之间&#xff0c;2023年即将谢幕&#xff0c;这一年对于我而言充满了挑战、收获与成长。在这篇博客中&#xff0c;我将分享我在技术领域的一些心得体会&#xff0c;以及在项目和职场中的所思所感。愿这些文字能够为你带来启发&#xff0c;同时让我能够在反思中更进一…

Vuex状态管理(报警信息数量跟随变化)

需求&#xff1a;侧边栏显示报警信息数量 在store/project.js文件中定义相关状态 // 存储项目信息 const projectInfo JSON.parse(sessionStorage.getItem(projectInfo)) ? JSON.parse(sessionStorage.getItem(projectInfo)) : ; import { getUntreatedProjectAlarm } from …

react跳转和传参两种方式

需要安装ReactRouter包&#xff1a;npm i react-router-dom 两种跳转方式分别是Link和useNavigate&#xff0c;下面跳转传参会有所展示 1.useSearchParams传参 传参代码 //传参方代码 import { Link, useNavigate } from "react-router-dom" const Login () >…

ASP.NET Core认证原理和实现

ASP.NET Core认证原理和实现 AuthenticationHttpContextExtensions AuthenticationHttpContextExtensions 类是对 HttpContext 认证相关的扩展&#xff0c;它提供了如下扩展方法&#xff1a; public static class AuthenticationHttpContextExtensions {public static Task&l…

Qt Creator可视化交互界面exe快速入门4

上一期介绍了信号与槽&#xff0c;本期介绍加法计算器 我们来新建一个项目 然后拖动设置按钮 还需要个输出框 这里拖动Line Edit 我这里只是简单演示一下&#xff0c;做个低配版计算器&#xff0c;再加个加号和一个等于号就结束了。 然后回到代码编辑部分&#xff0c;我们需要…

VGG网络分析与demo实例

参考自 up主的b站链接&#xff1a;霹雳吧啦Wz的个人空间-霹雳吧啦Wz个人主页-哔哩哔哩视频这位大佬的博客 Fun_机器学习,pytorch图像分类,工具箱-CSDN博客 VGG 在2014年由牛津大学著名研究组 VGG&#xff08;Visual Geometry Group&#xff09;提出&#xff0c;斩获该年 Imag…

Java 新手常踩得坑,清个缓存就解决了?

【IDEA教程】IDEA 如何清除缓存&#xff1f; 大家好&#xff0c;我是 JavaPub。 最近遇到群里小伙伴遇到一个很大的难题&#xff0c;相信这个问题很多人在初入行时都遇到过。 事情是这样&#xff0c;一个小伙伴刚入职一家公司&#xff0c;公司给了他一个任务&#xff0c;虽然…

公司使用了加密软件,文件无法复制

在当今数字化时代&#xff0c;企业面临着越来越多的数据泄露和信息安全威胁。为了保护公司的敏感信息和知识产权&#xff0c;许多企业选择使用加密软件来加强数据的安全性。其中一项重要的功能是防止未经授权的文件复制。本文将探讨公司使用加密软件后&#xff0c;为何文件无法…

枚举算法:解决问题的穷举之道(二)

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

macOS系统下载安装PyCharm社区版本的流程(详细)

第一步 进入PyCharm官网&#xff0c;链接&#xff1a;Get Your Educational Tool - JetBrains 第二步 选择下拉框&#xff0c;根据自己的电脑芯片选择下载版本&#xff08;芯片查看位置&#xff1a;设置-通用-关于本机&#xff09;然后点击Download按钮 ​​​​​​​ -- 第…

AI:102-基于机器学习的法律勒索信息检测应用

🚀 本文选自专栏:精通AI实战千例专栏合集 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的核心代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,正在不断更新中…

wait和sleep的区别大了去了!!!

1.这两个方法来自不同的类分别是&#xff0c;sleep来自Thread类&#xff0c;和wait来自Object类。 sleep是Thread的静态类方法&#xff0c;谁调用的谁让出处理机&#xff0c;即使在a线程里调用了b的sleep方法&#xff0c;实际上还是a去睡觉&#xff0c;要让b线程睡觉要在b的代码…

科研学习|论文解读——融合类目偏好和数据场聚类的协同过滤推荐算法研究

论文链接&#xff08;中国知网&#xff09;&#xff1a; 融合类目偏好和数据场聚类的协同过滤推荐算法研究 - 中国知网 (cnki.net) 摘要&#xff1a;[目的/意义]基于近邻用户的协同过滤推荐作为推荐系统应用最广泛的算法之一&#xff0c;受数据稀疏和计算可扩展问题影响&#x…

005.HCIA 传输层

传输层定义了主机应用程序之间端到端的连通性。传输层中最为常见的两个协议分别是传输控制协议TCP (Transmission Control Protocol)和用户数据包协议UDP (User Datagram Protocol)。 1、相关概念 a. 传输层的端口 端口范围&#xff1a;0-65535 知名端口&#xff1a;0-1023&…