模拟游戏中一天的时间
using System;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 模拟时钟(游戏中的天文日)
/// </summary>
public class AstronomicaldayClock : MonoBehaviour
{
//游戏中的一天多少秒
[SerializeField]
private int secondPerDay = 1200;
//当天已过去了多少秒
private int elapsedSecond;
[SerializeField]
private bool m_AwakePlay;
//闹钟字典
private Dictionary<int, Action<int>> alarmClockDic = new Dictionary<int, Action<int>>();
public int Elapsed
{
get { return elapsedSecond; }
set {
elapsedSecond = value;
if (alarmClockDic.ContainsKey(elapsedSecond))
alarmClockDic[elapsedSecond].Invoke(elapsedSecond);
}
}
private void Awake()
{
if (m_AwakePlay)
ResetClock();
}
// 注册闹钟
public void RegisterAlerm(int second, Action<int> callback)
{
if (alarmClockDic.ContainsKey(second))
return;
alarmClockDic[second] = callback;
}
// 注销闹钟
public void UnregisterAlerm(int second)
{
if (!alarmClockDic.ContainsKey(second))
return;
alarmClockDic.Remove(second);
}
// 重置时钟
public void ResetClock()
{
elapsedSecond = 0;
CancelInvoke("OnTimer");
InvokeRepeating("OnTimer", 1, 1);
}
private void OnTimer()
{
elapsedSecond = (elapsedSecond + 1) % secondPerDay;
if (alarmClockDic.ContainsKey(elapsedSecond))
alarmClockDic[elapsedSecond].Invoke(elapsedSecond);
}
private void OnDestroy()
{
CancelInvoke();
alarmClockDic.Clear();
}
}