Unity SKFramework框架(四)、Timer 时间类工具简介
目录
简介
Timer模块实现了一系列计时工具,包括定时器(倒计时)、计时器、秒表、闹钟等,它们均继承自接口ITimer,支持启动、暂停、恢复、停止计时等行为。
一、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 功用
文章来源: coderz.blog.csdn.net,作者:CoderZ1010,版权归原作者所有,如需转载,请联系作者。
原文链接:coderz.blog.csdn.net/article/details/124767340
- 点赞
- 收藏
- 关注作者
评论(0)