Unity c#实现定时器

定时器的功能是每隔一段时间执行一些函数(发送一些信息)
下面是在Unity里用c#实现的定时器功能

using UnityEngine;
public class Timer
{
    /// <summary>
    /// 使用该类封装float,使Timer中的UpdateTime与外界共享同一数据
    /// 在外界更改间隔时间则就不用重新更新Timer中的数据
    /// </summary>
    [System.Serializable]
    public class FloatTime
    {
        public float value;
    }

    public delegate void EventHandler();
    public event EventHandler EventHandle;

    public bool IsPause { set; get; } = false;
    public FloatTime UpdateTime { set; get; }

    private float passTime;
    
    /// <summary>
    /// 请在每一帧调用更新,在一帧中事件最多只会触发一次,若要触发多次请调用StayUpdate
    /// </summary>
    public void Update()
    {
        if (IsPause)
            return;
        passTime += Time.deltaTime;
        if (passTime >= UpdateTime.value)
        {
            passTime -= UpdateTime.value;
            EventHandle();
        }
    }

    /// <summary>
    /// 请在每一帧调用更新,在一帧中事件会触发多次(可能会卡帧),若要限制每帧只能触发一次请调用Update
    /// </summary>
    public void StayUpdate()
    {
        if (IsPause)
            return;
        passTime += Time.deltaTime;
        while (passTime >= UpdateTime.value)
        {
            passTime -= UpdateTime.value;
            EventHandle();
        }
    }
    
    /// <summary>
    /// 使用Time.unscaledDeltaTime版本
    /// </summary>
    public void UnscaleUpdate()
    {
        if (IsPause)
            return;
        passTime += Time.unscaledDeltaTime;
        if (passTime >= UpdateTime.value)
        {
            passTime -= UpdateTime.value;
            EventHandle();
        }
    }

    /// <summary>
    /// 使用Time.unscaledDeltaTime版本
    /// </summary>
    public void UnscaleStayUpdate()
    {
        if (IsPause)
            return;
        passTime += Time.unscaledDeltaTime;
        while (passTime >= UpdateTime.value)
        {
            passTime -= UpdateTime.value;
            EventHandle();
        }
    }

    /// <summary>
    /// 重置定时器的工作状态
    /// </summary>
    public void Stop()
    {
        IsPause = true;
        passTime = 0;
    }
}

把float在封装一层是为了让需要该类的引用,让Timer内的更新时间与外部用户自己存储的更新时间字段同步更新。这样用户自己储存的更新时间字段改变就不需要对Timer对象的更新时间字段重新赋值。

在Timer里的EventHandle属性中注册触发事件

测试代码:

public class BublbesCreator : MonoBehaviour
{
    public Timer.FloatTime emitDeltaTime;//发射气泡的时间间隔,会被Unity自动实例化
    private Timer createTimer = new Timer();//计时器
    void Start()
    {
        createTimer.EventHandle += () => CreateBubble();//注册事件
        createTimer.UpdateTime = emitDeltaTime;//引用事件间隔的字段
    }

    void Update()
    {
        createTimer.Update();//执行计时器更新
    }

    void CreateBubble()
    {
        //Dosomething,你的代码
    }
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

紫空-NS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值