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

目录

简介

一、Countdown 定时器(倒计时)

二、Clock 计时器

三、Chronometer 秒表

四、Alarm 闹钟

五、EverySeconds 与 EveryFrames

六、TimeUtility 功用


简介

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

扫描二维码关注公众号,回复: 14155009 查看本文章

一、Countdown 定时器(倒计时)

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

Countdown countdown1 = this.Countdown(5f);
Countdown countdown2 = Timer.Countdown(10f, true);

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

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

Example:

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();
        }
    }
}

二、Clock 计时器

Clock clock1 = this.Clock();
Clock clock2 = Timer.Clock(true);

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

Timer.Clock()
    .OnExecute(s => Debug.Log(string.Format("已经计时{0}", s)))
    //设置停止条件 当键盘A按下时 计时器停止
    .StopWhen(() => Input.GetKeyDown(KeyCode.A))
    .Launch();

三、Chronometer 秒表

Chronometer chronometer1 = this.Chronometer();
Chronometer chronometer2 = Timer.Chronometer(true);

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

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 闹钟

 this.Alarm(10, 30, 0, () => Debug.Log("唤醒闹钟")).Launch();

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

五、EverySeconds 与 EveryFrames

this.EverySeconds(5f, () => Debug.Log("TODO"), false, -1).Launch();

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

Timer.EveryFrame(() => Debug.Log("TODO"), -1).Launch();
this.EveryFrames(5, () => Debug.Log("TODO"), -1).Launch();

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

六、TimeUtility 功用

猜你喜欢

转载自blog.csdn.net/qq_42139931/article/details/124767340