模拟游戏中一天的时间
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(); } }