查看: 3504|回复: 1

[脚本] unity教程-自定义Clock定时器类

[复制链接]

28

主题

31

听众

285

积分

小学生

Rank: 2

升级   28.33%

发表于 2015-11-3 17:11 |显示全部楼层
共享资源获取更多积分!充值费用主要用于网站发展及插件购买,致力于为游戏开发爱好者提供一流的交流平台,请支持正版!
这篇Unity 教程我们来学习下自定义Clock定时器类!
unity中有协程可以提供延迟的功能等。 但是很多时候我们并不想使用,那就自己在Update中控制时间呗。
于是我封装了这个类。
若要使用这个时钟,首先将其实例化,调用Reset函数设置正确的时间值,调用Update每一帧更新。
任何想要被事件通知的类需要实现 IClockListener 接口,
和使用AddListener方法订阅事件。可以用RemoveListener移除侦听器(很强大吧!)
时钟能够使用Pause方法独立于 Time.timeScale 被暂停 (和使用 Unpause恢复继续)
using System.Collections.Generic;
namespace Gamelogic
{
public class Clock
{
private float time;
private int timeInSeconds;
private readonly List listeners; // 监听列表
#region
public bool IsPaused
{
get; private set;
}
public bool IsDone
{
get; private set;
}
public float Time
{
get
{
return time;
}
}
public int TimeInSeconds
{
get
{
return timeInSeconds;
}
}
#endregion
// 构造函数
public Clock()
{
listeners = new List();
IsPaused = true;
Reset(0);
}
public void AddClockListener(IClockListener listener)
{
listeners.Add(listener);
}
public void RemoveClockListener(IClockListener listener)
{
listeners.Remove(listener);
}
public void Reset(float startTime)
{
time = startTime;
IsDone = false;
CheckIfTimeInSecondsChanged();
}
public void Unpause()
{
IsPaused = false;
}
public void Pause()
{
IsPaused = true;
}
// 时间每帧更新
public void Update()
{
if (IsPaused) return;
if (IsDone) return;
time -= UnityEngine.Time.deltaTime;
CheckIfTimeInSecondsChanged();
if (time <= 0)
{
time = 0;
IsDone = true;
for (int i = 0;i< listeners.Count;i++)
{
listeners.OnTimeOut();
}
}
}
// 判断是否发生秒的改变
private void CheckIfTimeInSecondsChanged()
{
var newTimeInSeonds = (int)time;
if (newTimeInSeonds == timeInSeconds) return;
timeInSeconds = newTimeInSeonds;
for (int i = 0;i< listeners.Count;i++)
{
listeners.OnSecondsChanged(timeInSeconds);
}
}
}
// 时钟监听者类型接口
public interface IClockListener
{
void OnSecondsChanged(int seconds);
void OnTimeOut();
}
}
然后我简单测试了一下,在unity4.6中。 如下倒计时:
下面是客户端测试代码
using UnityEngine.UI;
namespace Gamelogic.Examples
{
public class ClockTest : IClockListener
{
public Text clockText;
public Text messageText;
private Clock clock; // 时钟对象
public void Start()
{
clock = new Clock();
clock.AddClockListener(this); // 对时钟监听
Reset();
}
public void Update()
{
clock.Update();
}
public void Pause()
{
clock.Pause();
}
public void Unpause()
{
clock.Unpause();
}
public void Reset()
{
clock.Reset(5);
clock.Unpause();
}
#region IClockListener methods // 实现接口方法
public void OnSecondsChanged(int seconds)
{
clockText.text = clock.TimeInSeconds.ToString();
}
public void OnTimeOut()
{
messageText.gameObject.SetActive(true);
}
#endregion
}
}
资源地址: http://cg.silucg.com/dongman/unity3d/7980.html (分享请保留)

本帖子中包含更多资源

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

楼主热帖

0

主题

30

听众

25

积分

问题学生

Rank: 1

升级   12.5%

发表于 2016-7-6 00:50 |显示全部楼层

膜拜中。。。。
回复

使用道具 举报

0

主题

12

听众

202

积分

小学生

Rank: 2

升级   0.67%

发表于 2017-3-7 14:05 |显示全部楼层
很不错
回复

使用道具 举报

0

主题

13

听众

203

积分

小学生

Rank: 2

升级   1%

发表于 2017-3-7 14:20 |显示全部楼层
好帖就是要顶
回复

使用道具 举报

0

主题

12

听众

206

积分

小学生

Rank: 2

升级   2%

发表于 2017-3-7 13:56 |显示全部楼层
说的非常好
回复

使用道具 举报

0

主题

12

听众

206

积分

小学生

Rank: 2

升级   2%

发表于 2017-3-7 13:44 |显示全部楼层
不错不错
回复

使用道具 举报

0

主题

30

听众

201

积分

小学生

Rank: 2

升级   0.33%

发表于 2017-3-7 13:32 |显示全部楼层
LZ真是人才
回复

使用道具 举报

0

主题

30

听众

200

积分

小学生

Rank: 2

升级   0%

发表于 2017-3-12 21:05 |显示全部楼层
很不错
回复

使用道具 举报

0

主题

30

听众

200

积分

小学生

Rank: 2

升级   0%

发表于 2017-3-12 21:48 |显示全部楼层
好帖就是要顶
回复

使用道具 举报

0

主题

30

听众

203

积分

小学生

Rank: 2

升级   1%

发表于 2017-3-12 21:32 |显示全部楼层
真心顶
回复

使用道具 举报

温馨提示:求助请到“Unity技术讨论”版块中发帖,便于集中解决!
您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐 上一条 /1 下一条

Unity3D游戏开发联盟(资源共享平台) -Unity3D,Unreal ( 粤ICP备20003399号 )

GMT+8, 2020-8-9 15:49 , Processed in 0.116749 second(s), 37 queries .