找回密码
 注册帐号

扫一扫,访问微社区

志远 大话链式编程之定时器Timer(四)

193
回复
5797
查看
  [ 复制链接 ]
排名
9396
昨日变化

12

主题

207

帖子

961

积分

Rank: 9Rank: 9Rank: 9

UID
21402
好友
12
蛮牛币
89
威望
0
注册时间
2014-4-14
在线时间
461 小时
最后登录
2019-5-22

认证开发者

2018-7-17 18:42:44 显示全部楼层 阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 zhiyuan 于 2018-7-18 13:49 编辑

0x00前言

链式编程思想的Unity组件改造还有几章待续,但今天小编准备来点插曲---教教大家基于链式编程的Unity通用定时器:Timer
诚然,前面3章的学习,我们已然看到它给Unity组件扩展带来的进步,一不小心,还修复了VideoPlayer事件不咋灵验的BUG。
下面呢,我们来看看如何将一个Unity常用的延时需求封装成一个定时器,还“咔咔地”给他也整出个链式风格来。
风格如下:
风格.png

0x01背景
定时器在Unity中的需求较为常见,譬如:
  • 点击一个按钮,几秒钟后搞事情
  • 点击一个按钮,开始计时or倒计时
  • 给你一个总时间,并在每个时间节点到来的时候搞个事情
  • 其他扩展,比如给WWW类扩展一个链接超时检测(也叫看门狗?)
有鉴于时常疲于写延时逻辑呀,笔者便有了一个封装定时器的小小想法。下面,先谈谈常见的定时器的写法:
实现形式 简述
Update(){...} 每帧减去 Time.deltaTime 设定时间小于0时搞事情
IEnumerator Delay(){...} yield return time即
Invoke(methodName, time) 见API,提供要执行的方法和延迟时长即可

这里,笔者采用了第一种方案进行的封装,但时间的累加或递减并不是用Time.deltaTime,而是选择了另一个方案,也是便于为定时器加入TimeScale功能。

0x02实现

这个定时器由3个类,2个事件链,一个Timer组,诸多重载方法与静态方法 组成:
其中3个类:
Timer: 定时器核心类,负责实现定时器的运算逻辑和事件分发,同时面向用户公开操作定时器的API
TimerDriver: 驱动类,Timer一旦被添加自动生成,使用MonoBehavior的Update生命周期函数驱动我们所有的定时器。
TimerExtend:静态类,扩展方法所在,
2个事件链:
Action<float> UpdateEvent; //每帧会响应
Action EndEvent;                //定时结束响应  

因为脚本长达500多行,小编就简单的梳理一下流程和大纲(源码寄存在GitHub上,见文章末尾):
1. 先声明一个Timer类,此时笔者已经决定使用Itween的理念一个脚本完成自身所有功能的管理,声明一个list先,安排!其实后面的所有逻辑就都对这个列表的操作了,(增删改查+遍历刷新)。
01.png
2. 得到定时的开始时间,好处可以选择是否用到Timescale:
02.png
3. 添加事件链,笔者用了一对Action委托完成了事件链的添加:
03.png
4. 围绕事件链,完成对其增(图一)、删(图二)操作
04.png

05.png
5. 静态方法,为用户隐式创建Timer实例和Timer驱动(配合单例模式),简化使用流程,用户只需处理业务逻辑其他不用操心。
06.png

07.png 08.png

6. 方法扩展+委托参数=实现链式编程
09.png

7. 立下Flag,来日好相认:主动权移交用户手上便于用户点对点交互。
13.png 14.png

