Unity 如何实现一个定时器

举报
CoderZ1010 发表于 2022/09/25 05:18:37 2022/09/25
6.8k+ 0 0
【摘要】 using System;using UnityEngine; /// <summary>/// 时间单位/// </summary>public enum TimeUnit{ MILLSECOND, //毫秒 SECOND, //秒 MINUTE, //分钟 HOUR, ...

      using System;
      using UnityEngine;
      /// <summary>
      /// 时间单位
      /// </summary>
      public enum TimeUnit
      {
          MILLSECOND, //毫秒
          SECOND,     //秒
          MINUTE,     //分钟
          HOUR,       //小时
      }
      /// <summary>
      /// 定时器
      /// </summary>
      public class Timer
      {
         /// <summary>
         /// 计时结束回调事件
         /// </summary>
         public event Action OnEnd;
         /// <summary>
         /// 计时更新事件
         /// </summary>
         public event Action<float> OnUpdate;
         //定时时长
         private float duration;
         //开始计时时间
         private float beginTime;
         //已计时间
         private float elapsedTime;
         //缓存时间(用于暂停)
         private float cacheTime;
         //是否循环
         private bool loop;
         //是否暂停
         private bool isPaused;
         //是否计时完成
         private bool isFinished;
         /// <summary>
         /// 构造函数
         /// </summary>
         /// <param name="duration">定时时长</param>
         /// <param name="timeUnit">时间单位</param>
         /// <param name="loop">是否循环</param>
         public Timer(float duration, TimeUnit timeUnit = TimeUnit.SECOND, bool loop = false)
          {
             switch (timeUnit)
              {
                 case TimeUnit.MILLSECOND:   this.duration = duration / 1000;  break;
                 case TimeUnit.SECOND:       this.duration = duration;         break;
                 case TimeUnit.MINUTE:       this.duration = duration * 60;    break;
                 case TimeUnit.HOUR:         this.duration = duration * 3600;  break;
              }
             this.loop = loop;
              beginTime = Time.realtimeSinceStartup;
          }
         /// <summary>
         /// 更新定时器
         /// </summary>
         public void Update()
          {
             if(!isFinished && !isPaused)
              {
                  elapsedTime = Time.realtimeSinceStartup - beginTime;
                  OnUpdate?.Invoke(Mathf.Clamp(elapsedTime, 0, duration));
                 if(elapsedTime >= duration)
                  {
                      OnEnd?.Invoke();
                     if (loop)
                      {
                          beginTime = Time.realtimeSinceStartup;
                      }
                     else
                      {
                          isFinished = true;
                      }
                  }
              }
          }
         /// <summary>
         /// 暂停定时器
         /// </summary>
         public void Pause()
          {
             if (!isFinished)
              {
                  isPaused = true;
                  cacheTime = Time.realtimeSinceStartup;
              }
          }
         /// <summary>
         /// 恢复定时器
         /// </summary>
         public void Unpause()
          {
             if(!isFinished && isPaused)
              {
                  beginTime += Time.realtimeSinceStartup - cacheTime;
                  isPaused = false;
              }
          }
         /// <summary>
         /// 停止定时器
         /// </summary>
         public void Stop()
          {
              isFinished = true;
          }
      }
  
 

Example:


          Timer timer;
         private void Start()
          {
              timer = new Timer(3f);
              timer.OnEnd += () => Debug.Log("计时结束 总计时长3秒");
              timer.OnUpdate += v => Debug.Log($"计时中 已计时长{v}秒");
          }
         private void Update()
          {
              timer.Update();
          }
  
 

文章来源: coderz.blog.csdn.net,作者:CoderZ1010,版权归原作者所有,如需转载,请联系作者。

原文链接:coderz.blog.csdn.net/article/details/109058036

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。