using System; using System.Collections; using System.Linq; using TMPro; using UnityEditor; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.SocialPlatforms.Impl; public class GameManager : MonoBehaviour { public int GameOverHour; public int GameOverMinutes; private GameData data; private SaveManager saveManager; private TimeManager timeManager; private MapGenerator mapGenerator; private OrbManager orbManager; public TMP_Text UI; private GameObject player; private int score; // Start is called once before the first execution of Update after the MonoBehaviour is created void Start() { //Get the player player = GameObject.Find("Player"); if (player == null) return; //Get components saveManager = GetComponent(); timeManager = GetComponent(); mapGenerator = GameObject.Find("Map Generator").GetComponent(); orbManager = GetComponent(); data = saveManager.LoadGame(); if (data.Orbs.Length == 0) { StartCoroutine(orbManager.StartSpawn()); } //reset light settings RenderSettings.skybox.SetTexture("_Texture1", timeManager.skyboxNight); RenderSettings.skybox.SetTexture("_Texture2", timeManager.skyboxSunrise); RenderSettings.skybox.SetFloat("_Blend", 0); timeManager.globalLight.color = timeManager.gradientNightToSunrise.Evaluate(0); RenderSettings.fogColor = timeManager.globalLight.color; if (data != null) { SetData(); } else { data = new GameData(); } } // Update is called once per frame void Update() { if (Input.GetKeyDown(KeyCode.F5)) { Save(); } if (Input.GetKeyDown(KeyCode.F9)) { //SceneManager.LoadScene("Game"); } if(timeManager.Hours >= GameOverHour && timeManager.Minutes >= GameOverMinutes) { OnGameOver(); } if (score >= orbManager.orbsToSpawn) { OnGameOver(); } } void GetData() { #region PlayerAndOrbs data.playerPosition = player.transform.position; data.playerScore = score; data.Orbs = GetAllOrbs(); #endregion #region DaylightCycle data.minutes = timeManager.Minutes; data.hours = timeManager.Hours; data.skybox = RenderSettings.skybox; data.globalLightColor = timeManager.globalLight.color; data.globalLightRotation = timeManager.globalLight.transform.rotation; #endregion #region Stamina data.currentStamina = player.GetComponent().GetCurrentStamina(); data.canSprint = player.GetComponent().GetCanSprint(); #endregion #region MapGeneration data.seed = mapGenerator.noiseData.seed; #endregion } void SetData() { #region PlayerAndOrbs if (data.playerPosition != Vector3.zero) { player.transform.position = data.playerPosition; } else { StartCoroutine(SpawnPlayer()); } score = data.playerScore; UpdateUI(); SpawnOrbs(); #endregion #region DaylightCycle timeManager.Minutes = data.minutes; timeManager.Hours = data.hours; if (data.skybox != null) RenderSettings.skybox = data.skybox; if (data.globalLightColor != null) { timeManager.globalLight.color = data.globalLightColor; RenderSettings.fogColor = data.globalLightColor; } if (data.globalLightRotation != null) timeManager.globalLight.transform.rotation = data.globalLightRotation; #endregion #region Stamina if (data.skybox != null) //because ! player.GetComponent().Reinit(data.currentStamina, data.canSprint); #endregion #region MapGeneration mapGenerator.noiseData.seed = data.seed; #endregion } IEnumerator SpawnPlayer() { yield return new WaitForSeconds(3); Vector3 rayStart = Vector3.zero + Vector3.up * 300; if (Physics.Raycast(rayStart, Vector3.down, out RaycastHit hit, 600f)) { player.transform.position = hit.point + new Vector3(0f, 1f, 0f); } } private void SpawnOrbs() { for (int i = 0; i < data.Orbs.Length; i++) { Instantiate(orbManager.prefab, data.Orbs[i], Quaternion.identity); } } private Vector3[] GetAllOrbs() { string targetName = "Orb(Clone)"; var actors = FindObjectsByType(FindObjectsSortMode.None) .Where(obj => obj.name == targetName) .ToArray(); Vector3[] orbs = new Vector3[actors.Length]; for (int i = 0; i < actors.Length; i++) { orbs[i] = actors[i].transform.position; } return orbs; } public void Save() { GetData(); saveManager.SaveGame(data); } public void IncreaseScore() { score++; UpdateUI(); } private void UpdateUI() { UI.text = score.ToString(); } private void OnGameOver() { Save(); SceneManager.LoadScene("EndScreen"); } }