定时器(单次和循环)

本文介绍了一个Unity计时器助手类TimeHelper的实现,包括设置单次和重复计时器的方法,以及如何关闭计时器。TimeHelper使用Dictionary存储计时器ID与回调函数,通过GameObject和TimerBehavior组件来管理计时行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using UnityEngine;

/// <summary>
/// 计时器助手类
/// </summary>
public static class TimeHelper
{
    private static int timerID;
    private static Dictionary<int, Action> timerFuncDic;
    private static Dictionary<int, GameObject> timerObjects;
    private static string timerName = "Timer";

    /// <summary>
    /// 静态构造函数
    /// </summary>
    static TimeHelper()
    {
        timerID = 1;
        timerFuncDic = new Dictionary<int, Action>();
        timerObjects = new Dictionary<int, GameObject>();
    }

    /// <summary>
    /// 设置一个单次计时器
    /// </summary>
    /// <param name="action"></param>
    /// <param name="time"></param>
    /// <param name="isIgnoreTimeScale"></param>
    /// <returns></returns>
    public static int SetTimer(Action action, float time, bool isIgnoreTimeScale = true)
    {
        int tmpTimerID = int.MaxValue;
        if (null != action && time > 0.0f)
        {
            tmpTimerID = GetTimerID();
            GameObject timerTmpObj = new GameObject();
            GameObject.DontDestroyOnLoad(timerTmpObj);
            timerTmpObj.name = timerName + tmpTimerID.ToString();

            TimerBehavior timerBehavior = timerTmpObj.AddComponent<TimerBehavior>();

### 单片机定时器单次模式与连续模式的工作原理及区别 #### 单次模式(One-shot Mode) 在单次模式下,一旦启动定时器,它会按照设定的时间间隔运行一次。当计数值达到预设的最大值时,定时器停止并触发中断请求。这种模式适用于需要精确执行一次性延迟操作的情况。 对于51系列单片机而言,在该模式中,当定时器溢出后不会自动重启而是等待程序重新加载初值来再次开启定时过程[^2]。 ```c // 设置为单次模式的例子 void Timer_One_Shot_Init(void){ TMOD &= 0xF0; // 清除低四位,选择T0的操作方式 TMOD |= 0x01; // T0设置为模式1(16位定时器) TH0 = (65536-50000)/256;// 设定TH0初始值 TL0 = (65536-50000)%256;// 设定TL0初始值 ET0 = 1; // 开启T0中断允许 EA = 1; // 总中断使能 } ``` #### 连续模式(Continuous/Auto-reload Mode) 相比之下,连续模式也被称为自动重装载模式。在这种情况下,每当定时器完成一轮计数周期之后就会自动将预先存储好的常量重新写入寄存器内作为新的起始地址继续下一个循环直到被外部条件终止为止。这种方式非常适合用来创建固定频率的方波或者其他重复性的任务处理逻辑[^4]。 针对STM32这类更先进的MCU平台来说,则可以通过配置TIM_Period属性以及启用相应的更新事件来进行持续不断的周期性活动管理: ```c // STM32定时器初始化函数片段展示如何进入连续模式 htim3.Instance = TIM3; htim3.Init.Prescaler = 7199; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = count; // 自动重载值 HAL_TIM_Base_Init(&htim3); HAL_TIM_Base_Start_IT(&htim3); // 启用定时器中断以维持连续运作状态 ``` 两种模式的主要差异在于前者仅执行单一时间跨度的任务而后者能够不间断地保持特定时间段内的行为规律;另外就是硬件资源消耗方面也会有所不同——由于每次都需要手动干预才能让单次型实例化对象恢复正常运转姿态所以相对耗费更多CPU介入次数从而影响整体性能表现效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值