首页 > 其他 > 详细

游戏简单控制逻辑Clock类

时间:2015-03-23 23:53:06      阅读:377      评论:0      收藏:0      [点我收藏+]

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<IClockListener> 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<IClockListener>();
			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[i].OnTimeOut();
				}
			}
		}
		// 判断是否发生秒的改变
		private void CheckIfTimeInSecondsChanged()
		{
			var newTimeInSeonds = (int)time;

			if (newTimeInSeonds == timeInSeconds) return;
		
			timeInSeconds = newTimeInSeonds;

			for (int i = 0;i< listeners.Count;i++)
			{
				listeners[i].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
	}
}

还不错吧!



??

游戏简单控制逻辑Clock类

原文:http://blog.csdn.net/u010019717/article/details/44572835

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!