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——计时器功能实现的更多相关文章

  1. JS中关于 一个关于计时器功能效果的实现

    optionSearch(); function optionSearch() { //定义一个清除计时器的变量 var timer = null; //自选标题区域 $("#optiona ...

  2. iOS开发 - Swift使用GCD实现计时器功能

    前言 开发中,经常会用到定时执行网络请求.倒计时.计时器等功能,本篇文章介绍在iOS开发中,Swift怎样使用GCD实现这些功能. 执行一次 下面的代码将会在5秒后执行,且只执行一次. let tim ...

  3. Window 8.1 计时器功能及图片切换

    <Canvas Margin="450,0" Width="795" Grid.Column="1"> <Image Ma ...

  4. Unity基础功能:粒子特效(Shuriken)

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...

  5. Unity新功能|全息模拟器

    http://forum.china.unity3d.com/thread-21539-1-1.html

  6. unity 计时器

    2017年1月3号,周二,晴. //设置时间 float tempTime = 5; void OnGUI(){ //设置显示 GUI.Label (new Rect(100,100,100,100) ...

  7. 微信小程序canvas实现圆形计时器功能

    index.js import Canvas from '../../utils/canvas.js'Page({ ...Canvas.options, /** * 页面的初始数据 */ data: ...

  8. 通过反射调用Unity编辑器提供的各种功能

    Unity编辑器功能丰富易上手,其实编辑器提供的大多数菜单操作,在代码里面都是能够找到对应接口的,但是这些接口都没有对我们开放,怎么办? 很简单,直接使用反射调用即可. 首先使用Reflector或I ...

  9. C# Unity依赖注入利用Attribute实现AOP功能

    使用场景? 很多时候, 我们定义一个功能, 当我们要对这个功能进行扩展的时候, 按照常规的思路, 我们一般都是利用OOP的思想, 在原有的功能上进行扩展. 那么有没有一种东西, 可以实现当我们需要扩展 ...

随机推荐

  1. python 并行计算

    一.进程和线程 原文链接:https://zhuanlan.zhihu.com/p/356220352 进程是分配资源的最小单位,线程是系统调度的最小单位.当应用程序运行时最少会开启一个进程,此时计算 ...

  2. Spring MVC拦截器浅析

    Spring MVC拦截器 重点:Spring MVC的拦截器只会拦截控制器的请求,如果是jsp.js.image.html则会放行. 什么是拦截器 运行在服务器的程序,先于Servlet或JSP之前 ...

  3. 【第八篇】- Git 查看提交历史之Spring Cloud直播商城 b2b2c电子商务技术总结

    ​ Git 查看提交历史 Git 提交历史一般常用两个命令: git log 在使用 Git 提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,我们可以使用 git log 命令查看. 针对 ...

  4. Prometheus 2.21.0 新特性

    Prometheus 2.21.0 现在(2020.09.11)已经发布,在上个月的 2.20.0 之后又进行了很多的修复和改进. 这个版本使用了 Go 1.15 进行编译,不赞成在TLS证书验证中使 ...

  5. 数据结构与算法——平衡二叉树(AVL树)

    目录 二叉排序树存在的问题 基本介绍 单旋转(左旋转) 树高度计算 旋转 右旋转 双旋转 完整代码 二叉排序树存在的问题 一个数列 {1,2,3,4,5,6},创建一颗二叉排序树(BST) 创建完成的 ...

  6. Java面向对象系列(10)- 什么是多态

    多态 即同一方法可以根据发送对象的不同而采取不同的行为方式 一个对象的实际类型是确定的,但可以指向对象的引用类型有很多 多态存在的条件 有继承关系 子类重写父类方法 父类引用指向子类对象 注意:多态是 ...

  7. Java基础系列(22)- For循环详解

    For循环 虽然所有循环结构都可以用while和dowhile表示,但是Java提供了另外一种语句for循环,使一些循环结构变动更加简单 for循环语句是支持迭代的一种通用结构,是最有效.最灵活的循环 ...

  8. Java_正则表达式和文本操作

    正则表达式语法 普通字符 字母.数字.汉字.下划线.以及没有特殊定义的标点符号,都是"普通字符".表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符. 简单的转义字 ...

  9. 【MySQL数据库】MySQL5.7安装与配置、可视化工具安装和破解

    软件下载 Mysql5.7地址:https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19-winx64.zip 安装步骤 下载后会得到zip ...

  10. 【Golang】三个点(...)用法

    众所周知,Go语言是严格类型语言,而开发的时候又遇到传入参数不定的情况,怎么办? 这里的三个点(-),就给我们编程人员带来很大的灵活性,具体如下 在Golang中,三个点一共会用在四个地方(话说三个点 ...