8. 方法重载,实现更多方式与定时器交互
哪些方法要重载?
移除Timer,对,移除Timer,我们可以通过flag移除,也可以通过timer实例移除,亦可以通过注册的事件来移除
15.png
备注:
形如这样的代码可简化成下面的样子,去掉小括号,去掉return:
[C#] 纯文本查看 复制代码
                if (!Array.Exists(delegates, (v) => { return v == (Delegate)updateEvent; }))
                {
                    UpdateEvent += updateEvent;
                }



[C#] 纯文本查看 复制代码
if (!Array.Exists(delegates, v=>  v == (Delegate)updateEvent ))
                {
                    UpdateEvent += updateEvent;
                }




0x03示例


1.下面的示例演示了:Update事件和OnCompleted事件。
“    嗯?就截图里面几句代码,还有多的不?”  “对不起,还真就没有~”
   
10.png
11.gif
时间好像有点错开了,呃,函数用错了吧,用 Mathf.FloorToInt 就好啦~~

2.  简单流程控制,实现在哪个节点(秒)执行什么事情--------省略了,为啥,因为上面的示例里面,加个if else就成,毕竟你每秒都能拿到,哪个节点(哪一秒)搞事情还不得是你说了算?


3.  WWW 的简单扩展,WWW下载的超时检测 (开脑洞)

11.png
12.gif
网络好没办法,设定为0.5秒也很难得到超时报错,怪我咯
0X04总结


因为链式编程思想的融入,小编的实际使用中来看呀,这个Timer真的太实惠了。
直接嵌入代码为俺带来延迟操作但又丝毫未打乱俺的思绪,还带来了闭包的好处。
闭包的坏处?嘿嘿嘿,小编表示本文不做探讨~

0X05扩展阅读

使用链式编程思想的Timer Trigger - 简书 https://www.jianshu.com/p/c79bcf446684
Unity3D 中的定时器 - Easily - 博客园 https://www.cnblogs.com/yili16438/p/3749066.html
通用工具类之定时触发器 - 草帽领 - 博客园 https://www.cnblogs.com/CaomaoUnity3d/p/4940655.html
浅谈Unity3D中的Coroutine及其使用(延时、定时调用函数) - CSDN博客 https://blog.csdn.net/nizihabi/article/details/47606887


写到最后,本文Timer的源代码和Demo回复可见:
游客,如果您要查看本帖隐藏内容请回复














回复

使用道具 举报

排名
9396
昨日变化

12

主题

207

帖子

961

积分

Rank: 9Rank: 9Rank: 9

UID
21402
好友
12
蛮牛币
89
威望
0
注册时间
2014-4-14
在线时间
461 小时
最后登录
2019-5-22

认证开发者

楼主 2018-8-7 17:03:54 显示全部楼层
zhiyuan 发表于 2018-8-7 17:03
最近项目比较忙 ,先暂更几天,抱歉抱歉 有项目的任何问题联系本人QQ 1258586900,有时间会帮忙解决  ...

也可以加蛮牛群 539178957
回复 支持 反对

使用道具 举报

3偶尔光临
273/300
排名
12303
昨日变化

0

主题

81

帖子

273

积分

Rank: 3Rank: 3Rank: 3

UID
2927
好友
0
蛮牛币
11
威望
0
注册时间
2013-8-31
在线时间
117 小时
最后登录
2018-7-25
2018-7-17 19:11:12 显示全部楼层
如果您要查看本帖隐藏内容请
回复 支持 反对

使用道具 举报

6蛮牛粉丝
1045/1500
排名
4092
昨日变化

0

主题

461

帖子

1045

积分

Rank: 6Rank: 6Rank: 6

UID
266294
好友
1
蛮牛币
159
威望
0
注册时间
2018-1-25
在线时间
222 小时
最后登录
2019-5-20
2018-7-17 19:30:21 显示全部楼层
thanks for the share!
回复 支持 反对

使用道具 举报

3偶尔光临
262/300
排名
10112
昨日变化

0

主题

73

帖子

262

积分

Rank: 3Rank: 3Rank: 3

UID
191422
好友
0
蛮牛币
467
威望
0
注册时间
2016-12-12
在线时间
82 小时
最后登录
2019-5-9
2018-7-17 20:47:50 显示全部楼层
这个Timer真的太实惠了。
回复 支持 反对

使用道具 举报

4四处流浪
438/500
排名
8243
昨日变化

0

主题

225

帖子

438

积分

Rank: 4

UID
281167
好友
1
蛮牛币
883
威望
0
注册时间
2018-5-14
在线时间
65 小时
最后登录
2018-12-10
2018-7-17 21:08:36 显示全部楼层
很好很轻大,感谢分享,支持一下
回复 支持 反对

使用道具 举报

6蛮牛粉丝
1387/1500
排名
1677
昨日变化

0

主题

110

帖子

1387

积分

Rank: 6Rank: 6Rank: 6

UID
23042
好友
0
蛮牛币
3004
威望
0
注册时间
2014-4-27
在线时间
501 小时
最后登录
2019-4-21
2018-7-17 21:27:30 显示全部楼层
写到最后,本文Timer的源代码隐藏可见
回复 支持 反对

使用道具 举报

6蛮牛粉丝
1492/1500
排名
1453
昨日变化

0

主题

96

帖子

1492

积分

Rank: 6Rank: 6Rank: 6

UID
49519
好友
1
蛮牛币
3404
威望
0
注册时间
2014-10-17
在线时间
530 小时
最后登录
2019-5-21
2018-7-17 22:44:08 显示全部楼层
666666666666666666666
回复 支持 反对

使用道具 举报

6蛮牛粉丝
1492/1500
排名
1453
昨日变化

0

主题

96

帖子

1492

积分

Rank: 6Rank: 6Rank: 6

UID
49519
好友
1
蛮牛币
3404
威望
0
注册时间
2014-10-17
在线时间
530 小时
最后登录
2019-5-21
2018-7-17 23:03:24 显示全部楼层
要是小编能把demo弄出来就最好了
回复 支持 反对

使用道具 举报

排名
2714
昨日变化

12

主题

130

帖子

1199

积分

Rank: 9Rank: 9Rank: 9

UID
251813
好友
4
蛮牛币
2172
威望
0
注册时间
2017-10-31
在线时间
502 小时
最后登录
2019-5-22

专栏作家活力之星

2018-7-18 07:32:28 显示全部楼层
下载下来简单了解下。
回复 支持 反对

使用道具 举报

6蛮牛粉丝
1060/1500
排名
2236
昨日变化

1

主题

156

帖子

1060

积分

Rank: 6Rank: 6Rank: 6

UID
232255
好友
1
蛮牛币
1451
威望
0
注册时间
2017-7-15
在线时间
275 小时
最后登录
2019-5-22
2018-7-18 08:13:34 显示全部楼层
如果您要查看本帖隐藏内容请
回复 支持 反对

使用道具 举报

7日久生情
2457/5000
排名
970
昨日变化

2

主题

854

帖子

2457

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
206337
好友
4
蛮牛币
15065
威望
0
注册时间
2017-6-5
在线时间
513 小时
最后登录
2019-5-22
2018-7-18 08:26:37 显示全部楼层
膜拜大佬
回复

使用道具 举报

6蛮牛粉丝
1097/1500
排名
1677
昨日变化

0

主题

61

帖子

1097

积分

Rank: 6Rank: 6Rank: 6

UID
165111
好友
0
蛮牛币
2300
威望
0
注册时间
2016-8-31
在线时间
260 小时
最后登录
2019-5-22
2018-7-18 08:49:44 显示全部楼层
666666666666666
回复 支持 反对

使用道具 举报

3偶尔光临
247/300
排名
11230
昨日变化

6

主题

48

帖子

247

积分

Rank: 3Rank: 3Rank: 3

UID
280327
好友
3
蛮牛币
157
威望
0
注册时间
2018-5-8
在线时间
103 小时
最后登录
2019-4-25
2018-7-18 08:50:19 显示全部楼层
thanks for the share!
回复 支持 反对

使用道具 举报

5熟悉之中
887/1000
排名
2492
昨日变化

0

主题

50

帖子

887

积分

Rank: 5Rank: 5

UID
233767
好友
0
蛮牛币
971
威望
0
注册时间
2017-7-23
在线时间
261 小时
最后登录
2019-4-16
2018-7-18 09:00:32 显示全部楼层
6666666666666666
回复 支持 反对

使用道具 举报

7日久生情
2022/5000
排名
1896
昨日变化

41

主题

741

帖子

2022

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
214924
好友
4
蛮牛币
18181
威望
0
注册时间
2017-3-28
在线时间
524 小时
最后登录
2019-5-22
2018-7-18 09:01:40 显示全部楼层
666666666666666666666666
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则