Unity计时器功能实现示例

作者:小紫苏 时间:2022-03-08 20:02:39 

目录
  • Demo展示

  • 介绍

  • 计时器功能

Unity计时器

Demo展示

Unity计时器功能实现示例

介绍

游戏中有非常多的计时功能,比如:各种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
  • asp之家 软件编程 m.aspxhome.com