TimeManager.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using System;
  2. using System.Collections;
  3. using UnityEngine;
  4. public class TimeManager : MonoBehaviour
  5. {
  6. public float gameSpeed = 1f;
  7. public Texture2D skyboxNight;
  8. public Texture2D skyboxSunrise;
  9. public Texture2D skyboxDay;
  10. public Texture2D skyboxSunset;
  11. public Gradient gradientNightToSunrise;
  12. public Gradient gradientSunriseToDay;
  13. public Gradient gradientDayToSunset;
  14. public Gradient gradientSunsetToNight;
  15. public Light globalLight;
  16. public int minutes;
  17. public int Minutes { get { return minutes; } set { minutes = value; OnMinutesChanged(value); } }
  18. public int hours;
  19. public int Hours { get { return hours; } set { hours = value; OnHoursChanged(value); } }
  20. public int days;
  21. public int Days { get { return days; } set { days = value; } }
  22. public float tempSecond;
  23. // Start is called once before the first execution of Update after the MonoBehaviour is created
  24. void Start()
  25. {
  26. }
  27. // Update is called once per frame
  28. void Update()
  29. {
  30. tempSecond += Time.deltaTime * gameSpeed;
  31. if(tempSecond >= 1)
  32. {
  33. Minutes++;
  34. tempSecond--;
  35. }
  36. }
  37. private void OnMinutesChanged(float value)
  38. {
  39. globalLight.transform.Rotate(Vector3.up, (1f / 1440f) * 360f, Space.World);
  40. if(value >= 60)
  41. {
  42. Hours++;
  43. Minutes -= 60;
  44. }
  45. if (Hours >= 24)
  46. {
  47. Hours -= 24;
  48. Days++;
  49. }
  50. }
  51. private void OnHoursChanged(float value)
  52. {
  53. switch (value)
  54. {
  55. case 6:
  56. StartCoroutine(LerpSkybox(skyboxNight, skyboxSunrise, 10f));
  57. StartCoroutine(LerpLight(gradientNightToSunrise, 10f));
  58. break;
  59. case 10:
  60. StartCoroutine(LerpSkybox(skyboxSunrise, skyboxDay, 10f));
  61. StartCoroutine(LerpLight(gradientSunriseToDay, 10f));
  62. break;
  63. case 18:
  64. StartCoroutine(LerpSkybox(skyboxDay, skyboxSunset, 10f));
  65. StartCoroutine(LerpLight(gradientDayToSunset, 10f));
  66. break;
  67. case 22:
  68. StartCoroutine(LerpSkybox(skyboxSunset, skyboxNight, 10f));
  69. StartCoroutine(LerpLight(gradientSunsetToNight, 10f));
  70. break;
  71. }
  72. }
  73. private IEnumerator LerpSkybox(Texture2D a, Texture2D b, float time)
  74. {
  75. RenderSettings.skybox.SetTexture("_Texture1", a);
  76. RenderSettings.skybox.SetTexture("_Texture2", b);
  77. RenderSettings.skybox.SetFloat("_Blend", 0);
  78. for (float i=0; i < time; i += Time.deltaTime)
  79. {
  80. RenderSettings.skybox.SetFloat("_Blend", i / time);
  81. yield return null;
  82. }
  83. RenderSettings.skybox.SetTexture("_Texture1", b);
  84. }
  85. private IEnumerator LerpLight(Gradient lightGradient, float time)
  86. {
  87. for (float i = 0; i < time; i += Time.deltaTime)
  88. {
  89. globalLight.color = lightGradient.Evaluate(i / time);
  90. RenderSettings.fogColor = globalLight.color;
  91. yield return null;
  92. }
  93. }
  94. }