首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Unity SKFramework框架(四)、Timer 时间类工具

Unity SKFramework框架(四)、Timer 时间类工具

作者头像
CoderZ
发布2022-08-29 17:08:23
发布2022-08-29 17:08:23
1.6K00
代码可运行
举报
运行总次数:0
代码可运行

简介

Timer模块实现了一系列计时工具,包括定时器(倒计时)、计时器、秒表、闹钟等,它们均继承自接口ITimer,支持启动、暂停、恢复、停止计时等行为。

一、Countdown 定时器(倒计时)

获取一个定时器可以通过如下方式,计时类工具的运行依赖于携程,通过this获取定时器表示使用当前的MonoBehaviour开启携程,使用Timer获取定时器表示使用计时模块管理器的MonoBehaviour开启携程。

代码语言:javascript
代码运行次数:0
运行
复制
Countdown countdown1 = this.Countdown(5f);
Countdown countdown2 = Timer.Countdown(10f, true);

第一个参数为float类型,表示定时的时长,第二个参数为bool类型,表示计时是否忽略时间的缩放,默认为false。通过如下方式设置定时器的启动、执行、暂停、恢复、停止事件:

代码语言:javascript
代码运行次数:0
运行
复制
Timer.Countdown(5f)
    .OnLaunch(() => Debug.Log("定时器启动"))
    .OnExecute(s => Debug.Log(string.Format("剩余时间{0}", s)))
    .OnPause(() => Debug.Log("定时器暂停"))
    .OnResume(() => Debug.Log("定时器恢复"))
    .OnStop(() => Debug.Log("定时器终止"));
代码语言:javascript
代码运行次数:0
运行
复制
Example:
代码语言:javascript
代码运行次数:0
运行
复制
using UnityEngine;
using SK.Framework;

public class Example : MonoBehaviour
{
    //定时器
    private Countdown countdown;

    private void Start()
    {
        countdown = Timer.Countdown(5f)
            .OnLaunch(() => Debug.Log("定时器启动"))
            .OnExecute(s => Debug.Log(string.Format("剩余时间{0}", s)))
            .OnPause(() => Debug.Log("定时器暂停"))
            .OnResume(() => Debug.Log("定时器恢复"))
            .OnStop(() => Debug.Log("定时器停止"));
    }

    private void OnGUI()
    {
        if (GUILayout.Button("启动", GUILayout.Width(200f), GUILayout.Height(50f)))
        {
            countdown.Launch();
        }
        if (GUILayout.Button("暂停", GUILayout.Width(200f), GUILayout.Height(50f)))
        {
            countdown.Pause();
        }
        if (GUILayout.Button("恢复", GUILayout.Width(200f), GUILayout.Height(50f)))
        {
            countdown.Resume();
        }
        if (GUILayout.Button("终止", GUILayout.Width(200f), GUILayout.Height(50f)))
        {
            countdown.Stop();
        }
    }
}
代码语言:javascript
代码运行次数:0
运行
复制
二、Clock 计时器
代码语言:javascript
代码运行次数:0
运行
复制
Clock clock1 = this.Clock();
Clock clock2 = Timer.Clock(true);

计时器与定时器具有相同的事件,不同的是,定时器为倒计时,例如定时5秒,其值将会从5逐渐到0,到0后自动停止,计时器为正向计时,需要调用Stop手动终止,可以通过StopWhen为其设置停止的条件,当条件满足时,计时器将自动停止。

代码语言:javascript
代码运行次数:0
运行
复制
Timer.Clock()
    .OnExecute(s => Debug.Log(string.Format("已经计时{0}", s)))
    //设置停止条件 当键盘A按下时 计时器停止
    .StopWhen(() => Input.GetKeyDown(KeyCode.A))
    .Launch();

三、Chronometer 秒表

代码语言:javascript
代码运行次数:0
运行
复制
Chronometer chronometer1 = this.Chronometer();
Chronometer chronometer2 = Timer.Chronometer(true);

秒表在计时器的基础上增加了Record记录的功能,当调用Shot方法时,会产生一条记录,记录包含context上下文(object类型)和time时间点:

代码语言:javascript
代码运行次数:0
运行
复制
using UnityEngine;
using SK.Framework;

public class Example : MonoBehaviour
{
    //秒表
    private Chronometer chronometer;

    private void Start()
    {
        chronometer = this.Chronometer(true);
        chronometer.Launch();
    }

    private void OnGUI()
    {
        if (GUILayout.Button("Shot", GUILayout.Width(200f), GUILayout.Height(50f)))
        {
            chronometer.Shot();
        }
        if (GUILayout.Button("Log", GUILayout.Width(200f), GUILayout.Height(50f)))
        {
            var records = chronometer.Records;
            for (int i = 0; i < records.Count; i++)
            {
                Debug.Log(string.Format("No.{0}: {1}", i + 1, records[i].time));
            }
        }
    }
}

四、Alarm 闹钟

代码语言:javascript
代码运行次数:0
运行
复制
 this.Alarm(10, 30, 0, () => Debug.Log("唤醒闹钟")).Launch();

前三个参数均为int类型,分别表示小时、分钟、秒,第四个参数为回调函数,上例表示当10点30分0秒时,将会执行回调函数,打印“唤醒闹钟”日志。

五、EverySeconds 与 EveryFrames

代码语言:javascript
代码运行次数:0
运行
复制
this.EverySeconds(5f, () => Debug.Log("TODO"), false, -1).Launch();

EverySeconds表示每隔指定时长,执行一次事件,第一个参数为float类型,表示间隔时长,第二个参数为Action事件,第三个参数表示是否忽略时间缩放,默认为false,第四个参数表示执行的次数,传入负数代表一直循环执行,默认为-1。

代码语言:javascript
代码运行次数:0
运行
复制
Timer.EveryFrame(() => Debug.Log("TODO"), -1).Launch();
this.EveryFrames(5, () => Debug.Log("TODO"), -1).Launch();

EveryFrames与EverySeconds原理相同,不同的是以帧为单位,每隔指定帧执行一次事件。EveryFrame则表示每帧,可以在不是MonoBehaviour的脚本里实现Update的功能。

六、TimeUtility 功用

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 当代野生程序猿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Countdown 定时器(倒计时)
  • 三、Chronometer 秒表
  • 四、Alarm 闹钟
  • 五、EverySeconds 与 EveryFrames
  • 六、TimeUtility 功用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档