iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Unity计时器功能实现示例
  • 990
分享到

Unity计时器功能实现示例

2024-04-02 19:04:59 990人浏览 薄情痞子
摘要

目录Demo展示介绍计时器功能Unity计时器 Demo展示 介绍 游戏中有非常多的计时功能,比如:各种cd,以及需要延时调用的方法; 一般实现有一下几种方式: 1.手动计时

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计时器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Unity计时器功能实现示例

本文链接: https://www.lsjlt.com/news/155445.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c语言怎么计算字符串长度
    在C语言中,可以使用内置的strlen()函数来计算字符串的长度。该函数位于string.h头文件中。以下是一个示例代码: #inc...
    99+
    2024-05-14
    c语言
  • c语言怎么判断三个数的大小
    可以通过比较三个数之间的大小关系来判断它们的大小。以下是一个示例代码: #include <stdio.h> int ...
    99+
    2024-05-14
    c语言
  • c++排序函数sort怎么使用
    在C++中,使用sort函数对容器中的元素进行排序,可以按照默认的升序排列,也可以自定义排序规则。 下面是一个简单的例子,对一个ve...
    99+
    2024-05-14
    c++
  • c++中string的compare函数怎么使用
    在C++中,可以使用string的compare函数来比较两个string对象的大小。该函数的原型如下: int compare(c...
    99+
    2024-05-14
    c++
  • c++中string的compare函数有什么用
    c++中string的compare函数用于比较两个字符串的大小关系。该函数返回一个整数值,表示两个字符串的比较结果。 具体来说,如...
    99+
    2024-05-14
    c++
  • c++中print函数的功能有哪些
    在C++中,通常使用std::cout来进行输出操作,而不是使用print函数。std::cout是C++标准库中的一个输出流对象,...
    99+
    2024-05-14
    c++
  • c语言数据结构怎么使用
    在C语言中,数据结构可以通过定义结构体来实现。以下是一些常见的数据结构的使用方法示例: 链表: #include <std...
    99+
    2024-05-14
    c语言
  • c++中print函数的用法是什么
    在C++中没有内置的print函数,但可以使用cout来输出内容到控制台。cout是C++标准库中的一个输出流对象,可以使用<...
    99+
    2024-05-14
    c++
  • c++中concept的用法是什么
    在C++20中,Concept是一种新的语言特性,用于定义类型要求和约束。Concept可以被用来约束函数模板、类模板和普通函数的参...
    99+
    2024-05-14
    c++
  • c++中concept的作用是什么
    在C++中,concept的作用是定义一种通用的约束,用于限制模板参数的类型范围。通过使用concept,可以在编译时对模板参数进行...
    99+
    2024-05-14
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作