GameManager.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. using System;
  2. using System.Collections;
  3. using System.Linq;
  4. using System.Runtime.CompilerServices;
  5. using TMPro;
  6. using UnityEditor;
  7. using UnityEngine;
  8. using UnityEngine.SceneManagement;
  9. using UnityEngine.SocialPlatforms.Impl;
  10. public class GameManager : MonoBehaviour
  11. {
  12. public int GameOverHour;
  13. public int GameOverMinutes;
  14. private GameData data;
  15. private SaveManager saveManager;
  16. private TimeManager timeManager;
  17. private MapGenerator mapGenerator;
  18. private OrbManager orbManager;
  19. public TMP_Text scoreText;
  20. public Canvas loadingScreen;
  21. private GameObject player;
  22. private int score;
  23. private float tempGameSpeed;
  24. // Start is called once before the first execution of Update after the MonoBehaviour is created
  25. void Start()
  26. {
  27. //Get the player
  28. player = GameObject.Find("Player");
  29. if (player == null) return;
  30. //Get components
  31. saveManager = GetComponent<SaveManager>();
  32. timeManager = GetComponent<TimeManager>();
  33. mapGenerator = GameObject.Find("Map Generator").GetComponent<MapGenerator>();
  34. orbManager = GetComponent<OrbManager>();
  35. data = saveManager.LoadGame();
  36. tempGameSpeed = timeManager.gameSpeed;
  37. timeManager.gameSpeed = 0;
  38. StartCoroutine(DisableLoadingScreen());
  39. if (data.Orbs.Length == 0)
  40. {
  41. StartCoroutine(orbManager.StartSpawn());
  42. }
  43. //reset light settings
  44. RenderSettings.skybox.SetTexture("_Texture1", timeManager.skyboxNight);
  45. RenderSettings.skybox.SetTexture("_Texture2", timeManager.skyboxSunrise);
  46. RenderSettings.skybox.SetFloat("_Blend", 0);
  47. timeManager.globalLight.color = timeManager.gradientNightToSunrise.Evaluate(0);
  48. RenderSettings.fogColor = timeManager.globalLight.color;
  49. if (data != null)
  50. {
  51. SetData();
  52. }
  53. else
  54. {
  55. data = new GameData();
  56. }
  57. }
  58. // Update is called once per frame
  59. void Update()
  60. {
  61. if (Input.GetKeyDown(KeyCode.F5))
  62. {
  63. Save();
  64. }
  65. if (Input.GetKeyDown(KeyCode.F9))
  66. {
  67. //SceneManager.LoadScene("Game");
  68. }
  69. if(timeManager.Hours >= GameOverHour && timeManager.Minutes >= GameOverMinutes)
  70. {
  71. OnGameOver();
  72. }
  73. if (score >= orbManager.orbsToSpawn)
  74. {
  75. OnGameOver();
  76. }
  77. }
  78. void GetData()
  79. {
  80. #region PlayerAndOrbs
  81. data.playerPosition = player.transform.position;
  82. data.playerScore = score;
  83. data.Orbs = GetAllOrbs();
  84. #endregion
  85. #region DaylightCycle
  86. data.minutes = timeManager.Minutes;
  87. data.hours = timeManager.Hours;
  88. data.skybox = RenderSettings.skybox;
  89. data.globalLightColor = timeManager.globalLight.color;
  90. data.globalLightRotation = timeManager.globalLight.transform.rotation;
  91. #endregion
  92. #region Stamina
  93. data.currentStamina = player.GetComponent<Stamina>().GetCurrentStamina();
  94. data.canSprint = player.GetComponent<Stamina>().GetCanSprint();
  95. #endregion
  96. #region MapGeneration
  97. data.seed = mapGenerator.noiseData.seed;
  98. #endregion
  99. }
  100. void SetData()
  101. {
  102. #region PlayerAndOrbs
  103. if (data.playerPosition != Vector3.zero)
  104. {
  105. player.transform.position = data.playerPosition;
  106. }
  107. else
  108. {
  109. StartCoroutine(SpawnPlayer());
  110. }
  111. score = data.playerScore;
  112. UpdateUI();
  113. SpawnOrbs();
  114. #endregion
  115. #region DaylightCycle
  116. timeManager.Minutes = data.minutes;
  117. timeManager.Hours = data.hours;
  118. if (data.skybox != null)
  119. RenderSettings.skybox = data.skybox;
  120. if (data.globalLightColor != null)
  121. {
  122. timeManager.globalLight.color = data.globalLightColor;
  123. RenderSettings.fogColor = data.globalLightColor;
  124. }
  125. if (data.globalLightRotation != null)
  126. timeManager.globalLight.transform.rotation = data.globalLightRotation;
  127. #endregion
  128. #region Stamina
  129. if (data.skybox != null) //because !
  130. player.GetComponent<Stamina>().Reinit(data.currentStamina, data.canSprint);
  131. #endregion
  132. #region MapGeneration
  133. mapGenerator.noiseData.seed = data.seed;
  134. #endregion
  135. }
  136. IEnumerator DisableLoadingScreen()
  137. {
  138. yield return new WaitForSeconds(5);
  139. loadingScreen.enabled = false;
  140. timeManager.gameSpeed = tempGameSpeed;
  141. }
  142. IEnumerator SpawnPlayer()
  143. {
  144. yield return new WaitForSeconds(3);
  145. Vector3 rayStart = Vector3.zero + Vector3.up * 300;
  146. if (Physics.Raycast(rayStart, Vector3.down, out RaycastHit hit, 600f))
  147. {
  148. player.transform.position = hit.point + new Vector3(0f, 1f, 0f);
  149. }
  150. }
  151. private void SpawnOrbs()
  152. {
  153. for (int i = 0; i < data.Orbs.Length; i++) {
  154. Instantiate(orbManager.prefab, data.Orbs[i], Quaternion.identity);
  155. }
  156. }
  157. private Vector3[] GetAllOrbs()
  158. {
  159. string targetName = "Orb(Clone)";
  160. var actors = FindObjectsByType<GameObject>(FindObjectsSortMode.None)
  161. .Where(obj => obj.name == targetName)
  162. .ToArray();
  163. Vector3[] orbs = new Vector3[actors.Length];
  164. for (int i = 0; i < actors.Length; i++)
  165. {
  166. orbs[i] = actors[i].transform.position;
  167. }
  168. return orbs;
  169. }
  170. public void Save()
  171. {
  172. GetData();
  173. saveManager.SaveGame(data);
  174. }
  175. public void IncreaseScore()
  176. {
  177. score++;
  178. UpdateUI();
  179. }
  180. private void UpdateUI()
  181. {
  182. scoreText.text = score.ToString();
  183. }
  184. private void OnGameOver()
  185. {
  186. Save();
  187. SceneManager.LoadScene("EndScreen");
  188. }
  189. }