Unity——计时器功能实现
Unity计时器
Demo展示

介绍
游戏中有非常多的计时功能,比如:各种cd,以及需要延时调用的方法;
一般实现有一下几种方式:
1.手动计时
float persistTime = 10f
float startTime = Time.time;
if(Time.time - startTime > persistTime)
{
Debug.Log("计时结束");
}
float curTime = 0;
curTime += Time.deltaTime;
if(curTime > persistTime)
{
Debug.Log("计时结束");
}
2.协程
private float persistTime = 10f;
IEnumerator DelayFunc()
{
yield return persistTime;
Debug.Log("计时结束");
}
private void Start()
{
StartCoroutine(DelayFunc());
}
3.Invoke回调
private void Start()
{
Invoke("DelayFunc", persistTime);
}
计时器功能
计时是为了到特定的时间,执行某个功能或方法;
计时器(Timer):设计了计时暂停,计时重置,计时开始方法,计时中方法,计时结束方法,固定间隔调用方法,计时器可设置复用或单次;
计时管理器(TimerMa):负责倒计时,以及执行计时器方法;
代码:
using System;
using System.Collections.Generic;
using UnityEngine;
using Object = System.Object;
public class Timer
{
public delegate void IntervalAct(Object args);
//总时间和当前持续时间
private float curtime = 0;
private float totalTime = 0;
//激活
public bool isActive;
//计时结束是否销毁
public bool isDestroy;
//是否暂停
public bool isPause;
//间隔事件和间隔事件——Dot
private float intervalTime = 0;
private float curInterval = 0;
private IntervalAct onInterval;
private Object args;
//进入事件
public Action onEnter;
private bool isOnEnter = false;
//持续事件
public Action onStay;
//退出事件
public Action onEnd;
public Timer(float totalTime, bool isDestroy = true, bool isPause = false)
{
curtime = 0;
this.totalTime = totalTime;
isActive = true;
this.isDestroy = isDestroy;
this.isPause = isPause;
TimerMa.I.AddTimer(this);
}
public void Run()
{
//暂停计时
if (isPause || !isActive)
return;
if (onEnter != null)
{
if (!isOnEnter)
{
isOnEnter = true;
onEnter();
}
}
//持续事件
if (onStay != null)
onStay();
curtime += Time.deltaTime;
//间隔事件
if (onInterval != null)
{
curInterval += Time.deltaTime;
if (curInterval > intervalTime)
{
onInterval(args);
curInterval = 0;
}
}
//计时结束
if (curtime > totalTime)
{
curtime = 0;
isActive = false;
if (onEnd != null)
{
onEnd();
}
}
}
//设置间隔事件
public void SetInterval(float interval, IntervalAct intervalFunc, Object args = null)
{
this.intervalTime = interval;
onInterval = intervalFunc;
curInterval = 0;
this.args = args;
}
//重置计时器
public void Reset()
{
curtime = 0;
isActive = true;
isPause = false;
curInterval = 0;
isOnEnter = false;
}
//获取剩余时间
public float GetRemainTime()
{
return totalTime - curtime;
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TimerMa : MonoBehaviour
{
#region 单例
private static TimerMa instance;
TimerMa() {}
public static TimerMa I
{
get
{
if (instance == null)
instance = new TimerMa();
return instance;
}
}
#endregion
private List<Timer> timerList;
private void Awake()
{
instance = this;
timerList = new List<Timer>();
}
public void AddTimer(Timer t)
{
timerList.Add(t);
}
void Update()
{
for (int i = 0; i < timerList.Count;)
{
timerList[i].Run();
//计时结束,且需要销毁
if(!timerList[i].isActive && timerList[i].isDestroy)
timerList.RemoveAt(i);
else
++i;
}
}
}
测试计时器
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Object = System.Object;
public class Test : MonoBehaviour
{
public Text mText1;
public Text mText2;
private Timer timer;
private int count = 0;
void Start()
{
timer = new Timer(5f,false);
timer.SetInterval(1f, OnInterval);
timer.onEnter = OnStart;
timer.onEnd = OnExit;
}
void Update()
{
Debug.Log(count);
mText1.text = timer.GetRemainTime().ToString("f2");
if (Input.GetKeyDown(KeyCode.A))
{
if (!timer.isPause)
{
timer.isPause = true;
mText2.text = "暂停计时";
}
}
if (Input.GetKeyDown(KeyCode.S))
{
if (timer.isPause)
{
timer.isPause = false;
mText2.text = "取消暂停计时";
}
}
if (Input.GetKeyDown(KeyCode.D))
{
timer.Reset();
mText2.text = "重置计时";
}
}
private void OnStart()
{
mText2.text = "开始计时";
}
private void OnExit()
{
mText2.text = "结束计时";
}
private void OnInterval(Object value)
{
count++;
mText2.text = $"间隔事件调用{count}";
}
}
Unity——计时器功能实现的更多相关文章
- JS中关于 一个关于计时器功能效果的实现
optionSearch(); function optionSearch() { //定义一个清除计时器的变量 var timer = null; //自选标题区域 $("#optiona ...
- iOS开发 - Swift使用GCD实现计时器功能
前言 开发中,经常会用到定时执行网络请求.倒计时.计时器等功能,本篇文章介绍在iOS开发中,Swift怎样使用GCD实现这些功能. 执行一次 下面的代码将会在5秒后执行,且只执行一次. let tim ...
- Window 8.1 计时器功能及图片切换
<Canvas Margin="450,0" Width="795" Grid.Column="1"> <Image Ma ...
- Unity基础功能:粒子特效(Shuriken)
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- Unity新功能|全息模拟器
http://forum.china.unity3d.com/thread-21539-1-1.html
- unity 计时器
2017年1月3号,周二,晴. //设置时间 float tempTime = 5; void OnGUI(){ //设置显示 GUI.Label (new Rect(100,100,100,100) ...
- 微信小程序canvas实现圆形计时器功能
index.js import Canvas from '../../utils/canvas.js'Page({ ...Canvas.options, /** * 页面的初始数据 */ data: ...
- 通过反射调用Unity编辑器提供的各种功能
Unity编辑器功能丰富易上手,其实编辑器提供的大多数菜单操作,在代码里面都是能够找到对应接口的,但是这些接口都没有对我们开放,怎么办? 很简单,直接使用反射调用即可. 首先使用Reflector或I ...
- C# Unity依赖注入利用Attribute实现AOP功能
使用场景? 很多时候, 我们定义一个功能, 当我们要对这个功能进行扩展的时候, 按照常规的思路, 我们一般都是利用OOP的思想, 在原有的功能上进行扩展. 那么有没有一种东西, 可以实现当我们需要扩展 ...
随机推荐
- python 并行计算
一.进程和线程 原文链接:https://zhuanlan.zhihu.com/p/356220352 进程是分配资源的最小单位,线程是系统调度的最小单位.当应用程序运行时最少会开启一个进程,此时计算 ...
- Spring MVC拦截器浅析
Spring MVC拦截器 重点:Spring MVC的拦截器只会拦截控制器的请求,如果是jsp.js.image.html则会放行. 什么是拦截器 运行在服务器的程序,先于Servlet或JSP之前 ...
- 【第八篇】- Git 查看提交历史之Spring Cloud直播商城 b2b2c电子商务技术总结
Git 查看提交历史 Git 提交历史一般常用两个命令: git log 在使用 Git 提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,我们可以使用 git log 命令查看. 针对 ...
- Prometheus 2.21.0 新特性
Prometheus 2.21.0 现在(2020.09.11)已经发布,在上个月的 2.20.0 之后又进行了很多的修复和改进. 这个版本使用了 Go 1.15 进行编译,不赞成在TLS证书验证中使 ...
- 数据结构与算法——平衡二叉树(AVL树)
目录 二叉排序树存在的问题 基本介绍 单旋转(左旋转) 树高度计算 旋转 右旋转 双旋转 完整代码 二叉排序树存在的问题 一个数列 {1,2,3,4,5,6},创建一颗二叉排序树(BST) 创建完成的 ...
- Java面向对象系列(10)- 什么是多态
多态 即同一方法可以根据发送对象的不同而采取不同的行为方式 一个对象的实际类型是确定的,但可以指向对象的引用类型有很多 多态存在的条件 有继承关系 子类重写父类方法 父类引用指向子类对象 注意:多态是 ...
- Java基础系列(22)- For循环详解
For循环 虽然所有循环结构都可以用while和dowhile表示,但是Java提供了另外一种语句for循环,使一些循环结构变动更加简单 for循环语句是支持迭代的一种通用结构,是最有效.最灵活的循环 ...
- Java_正则表达式和文本操作
正则表达式语法 普通字符 字母.数字.汉字.下划线.以及没有特殊定义的标点符号,都是"普通字符".表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符. 简单的转义字 ...
- 【MySQL数据库】MySQL5.7安装与配置、可视化工具安装和破解
软件下载 Mysql5.7地址:https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19-winx64.zip 安装步骤 下载后会得到zip ...
- 【Golang】三个点(...)用法
众所周知,Go语言是严格类型语言,而开发的时候又遇到传入参数不定的情况,怎么办? 这里的三个点(-),就给我们编程人员带来很大的灵活性,具体如下 在Golang中,三个点一共会用在四个地方(话说三个点 ...