Unity计时器功能实现示例

目录
  • 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}";
    }
}

到此这篇关于Unity计时器功能实现示例的文章就介绍到这了,更多相关Unity计时器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Unity3D 计时器的实现代码(三种写法总结)

    1.每帧检查 定义一个时间变量 timer,每帧将此时间减去帧间隔时间 Time.deltaTime,如果小于或者等于零,说明定时器到了,执行相应功能代码,将此定时器重置,代码如下: public float timer = 1.0f; // Update is called once per frame void Update() { timer -= Time.deltaTime; if (timer <= 0) { Debug.Log(string.Format("Timer1 is

  • Unity计时器功能实现示例

    目录 Demo展示 介绍 计时器功能 Unity计时器 Demo展示 介绍 游戏中有非常多的计时功能,比如:各种cd,以及需要延时调用的方法: 一般实现有一下几种方式: 1.手动计时 float persistTime = 10f float startTime = Time.time; if(Time.time - startTime > persistTime) { Debug.Log("计时结束"); } float curTime = 0; curTime += Time

  • C#实现的Win32控制台线程计时器功能示例

    本文实例讲述了C#实现的Win32控制台线程计时器功能.分享给大家供大家参考,具体如下: 在C#中提供了三种类型的计时器: 1.基于 Windows 的标准计时器(System.Windows.Forms.Timer) 2.基于服务器的计时器(System.Timers.Timer) 3.线程计时器(System.Threading.Timer) 一.基于 Windows 的标准计时器(System.Windows.Forms.Timer) 首先注意一点就是:Windows 计时器是为单线程环境

  • JS使用setInterval实现的简单计时器功能示例

    本文实例讲述了JS使用setInterval实现的简单计时器功能.分享给大家供大家参考,具体如下: 使用setInterval实现计时,并且满60秒向分钟进一,满60分钟向小时进一. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>www.jb51.net JS计时器</title> <script> window.onload =

  • JS基于面向对象实现的多个倒计时器功能示例

    本文实例讲述了JS基于面向对象实现的多个倒计时器功能.分享给大家供大家参考,具体如下: 运行效果图如下: 实现代码如下: 代码 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> &l

  • Android开发实现的计时器功能示例

    本文实例讲述了Android开发实现的计时器功能.分享给大家供大家参考,具体如下: 效果图: 布局: 三个按钮 加上一个Chronometer <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.a

  • c# 实现计时器功能

    场景 在低液位预警弹窗点击确定后需要实现一个计时器,比如在五分钟后再执行监控. 实现思路是使用Timer然后每秒执行一个方法,在方法中对秒数进行减1操作,等倒计时结束后执行相应的操作. 实现 但是Timer有三个 1.定义在System.Windows.Forms里   2.定义在System.Threading.Timer类里   3.定义在System.Timers.Timer类里 一开始使用的是System.Windows.Forms里面的 System.Windows.Forms.Tim

  • 用JS写了一个30分钟倒计时器的实现示例

    前端页面倒计时功能在很多场景中会用到,如很多秒杀活动等,本文主要介绍了用JS写了一个30分钟倒计时器的实现示例,感兴趣的可以了解一下 <!DOCTYPE HTML> <html>     <head>         <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>         <title>Countdown Tim

  • C++算法计时器的实现示例

    目录 1.毫秒级精度 1.1 CLOCKS_PER_SEC 1.2 GetTickCount()函数 (Windows API) 1.3 timeGetTime()函数(Windows API) 1.4 timeval结构体(Linux) 2.微秒级精度 QueryPerformanceCounter()函数和QueryPerformanceFrequency()函数(Windows API) 3.纳秒级精度 4.利用chrono的各精度集成版(本质微秒) 4.1 chrono库介绍 4.2 代

  • jQuery实现简单的计时器功能实例分析

    本文实例讲述了jQuery实现简单的计时器功能.分享给大家供大家参考,具体如下: 在写项目的过程中遇到要前端60秒发送验证码的业务需求,于是用到计时器的功能: setInterval(function xxx(){ //业务逻辑 },隔多少时间执行一次) 60秒计时思路: 1.设置秒数:60s 2.设置内容:实时改变,秒数+内容 3.结束后:去掉按钮的disable,内容恢复原来样子 //计时器60秒 function timeInterval(){ $("#code_send_btn"

  • VUE饿了么树形控件添加增删改功能的示例代码

    本文介绍了VUE饿了么树形控件添加增删改功能的示例代码,分享给大家,具体如下: element-ui树形控件:地址 在原文档中有个案例是有新增和删除功能,但是后来发现其修改的数据并不能直接影响到树形数据,所以采用了 render-content 的API重新写了个组件. 写个开发的步骤,所以文章比较长emmm 大致效果如图: 1.省市API 在网上复制了个省市的list,有两个属性是新增的 isEdit :控制编辑状态 maxexpandId :为现下id的最大值 export default{

随机推荐