开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1702

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

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

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

[海莉zhe] [一码当先] Unity3D 超简单计时器Timer (二)

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

47

主题

172

帖子

1886

积分

Rank: 9Rank: 9Rank: 9

UID
76890
好友
32
蛮牛币
2708
威望
0
注册时间
2015-3-4
在线时间
641 小时
最后登录
2017-5-27

专栏作家

发表于 2017-5-5 01:29:20 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 海莉zhe 于 2017-5-5 09:34 编辑

   今天小编为大家分享一下,如何快速写一个简单的计时器,其实说到计时器,我们能用协程实现,也可以用unity内置的委托Invoke实现,然而小编利用自定义的委托,快速写一个统一管理计时器。

  1.第一步,新建unity项目,并且新建一个Timer.cs ,这个是计时器的核心类文件;
  
    Timer.cs 代码如下:
        
[C#] 纯文本查看 复制代码
public class Timer
{
    bool _isTicking;//是否在计时中
    float _currentTime;//当前时间
    float _endTime;//结束时间

    public delegate void EventHander();

    public event EventHander tickEvent;

    
    public Timer(float second)
    {
        _currentTime = 0;
        _endTime = second;
    }

    /// <summary>
    /// 开始计时
    /// </summary>
    public void StartTimer()
    {
        _isTicking = true;
    }
    /// <summary>
    /// 更新中
    /// </summary>
    public void UpdateTimer(float deltaTime)
    {
        if (_isTicking)
        {
            _currentTime += deltaTime;
            if (_currentTime > _endTime)
            {
                _isTicking = false;
                tickEvent();
            }
        }
    }
    /// <summary>
    /// 停止计时
    /// </summary>
    public void StopTimer()
    {
        _isTicking = false;
    }
    /// <summary>
    /// 持续计时
    /// </summary>
    public void ContinueTimer()
    {
        _isTicking = true;
    }
    /// <summary>
    /// 重新计时
    /// </summary>
    public void ReStartTimer()
    {
        _isTicking = true;
        _currentTime = 0;
    }
    /// <summary>
    /// 重新设定计时器
    /// </summary>
    public void ResetEndTimer(float second)
    {
        _endTime = second;
    }


        
}


  2.第二步,在场景中,直接附加调用计时器类TimerManager.cs组件类;
   
     TimerManager.cs 代码如下:

     
[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;

public class TimerManager : MonoBehaviour {

    Timer _timer;
        // Use this for initialization
        void Start () {

        //初始化计时器 
        _timer = new Timer(10);
        _timer.tickEvent += SendMessage;
        //10秒后开始发送信息
        _timer.StartTimer();
     
    }

    private void SendMessage()
    {
        Debug.Log("Hello! AnimeKing!");
    }

    // Update is called once per frame
    void Update () {
        _timer.UpdateTimer(Time.deltaTime);
        }

    void OnDestroy()
    {
        _timer.tickEvent -= SendMessage;
    }
}
   

      2.png

   3.第三步,直接运行项目看结果啦!

      3.png

回复

使用道具 举报

6蛮牛粉丝
1340/1500
排名
17815
昨日变化
6

2

主题

1140

帖子

1340

积分

Rank: 6Rank: 6Rank: 6

UID
185807
好友
0
蛮牛币
1533
威望
0
注册时间
2016-11-22
在线时间
180 小时
最后登录
2017-5-27
发表于 2017-5-5 09:40:59 | 显示全部楼层
赞,学习了,谢谢分享
[发帖际遇]: 东坡肘子2010 乐于助人,奖励 3 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

5熟悉之中
693/1000
排名
3501
昨日变化

6

主题

82

帖子

693

积分

Rank: 5Rank: 5

UID
164216
好友
0
蛮牛币
1595
威望
0
注册时间
2016-8-25
在线时间
315 小时
最后登录
2017-5-27
发表于 2017-5-5 09:59:49 | 显示全部楼层
感谢楼主 学习了

回复

使用道具 举报

排名
15282
昨日变化
3

0

主题

14

帖子

56

积分

Rank: 2Rank: 2

UID
74896
好友
0
蛮牛币
23
威望
0
注册时间
2015-2-15
在线时间
18 小时
最后登录
2017-5-9
发表于 2017-5-5 09:59:51 | 显示全部楼层
赞,学习了,谢谢分享

回复 支持 反对

使用道具 举报

排名
34871
昨日变化
17

0

主题

29

帖子

37

积分

Rank: 1

UID
132889
好友
0
蛮牛币
19
威望
0
注册时间
2015-12-29
在线时间
4 小时
最后登录
2017-5-6
发表于 2017-5-5 10:11:58 | 显示全部楼层

赞,学习了,谢谢分享

回复 支持 反对

使用道具 举报

3偶尔光临
234/300
排名
11624
昨日变化
2

0

主题

127

帖子

234

积分

Rank: 3Rank: 3Rank: 3

UID
195197
好友
2
蛮牛币
559
威望
0
注册时间
2016-12-22
在线时间
59 小时
最后登录
2017-5-27
发表于 2017-5-5 10:18:53 | 显示全部楼层
66666666666666

回复

使用道具 举报

排名
776
昨日变化
2

57

主题

502

帖子

2150

积分

Rank: 9Rank: 9Rank: 9

UID
93357
好友
1
蛮牛币
9219
威望
0
注册时间
2015-4-18
在线时间
657 小时
最后登录
2017-5-29

专栏作家认证开发者

QQ
发表于 2017-5-5 10:32:00 | 显示全部楼层
楼主的计时器写的不错
不过看代码是基于Update 去刷新的
即基于游戏每帧刷新的
这如果运行在卡一点的电脑,存在掉帧的情况下,计时器就会出现严重bug

所以用真实时间去计算的话就能完美运行在任何机器上

以上纯属个人意见。

回复 支持 反对

使用道具 举报

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

1

主题

95

帖子

1374

积分

Rank: 6Rank: 6Rank: 6

UID
15956
好友
1
蛮牛币
2013
威望
0
注册时间
2014-2-28
在线时间
390 小时
最后登录
2017-5-27
发表于 2017-5-5 11:04:19 | 显示全部楼层
楼主游戏切换成后台的时候,时间还会跳吗

回复 支持 反对

使用道具 举报

2初来乍到
121/150
排名
9898
昨日变化
3

0

主题

19

帖子

121

积分

Rank: 2Rank: 2

UID
197464
好友
0
蛮牛币
152
威望
0
注册时间
2016-12-30
在线时间
38 小时
最后登录
2017-5-24
发表于 2017-5-5 11:06:16 | 显示全部楼层
感谢感谢,对C#的面向对象认识更深入了一点,非常感谢

回复 支持 反对

使用道具 举报

排名
14816
昨日变化
1

1

主题

11

帖子

49

积分

Rank: 1

UID
208847
好友
1
蛮牛币
52
威望
0
注册时间
2017-2-27
在线时间
11 小时
最后登录
2017-5-12
发表于 2017-5-5 11:06:30 | 显示全部楼层
66666666666

回复

使用道具 举报

3偶尔光临
254/300
排名
7480
昨日变化
2

3

主题

66

帖子

254

积分

Rank: 3Rank: 3Rank: 3

UID
104455
好友
0
蛮牛币
501
威望
0
注册时间
2015-5-30
在线时间
77 小时
最后登录
2017-5-27
QQ
发表于 2017-5-5 11:51:31 | 显示全部楼层


赞,学习了,谢谢分享
[发帖际遇]: LYF111 发帖时在路边捡到 2 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

3偶尔光临
168/300
排名
10446
昨日变化
3

0

主题

68

帖子

168

积分

Rank: 3Rank: 3Rank: 3

UID
122160
好友
0
蛮牛币
370
威望
0
注册时间
2015-9-10
在线时间
40 小时
最后登录
2017-5-27
发表于 2017-5-5 14:22:32 | 显示全部楼层
感谢分享

回复

使用道具 举报

排名
16399
昨日变化
4

0

主题

15

帖子

42

积分

Rank: 1

UID
28456
好友
0
蛮牛币
31
威望
0
注册时间
2014-6-6
在线时间
7 小时
最后登录
2017-5-15
发表于 2017-5-5 15:13:54 | 显示全部楼层
学习了 谢谢楼主分享啊

回复 支持 反对

使用道具 举报

5熟悉之中
843/1000
排名
2483
昨日变化
1

2

主题

158

帖子

843

积分

Rank: 5Rank: 5

UID
28898
好友
0
蛮牛币
1183
威望
0
注册时间
2014-6-9
在线时间
271 小时
最后登录
2017-5-27
发表于 2017-5-5 16:19:00 | 显示全部楼层
update中用delatime,会不准确吧,毕竟帧数保证

回复 支持 反对

使用道具 举报

排名
1998
昨日变化

41

主题

246

帖子

1683

积分

Rank: 9Rank: 9Rank: 9

UID
35466
好友
13
蛮牛币
2434
威望
0
注册时间
2014-7-21
在线时间
522 小时
最后登录
2017-5-27

专栏作家迈向小康

发表于 2017-5-5 17:14:54 | 显示全部楼层
不错,不错,自几动手 ,自立根生,就是TimerManager 这个命名有点大

回复 支持 反对

使用道具 举报

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

本版积分规则

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