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

扫一扫,访问微社区

开发者专栏

关注:2335

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

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

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

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

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

4

主题

150

帖子

689

积分

Rank: 9Rank: 9Rank: 9

UID
21402
好友
3
蛮牛币
276
威望
0
注册时间
2014-4-14
在线时间
299 小时
最后登录
2018-10-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回复可见:
游客,如果您要查看本帖隐藏内容请回复















回复

使用道具 举报

排名
9664
昨日变化

4

主题

150

帖子

689

积分

Rank: 9Rank: 9Rank: 9

UID
21402
好友
3
蛮牛币
276
威望
0
注册时间
2014-4-14
在线时间
299 小时
最后登录
2018-10-22

认证开发者

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

也可以加蛮牛群 539178957

回复 支持 反对

使用道具 举报

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

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四处流浪
469/500
排名
6630
昨日变化

0

主题

191

帖子

469

积分

Rank: 4

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

回复 支持 反对

使用道具 举报

3偶尔光临
200/300
排名
11021
昨日变化

0

主题

58

帖子

200

积分

Rank: 3Rank: 3Rank: 3

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

回复 支持 反对

使用道具 举报

4四处流浪
429/500
排名
8044
昨日变化

0

主题

223

帖子

429

积分

Rank: 4

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

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1374/1500
排名
1566
昨日变化

0

主题

111

帖子

1374

积分

Rank: 6Rank: 6Rank: 6

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

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1397/1500
排名
1480
昨日变化

0

主题

90

帖子

1397

积分

Rank: 6Rank: 6Rank: 6

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

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1397/1500
排名
1480
昨日变化

0

主题

90

帖子

1397

积分

Rank: 6Rank: 6Rank: 6

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

回复 支持 反对

使用道具 举报

排名
3616
昨日变化

10

主题

108

帖子

885

积分

Rank: 9Rank: 9Rank: 9

UID
251813
好友
3
蛮牛币
1735
威望
0
注册时间
2017-10-31
在线时间
359 小时
最后登录
2018-10-19

专栏作家活力之星

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

回复 支持 反对

使用道具 举报

5熟悉之中
747/1000
排名
2906
昨日变化

0

主题

106

帖子

747

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

7日久生情
1613/5000
排名
1438
昨日变化

1

主题

413

帖子

1613

积分

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

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

回复

使用道具 举报

5熟悉之中
842/1000
排名
2143
昨日变化

0

主题

41

帖子

842

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

3偶尔光临
185/300
排名
12147
昨日变化

4

主题

40

帖子

185

积分

Rank: 3Rank: 3Rank: 3

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

回复 支持 反对

使用道具 举报

5熟悉之中
673/1000
排名
3228
昨日变化

0

主题

42

帖子

673

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1452/1500
排名
2664
昨日变化

11

主题

592

帖子

1452

积分

Rank: 6Rank: 6Rank: 6

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

回复 支持 反对

使用道具 举报

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

本版积分规则

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