游戏天文日时钟

作者:追风剑情 发布于:2022-6-30 12:17 分类:Unity3d

模拟游戏中一天的时间

  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. /// <summary>
  5. /// 模拟时钟(游戏中的天文日)
  6. /// </summary>
  7. public class AstronomicaldayClock : MonoBehaviour
  8. {
  9. //游戏中的一天多少秒
  10. [SerializeField]
  11. private int secondPerDay = 1200;
  12. //当天已过去了多少秒
  13. private int elapsedSecond;
  14. [SerializeField]
  15. private bool m_AwakePlay;
  16. //闹钟字典
  17. private Dictionary<int, Action<int>> alarmClockDic = new Dictionary<int, Action<int>>();
  18.  
  19. public int Elapsed
  20. {
  21. get { return elapsedSecond; }
  22. set {
  23. elapsedSecond = value;
  24. if (alarmClockDic.ContainsKey(elapsedSecond))
  25. alarmClockDic[elapsedSecond].Invoke(elapsedSecond);
  26. }
  27. }
  28.  
  29. private void Awake()
  30. {
  31. if (m_AwakePlay)
  32. ResetClock();
  33. }
  34.  
  35. // 注册闹钟
  36. public void RegisterAlerm(int second, Action<int> callback)
  37. {
  38. if (alarmClockDic.ContainsKey(second))
  39. return;
  40. alarmClockDic[second] = callback;
  41. }
  42.  
  43. // 注销闹钟
  44. public void UnregisterAlerm(int second)
  45. {
  46. if (!alarmClockDic.ContainsKey(second))
  47. return;
  48. alarmClockDic.Remove(second);
  49. }
  50.  
  51. // 重置时钟
  52. public void ResetClock()
  53. {
  54. elapsedSecond = 0;
  55. CancelInvoke("OnTimer");
  56. InvokeRepeating("OnTimer", 1, 1);
  57. }
  58.  
  59. private void OnTimer()
  60. {
  61. elapsedSecond = (elapsedSecond + 1) % secondPerDay;
  62. if (alarmClockDic.ContainsKey(elapsedSecond))
  63. alarmClockDic[elapsedSecond].Invoke(elapsedSecond);
  64. }
  65.  
  66. private void OnDestroy()
  67. {
  68. CancelInvoke();
  69. alarmClockDic.Clear();
  70. }
  71. }

标签: Unity3d

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号