游戏蛮牛学习群(纯技术交流,不闲聊):539178957
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2286

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 1742|回复: 153

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

  [复制链接]  [移动端链接]
排名
9483
昨日变化
6

4

主题

146

帖子

660

积分

Rank: 9Rank: 9Rank: 9

UID
21402
好友
3
蛮牛币
274
威望
0
注册时间
2014-4-14
在线时间
284 小时
最后登录
2018-8-14

认证开发者

发表于 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回复可见:
游客,如果您要查看本帖隐藏内容请回复















回复

使用道具 举报

排名
9483
昨日变化
6

4

主题

146

帖子

660

积分

Rank: 9Rank: 9Rank: 9

UID
21402
好友
3
蛮牛币
274
威望
0
注册时间
2014-4-14
在线时间
284 小时
最后登录
2018-8-14

认证开发者

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

也可以加蛮牛群 539178957

回复 支持 反对

使用道具 举报

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

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 | 显示全部楼层
如果您要查看本帖隐藏内容请

回复 支持 反对

使用道具 举报

4四处流浪
361/500
排名
7278
昨日变化
47

0

主题

129

帖子

361

积分

Rank: 4

UID
266294
好友
1
蛮牛币
22
威望
0
注册时间
2018-1-25
在线时间
73 小时
最后登录
2018-8-16
发表于 2018-7-17 19:30:21 | 显示全部楼层
thanks for the share!

回复 支持 反对

使用道具 举报

3偶尔光临
195/300
排名
10941
昨日变化
4

0

主题

57

帖子

195

积分

Rank: 3Rank: 3Rank: 3

UID
191422
好友
0
蛮牛币
351
威望
0
注册时间
2016-12-12
在线时间
56 小时
最后登录
2018-7-23
发表于 2018-7-17 20:47:50 | 显示全部楼层
这个Timer真的太实惠了。

回复 支持 反对

使用道具 举报

4四处流浪
419/500
排名
8272
昨日变化
3

0

主题

221

帖子

419

积分

Rank: 4

UID
281167
好友
1
蛮牛币
809
威望
0
注册时间
2018-5-14
在线时间
62 小时
最后登录
2018-8-16
发表于 2018-7-17 21:08:36 | 显示全部楼层
很好很轻大,感谢分享,支持一下

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1373/1500
排名
1513
昨日变化
2

0

主题

111

帖子

1373

积分

Rank: 6Rank: 6Rank: 6

UID
23042
好友
0
蛮牛币
2990
威望
0
注册时间
2014-4-27
在线时间
491 小时
最后登录
2018-8-16
发表于 2018-7-17 21:27:30 | 显示全部楼层
写到最后,本文Timer的源代码隐藏可见

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1316/1500
排名
1534
昨日变化
5

0

主题

83

帖子

1316

积分

Rank: 6Rank: 6Rank: 6

UID
49519
好友
1
蛮牛币
2703
威望
0
注册时间
2014-10-17
在线时间
469 小时
最后登录
2018-8-15
发表于 2018-7-17 22:44:08 | 显示全部楼层
666666666666666666666

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1316/1500
排名
1534
昨日变化
5

0

主题

83

帖子

1316

积分

Rank: 6Rank: 6Rank: 6

UID
49519
好友
1
蛮牛币
2703
威望
0
注册时间
2014-10-17
在线时间
469 小时
最后登录
2018-8-15
发表于 2018-7-17 23:03:24 | 显示全部楼层
要是小编能把demo弄出来就最好了

回复 支持 反对

使用道具 举报

排名
4038
昨日变化
3

8

主题

97

帖子

765

积分

Rank: 9Rank: 9Rank: 9

UID
251813
好友
3
蛮牛币
1589
威望
0
注册时间
2017-10-31
在线时间
320 小时
最后登录
2018-8-12

专栏作家活力之星

发表于 2018-7-18 07:32:28 | 显示全部楼层
下载下来简单了解下。

回复 支持 反对

使用道具 举报

5熟悉之中
653/1000
排名
3387
昨日变化
15

0

主题

103

帖子

653

积分

Rank: 5Rank: 5

UID
232255
好友
1
蛮牛币
1163
威望
0
注册时间
2017-7-15
在线时间
146 小时
最后登录
2018-8-16
发表于 2018-7-18 08:13:34 | 显示全部楼层
如果您要查看本帖隐藏内容请

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1407/1500
排名
1658
昨日变化
1

1

主题

343

帖子

1407

积分

Rank: 6Rank: 6Rank: 6

UID
206337
好友
3
蛮牛币
465
威望
0
注册时间
2017-6-5
在线时间
337 小时
最后登录
2018-8-16
发表于 2018-7-18 08:26:37 | 显示全部楼层
膜拜大佬

回复

使用道具 举报

5熟悉之中
710/1000
排名
2561
昨日变化
10

0

主题

37

帖子

710

积分

Rank: 5Rank: 5

UID
165111
好友
0
蛮牛币
1442
威望
0
注册时间
2016-8-31
在线时间
159 小时
最后登录
2018-8-16
发表于 2018-7-18 08:49:44 | 显示全部楼层
666666666666666
[发帖际遇]: LTY123 发帖时在路边捡到 2 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

2初来乍到
131/150
排名
14910
昨日变化
287

4

主题

30

帖子

131

积分

Rank: 2Rank: 2

UID
280327
好友
2
蛮牛币
87
威望
0
注册时间
2018-5-8
在线时间
53 小时
最后登录
2018-8-16
发表于 2018-7-18 08:50:19 | 显示全部楼层
thanks for the share!

回复 支持 反对

使用道具 举报

5熟悉之中
564/1000
排名
3806
昨日变化
12

0

主题

39

帖子

564

积分

Rank: 5Rank: 5

UID
233767
好友
0
蛮牛币
618
威望
0
注册时间
2017-7-23
在线时间
171 小时
最后登录
2018-8-16
发表于 2018-7-18 09:00:32 | 显示全部楼层
6666666666666666

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1226/1500
排名
3131
昨日变化
4

10

主题

510

帖子

1226

积分

Rank: 6Rank: 6Rank: 6

UID
214924
好友
2
蛮牛币
2717
威望
0
注册时间
2017-3-28
在线时间
268 小时
最后登录
2018-8-16
发表于 2018-7-18 09:01:40 | 显示全部楼层
666666666666666666666666
[发帖际遇]: 一个袋子砸在了 fengxs420 头上,fengxs420 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表