路丝丝 发表于 2015-11-3 17:11

unity教程-自定义Clock定时器类

这篇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 (分享请保留)

Tsup 发表于 2016-7-6 00:50


膜拜中。。。。

714806858 发表于 2017-3-7 14:05

很不错

wk8981018 发表于 2017-3-7 14:20

好帖就是要顶

lmgeg874 发表于 2017-3-7 13:56

说的非常好

lmgeg874 发表于 2017-3-7 13:44

不错不错

shadow87 发表于 2017-3-7 13:32

LZ真是人才

zzjxb 发表于 2017-3-12 21:05

很不错

zzjxb 发表于 2017-3-12 21:48

好帖就是要顶

wsffx13 发表于 2017-3-12 21:32

真心顶
页: [1]
查看完整版本: unity教程-自定义Clock定时器类