GameManager.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. using System.Collections;
  2. using TMPro;
  3. using Unity.PlasticSCM.Editor.WebApi;
  4. using UnityEditor.UI;
  5. using UnityEngine;
  6. using UnityEngine.Rendering;
  7. using UnityEngine.SceneManagement;
  8. using UnityEngine.UI;
  9. public class GameManager : MonoBehaviour
  10. {
  11. public enum GameState
  12. {
  13. InMainMenu,
  14. Paused,
  15. Playing,
  16. GameOver,
  17. Won
  18. }
  19. //private PlayerData playerData;
  20. //private SaveManager saveManager;
  21. public static GameManager gameManagerInstance { get; private set; }
  22. [SerializeField] AudioSource audioSource;
  23. [SerializeField] int currentOrbCounter;
  24. [SerializeField] int maximumOrbs;
  25. public GenerateOrbs generator;
  26. public TMP_InputField userSeed;
  27. public int seed;
  28. [SerializeField] TextMeshProUGUI orbCounterText;
  29. private float initialTime;
  30. [SerializeField] float timeUntilNightfall;
  31. [SerializeField] TextMeshProUGUI timerText;
  32. public bool bHasTimerStarted;
  33. [SerializeField] GameObject player;
  34. [SerializeField] Transform playerTransform;
  35. public bool bHasPlayerLanded;
  36. public bool bIsGameStarted = false;
  37. public GameState gameState = GameState.InMainMenu;
  38. private void Awake()
  39. {
  40. if(gameManagerInstance == null)
  41. {
  42. gameManagerInstance = this;
  43. initialTime = timeUntilNightfall;
  44. SceneManager.sceneLoaded += OnSceneLoaded;
  45. //saveManager = GetComponent<SaveManager>();
  46. //playerData = saveManager.LoadGame();
  47. /*if (playerData != null)
  48. {
  49. SetPlayerData();
  50. }
  51. else
  52. {
  53. playerData = new PlayerData();
  54. }*/
  55. DontDestroyOnLoad(gameObject);
  56. }
  57. else
  58. {
  59. Destroy(gameObject);
  60. }
  61. }
  62. private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
  63. {
  64. if(scene.name == "MainMap")
  65. {
  66. bIsGameStarted = false;
  67. audioSource.mute = false;
  68. currentOrbCounter = 0;
  69. timeUntilNightfall = initialTime;
  70. playerTransform = GameObject.Find("Player").transform;
  71. player = GameObject.Find("Player");
  72. GameObject orbObject = GameObject.Find("Orb_Text");
  73. if (orbObject)
  74. {
  75. orbCounterText = orbObject.GetComponent<TextMeshProUGUI>();
  76. }
  77. GameObject timerObject = GameObject.Find("Timer");
  78. if (timerObject)
  79. {
  80. timerText = timerObject.GetComponent<TextMeshProUGUI>();
  81. }
  82. StartCoroutine(WaitAndSpawnOrbs());
  83. UpdateOrbUI();
  84. UpdateTimerUI();
  85. }
  86. else if(scene.name == "MainMenu")
  87. {
  88. if (audioSource.mute)
  89. {
  90. audioSource.mute = false;
  91. }
  92. currentOrbCounter = 0;
  93. timeUntilNightfall = initialTime;
  94. userSeed = GameObject.Find("SeedField").GetComponent<TMP_InputField>();
  95. }
  96. else if(scene.name == "VictoryScene")
  97. {
  98. audioSource.mute = true;
  99. currentOrbCounter = 0;
  100. timeUntilNightfall = initialTime;
  101. }
  102. else if(scene.name == "GameOverScene")
  103. {
  104. audioSource.mute = true;
  105. currentOrbCounter = 0;
  106. timeUntilNightfall = initialTime;
  107. }
  108. }
  109. IEnumerator WaitAndSpawnOrbs()
  110. {
  111. yield return null;
  112. yield return new WaitForFixedUpdate();
  113. generator = GetComponent<GenerateOrbs>();
  114. if (generator) generator.StartGenerating(playerTransform);
  115. }
  116. private void Update()
  117. {
  118. if (gameState == GameState.Playing && !bHasPlayerLanded)
  119. {
  120. if (playerTransform != null)
  121. {
  122. if (Physics.Raycast(playerTransform.position, Vector3.down, out RaycastHit hit, 2f))
  123. {
  124. if (hit.collider.CompareTag("Floor"))
  125. {
  126. bHasPlayerLanded = true;
  127. }
  128. }
  129. }
  130. }
  131. if (gameState == GameState.Playing && bIsGameStarted)
  132. {
  133. HandleTimer();
  134. }
  135. }
  136. private void HandleTimer()
  137. {
  138. if(timeUntilNightfall > 0)
  139. {
  140. timeUntilNightfall -= Time.deltaTime;
  141. UpdateTimerUI();
  142. }
  143. else
  144. {
  145. timeUntilNightfall = 0;
  146. GameOver();
  147. }
  148. }
  149. private void UpdateTimerUI()
  150. {
  151. if (timerText)
  152. {
  153. int minutes = Mathf.FloorToInt(timeUntilNightfall / 60);
  154. int seconds = Mathf.FloorToInt(timeUntilNightfall % 60);
  155. timerText.text = string.Format("{0:00}:{1:00}", minutes, seconds);
  156. }
  157. }
  158. public void IncreaseOrbCounter()
  159. {
  160. currentOrbCounter++;
  161. UpdateOrbUI();
  162. CheckAllOrbsCollected();
  163. }
  164. private void UpdateOrbUI()
  165. {
  166. if(orbCounterText != null)
  167. {
  168. orbCounterText.text = currentOrbCounter + "/" + maximumOrbs;
  169. }
  170. }
  171. private void CheckAllOrbsCollected()
  172. {
  173. if(currentOrbCounter >= maximumOrbs)
  174. {
  175. gameState = GameState.Won;
  176. SceneManager.LoadScene("VictoryScene");
  177. }
  178. }
  179. private void GameOver()
  180. {
  181. gameState = GameState.GameOver;
  182. SceneManager.LoadScene("GameOverScene");
  183. }
  184. public void StartGame()
  185. {
  186. gameState = GameState.Playing;
  187. bHasPlayerLanded = false;
  188. if (userSeed != null)
  189. {
  190. //PlayerData playerData = new PlayerData();
  191. if (!int.TryParse(userSeed.text, out int number))
  192. {
  193. System.Random randomSeed = new System.Random();
  194. seed = randomSeed.Next();
  195. }
  196. else
  197. {
  198. seed = number;
  199. }
  200. }
  201. else
  202. {
  203. System.Random randomSeed = new System.Random();
  204. seed = randomSeed.Next();
  205. }
  206. //saveManager.SaveGame(playerData);
  207. SceneManager.LoadScene("MainMap");
  208. }
  209. /* public void LoadGame()
  210. {
  211. PlayerData playerData = saveManager.LoadGame();
  212. if(playerData != null)
  213. {
  214. SceneManager.LoadScene("MainMap");
  215. }
  216. else
  217. {
  218. Debug.LogError("No save found");
  219. }
  220. }*/
  221. public void GoBackToMainMenu()
  222. {
  223. gameState = GameState.InMainMenu;
  224. SceneManager.LoadScene("MainMenu");
  225. }
  226. public int GetMaximumOrbs()
  227. {
  228. return maximumOrbs;
  229. }
  230. /* void GetPlayerData()
  231. {
  232. if(player != null)
  233. {
  234. playerData.playerPosition = player.transform.position;
  235. }
  236. playerData.numberOfOrbsCollected = currentOrbCounter;
  237. //playerData.orbs = generator.orbs;
  238. }*/
  239. /* void SetPlayerData()
  240. {
  241. if(playerData.playerPosition != Vector3.zero && player != null)
  242. {
  243. player.transform.position = playerData.playerPosition;
  244. }
  245. currentOrbCounter = playerData.numberOfOrbsCollected;
  246. UpdateOrbUI();
  247. }*/
  248. /* public void SaveData()
  249. {
  250. GetPlayerData();
  251. saveManager.SaveGame(playerData);
  252. }*/
  253. }