using System.Collections; using System.Collections.Generic; using UnityEngine; using Cinemachine; public class GameController : MonoBehaviour{ public int level; [Header("SpawnRates")] public Vector2 minSpawnPos; public Vector2 maxSpawnPos; public float standardEnemySpawnRate = 2f; public float circleEnemySpawnRate = 3f; public float bigEnemySpawnRate = 4f; public float rocketEnemySpawnRate = 10f; public float gunSpawnRate = 15f; [HideInInspector] public float actualStandardEnemySpawnRate, actualCircleEnemySpawnRate, actualBigEnemySpawnRate, actualRocketEnemySpawnRate, actualGunSpawnRate; public float spawnRateDivider = .6f; [Header("Car")] public CinemachineVirtualCamera room1Cam; public CinemachineVirtualCamera room2Cam; public CinemachineVirtualCamera room3Cam; public CinemachineVirtualCamera room4Cam; public CameraController cameraController; public float speed; public GameObject car; public GameObject[] checkPoints; Transform target; public Transform player; public HealthBar health; [HideInInspector] public bool ready, playered; bool dead; [Header("Level")] public GameObject[] doors; // Start is called before the first frame update void Start(){ PreFirst(); GetComponent().enabled = false; GetComponent().enabled = false; GetComponent().enabled = false; GetComponent().enabled = false; GetComponent().enabled = false; AudioManager.instance.Stop("MenuTheme"); } // Update is called once per frame void Update(){ if(health.hp <= 0 && dead == false){ car.SetActive(false); ObjectPooler.Instance.SpawnFromPool("CarExplosion", car.transform.position, Quaternion.identity); Camera.main.GetComponent().SetBool("GameOver", true); FindObjectOfType().GameOver(false); AudioManager.instance.Stop("MainTheme"); Time.timeScale = 0f; dead = true; } if(level != 0 && level != 1){ actualBigEnemySpawnRate = bigEnemySpawnRate / (spawnRateDivider * level); actualStandardEnemySpawnRate = standardEnemySpawnRate / (spawnRateDivider * level); actualRocketEnemySpawnRate = rocketEnemySpawnRate / (spawnRateDivider * level); actualCircleEnemySpawnRate = circleEnemySpawnRate / (spawnRateDivider * level); actualGunSpawnRate = gunSpawnRate * (spawnRateDivider / level); }else{ actualBigEnemySpawnRate = bigEnemySpawnRate; actualStandardEnemySpawnRate = standardEnemySpawnRate; actualRocketEnemySpawnRate = rocketEnemySpawnRate; actualCircleEnemySpawnRate = circleEnemySpawnRate; actualGunSpawnRate = gunSpawnRate; } if (playered){ if (second){ minSpawnPos = new Vector2(17, -4); maxSpawnPos = new Vector2(33, 4); GetComponent().enabled = true; GetComponent().enabled = true; GetComponent().enabled = true; GetComponent().enabled = true; GetComponent().enabled = true; room2Cam.gameObject.SetActive(true); cameraController.follow = checkPoints[1].transform; health.time = 0f; Invoke(nameof(Third), 30f); foreach (GameObject d in doors){ d.SetActive(true); } second = false; } if (third){ minSpawnPos = new Vector2(42, -4); maxSpawnPos = new Vector2(58, 4); GetComponent().enabled = true; GetComponent().enabled = true; GetComponent().enabled = true; GetComponent().enabled = true; GetComponent().enabled = true; room3Cam.gameObject.SetActive(true); cameraController.follow = checkPoints[2].transform; health.time = 0f; Invoke(nameof(Fourth), 30f); foreach (GameObject d in doors){ d.SetActive(true); } third = false; } if (fourth){ minSpawnPos = new Vector2(67, -4); maxSpawnPos = new Vector2(83, 4); GetComponent().enabled = true; GetComponent().enabled = true; GetComponent().enabled = true; GetComponent().enabled = true; GetComponent().enabled = true; room4Cam.gameObject.SetActive(true); cameraController.follow = checkPoints[3].transform; health.time = 0f; foreach (GameObject d in doors){ d.SetActive(true); } Invoke(nameof(Fifth), 30f); fourth = false; } if (ableToWin){ Finish(); Camera.main.GetComponent().SetBool("Win", true); Invoke(nameof(WinWin), 0.5f); ableToWin = false; } } } void FixedUpdate(){ if (health.hp > 0){ car.transform.position = Vector2.MoveTowards(car.transform.position, new Vector2(target.position.x + .675f, target.position.y), speed * Time.deltaTime); } } void PreFirst(){ Invoke(nameof(First), 4f); target = checkPoints[0].transform; room1Cam.gameObject.SetActive(true); cameraController.follow = checkPoints[0].transform; } void First(){ AudioManager.instance.Play("MainTheme"); ready = true; GetComponent().enabled = true; GetComponent().enabled = false; GetComponent().enabled = true; GetComponent().enabled = true; GetComponent().enabled = false; Invoke(nameof(Second), 30f); } void Second(){ Finish(); level = 1; foreach(GameObject d in doors){ d.SetActive(false); } room1Cam.gameObject.SetActive(false); room2Cam.gameObject.SetActive(false); room3Cam.gameObject.SetActive(false); room4Cam.gameObject.SetActive(false); cameraController.follow = player; target = checkPoints[1].transform; Invoke(nameof(SecondSecond), 25f); } bool second; void SecondSecond(){ second = true; } void Third(){ Finish(); level = 2; foreach (GameObject d in doors){ d.SetActive(false); } room1Cam.gameObject.SetActive(false); room2Cam.gameObject.SetActive(false); room3Cam.gameObject.SetActive(false); room4Cam.gameObject.SetActive(false); cameraController.follow = player; target = checkPoints[2].transform; Invoke(nameof(ThirdThird), 25f); } bool third; void ThirdThird(){ third = true; } void Fourth(){ Finish(); level = 3; foreach (GameObject d in doors){ d.SetActive(false); } room1Cam.gameObject.SetActive(false); room2Cam.gameObject.SetActive(false); room3Cam.gameObject.SetActive(false); room4Cam.gameObject.SetActive(false); cameraController.follow = player; target = checkPoints[3].transform; Invoke(nameof(FourthFourth), 25f); } bool fourth; void FourthFourth(){ fourth = true; } void Fifth(){ foreach (GameObject d in doors){ d.SetActive(false); } room1Cam.gameObject.SetActive(false); room2Cam.gameObject.SetActive(false); room3Cam.gameObject.SetActive(false); room4Cam.gameObject.SetActive(false); cameraController.follow = player; target = checkPoints[4].transform; Invoke(nameof(Win), 18f); } bool ableToWin; void Win(){ ableToWin = true; } void WinWin(){ Time.timeScale = 0f; FindObjectOfType().GameOver(true); AudioManager.instance.Stop("MainTheme"); } void Finish(){ GetComponent().enabled = false; GetComponent().enabled = false; GetComponent().enabled = false; GetComponent().enabled = false; GetComponent().enabled = false; foreach (GameObject g in GameObject.FindGameObjectsWithTag("Enemy")){ ObjectPooler.Instance.SpawnFromPool("EnemyDeath", g.transform.position, Quaternion.identity); if(g.transform.parent == null){ g.SetActive(false); }else if(g.transform.parent.CompareTag("Enemy")){ g.transform.parent.gameObject.SetActive(false); } } foreach (GameObject g in GameObject.FindGameObjectsWithTag("BigEnemy")){ ObjectPooler.Instance.SpawnFromPool("EnemyDeath", g.transform.position, Quaternion.identity); g.SetActive(false); } foreach (GameObject g in GameObject.FindGameObjectsWithTag("RocketEnemy")){ ObjectPooler.Instance.SpawnFromPool("RocketEnemyDeath", g.transform.position, Quaternion.identity); if (g.transform.parent == null){ g.SetActive(false); }else if (g.transform.parent.CompareTag("RocketEnemy")){ g.transform.parent.gameObject.SetActive(false); } } foreach (GameObject g in GameObject.FindGameObjectsWithTag("CircleEnemy")){ ObjectPooler.Instance.SpawnFromPool("CircleEnemyDeath", g.transform.position, Quaternion.identity); if (g.transform.parent == null){ g.SetActive(false); }else if (g.transform.parent.CompareTag("CircleEnemy")){ g.transform.parent.gameObject.SetActive(false); } } } }