Unity计时器功能实现示例
作者:小紫苏 时间:2022-03-08 20:02:39
目录
Demo展示
介绍
计时器功能
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}";
}
}
来源:https://www.cnblogs.com/littleperilla/p/15457601.html
标签:Unity,计时器
0
投稿
猜你喜欢
Java原生序列化和反序列化代码实例
2023-10-29 21:46:45
C#中winform实现自动触发鼠标、键盘事件的方法
2022-02-23 22:50:58
Java中super和this关键字详解
2023-03-18 15:49:08
Java实现word/pdf转html并在线预览
2022-09-09 09:16:49
Mac OS上安装Tomcat服务器的简单步骤
2022-11-26 21:06:42
Java正则之贪婪匹配、惰性匹配
2022-08-14 16:41:23
java反射之Method的invoke方法实现教程详解
2023-07-09 20:24:36
SpringBoot @SpringBootTest加速单元测试的小诀窍
2022-12-17 13:05:06
Java数据结构及算法实例:朴素字符匹配 Brute Force
2022-01-10 15:03:40
unity制作瞄准镜效果
2022-04-15 23:45:10
Android 列表选择框 Spinner详解及实例
2021-11-18 14:59:08
Windows下gradle的安装与配置的超详细教程
2023-08-27 17:01:50
Spring IOC基于注解启动示例详析
2022-04-19 22:49:55
TCP协议详解_动力节点Java学院整理
2022-09-22 07:55:14
Struts2之Validator验证框架的详细介绍
2023-09-08 14:46:05
RandomId生成随机字符串详解实例
2023-02-19 10:12:47
C#使用Selenium+PhantomJS抓取数据
2022-09-13 23:18:02
详解DES&3DES算法的原理以及C#和JS的实现
2021-06-29 21:58:07
java文件操作工具类分享(file文件工具类)
2023-11-24 22:32:47
java垃圾回收原理之GC算法基础
2023-10-05 16:10:09