找回密码
 立即注册
查看: 6311|回复: 101

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

[复制链接]
发表于 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 (分享请保留)

本帖子中包含更多资源

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

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

膜拜中。。。。
发表于 2017-3-7 14:05 | 显示全部楼层
很不错
发表于 2017-3-7 14:20 | 显示全部楼层
好帖就是要顶
发表于 2017-3-7 13:56 | 显示全部楼层
说的非常好
发表于 2017-3-7 13:44 | 显示全部楼层
不错不错
发表于 2017-3-7 13:32 | 显示全部楼层
LZ真是人才
发表于 2017-3-12 21:05 | 显示全部楼层
很不错
发表于 2017-3-12 21:48 | 显示全部楼层
好帖就是要顶
发表于 2017-3-12 21:32 | 显示全部楼层
真心顶
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-23 00:28 , Processed in 0.097953 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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