DayTimeManager.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public enum RotationAxis
  5. {
  6. X, Y
  7. }
  8. public class DayTimeManager : MonoBehaviour
  9. {
  10. public Light sunlight;
  11. public float secondsPerDay;
  12. public Color MorningColor;
  13. public Color NoonColor;
  14. public Color EveningColor;
  15. public Color NightColor;
  16. public float maxAngle = 50.0f;
  17. private float _elapsedTime;
  18. public float timeFactor
  19. {
  20. get
  21. {
  22. return _elapsedTime / secondsPerDay;
  23. }
  24. }
  25. public AnimationCurve colorCurve;
  26. public float dayTime;
  27. float _morningStartFactor;
  28. float _noonStartFactor;
  29. float _eveningStartFactor;
  30. float _nightStartFactor;
  31. public float morningStartTime = 8.0f;
  32. public float noonStartTime = 11.0f;
  33. public float eveningStartTime = 17.0f;
  34. public float nightStartTime = 20.0f;
  35. public DayTimeLabel startTime = DayTimeLabel.Noon;
  36. public DayTimeLabel dayTimeLabel = DayTimeLabel.Night;
  37. private float _timeDirection = 1.0f;
  38. private Vector3 _position;
  39. private Vector3 _rotation;
  40. void Awake()
  41. {
  42. }
  43. // Use this for initialization
  44. void Start()
  45. {
  46. _morningStartFactor = morningStartTime / 24.0f;
  47. _noonStartFactor = noonStartTime / 24.0f;
  48. _eveningStartFactor = eveningStartTime / 24.0f;
  49. _nightStartFactor = nightStartTime / 24.0f;
  50. switch (startTime)
  51. {
  52. case DayTimeLabel.Morning:
  53. {
  54. _elapsedTime = _morningStartFactor * secondsPerDay;
  55. }
  56. break;
  57. case DayTimeLabel.Noon:
  58. {
  59. _elapsedTime = _noonStartFactor * secondsPerDay;
  60. }
  61. break;
  62. case DayTimeLabel.Evening:
  63. {
  64. _elapsedTime = _eveningStartFactor * secondsPerDay;
  65. }
  66. break;
  67. case DayTimeLabel.Night:
  68. {
  69. _elapsedTime = _nightStartFactor * secondsPerDay;
  70. }
  71. break;
  72. }
  73. _position = sunlight.gameObject.transform.position;
  74. _rotation = sunlight.gameObject.transform.rotation.eulerAngles;
  75. }
  76. // Update is called once per frame
  77. void Update()
  78. {
  79. _elapsedTime += Time.deltaTime;
  80. if (_elapsedTime >= secondsPerDay)
  81. {
  82. _elapsedTime = 0;
  83. }
  84. float intensityAngle = this.timeFactor * Mathf.PI;
  85. sunlight.intensity = Mathf.Sin(intensityAngle);
  86. float rotationDirection = (this.timeFactor - 0.5f) * 2;
  87. // Debug.Log("DayTimeLabel: " + dayTimeLabel.ToString());
  88. sunlight.gameObject.transform.rotation = Quaternion.Euler(_rotation.x + rotationDirection * maxAngle, _rotation.y + rotationDirection * maxAngle, _rotation.z);
  89. // Debug.Log("Rotate around x: " + (_rotation.x + rotationDirection * maxAngle));
  90. Color resultColor = Color.white;
  91. if (timeFactor >= _morningStartFactor && timeFactor < _noonStartFactor)
  92. {
  93. float morningFactor = (timeFactor - _morningStartFactor) / (_noonStartFactor - _morningStartFactor);
  94. resultColor = Color.Lerp(MorningColor, NoonColor, colorCurve.Evaluate(morningFactor));
  95. dayTimeLabel = DayTimeLabel.Morning;
  96. }
  97. if (timeFactor >= _noonStartFactor && timeFactor < _eveningStartFactor)
  98. {
  99. float noonFactor = (timeFactor - _noonStartFactor) / (_eveningStartFactor - _noonStartFactor);
  100. resultColor = Color.Lerp(NoonColor, EveningColor, colorCurve.Evaluate(noonFactor));
  101. dayTimeLabel = DayTimeLabel.Noon;
  102. }
  103. if (timeFactor >= _eveningStartFactor && timeFactor < _nightStartFactor)
  104. {
  105. float eveningFactor = (timeFactor - _eveningStartFactor) / (_nightStartFactor - _eveningStartFactor);
  106. resultColor = Color.Lerp(EveningColor, NightColor, colorCurve.Evaluate(eveningFactor));
  107. dayTimeLabel = DayTimeLabel.Evening;
  108. }
  109. if (timeFactor >= _nightStartFactor && timeFactor < 1.0f)
  110. {
  111. float nightFactor1 = (timeFactor - _nightStartFactor) / ((1.0f - _nightStartFactor) + _morningStartFactor);
  112. resultColor = Color.Lerp(NightColor, MorningColor, colorCurve.Evaluate(nightFactor1));
  113. dayTimeLabel = DayTimeLabel.Night;
  114. }
  115. if (timeFactor >= 0 && timeFactor < _morningStartFactor)
  116. {
  117. float nightFactor2 = (timeFactor + (1.0f - _nightStartFactor)) / ((1.0f - _nightStartFactor) + _morningStartFactor);
  118. resultColor = Color.Lerp(NightColor, MorningColor, colorCurve.Evaluate(nightFactor2));
  119. dayTimeLabel = DayTimeLabel.Night;
  120. }
  121. sunlight.color = resultColor;
  122. dayTime = timeFactor * 24.0f;
  123. }
  124. float FactorToDayTime(float factor)
  125. {
  126. return factor * 24.0f;
  127. }
  128. float DayTimeToFactor(float dayTime)
  129. {
  130. return dayTime / 24.0f;
  131. }
  132. }