using Cinemachine; using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.Events; [System.Serializable] public class StartGame : UnityEvent { } public class GameController : MonoBehaviour{ [SerializeField] Vector3 playerStartPos = Vector3.zero; [Space] public int numberOfCoins; [SerializeField] TextMeshProUGUI coinsText = default; [Space] [SerializeField] Vector3 spawnerExitPosition = Vector3.zero; public List spawnerPositions; List deadEnemies; [SerializeField, Range(0f, 15f)] float timeBetweenSpawns = 7.5f; float currentTime; int currentEnemy; public List enemies = new List(); [HideInInspector] public StartGame onStart; bool started; [SerializeField] CinemachineVirtualCamera dollyTrackCamera = default; [SerializeField, Range(.1f, 5f)] float timeToStart = 3f; // Start is called before the first frame update void Start(){ limboEnemies = new List(); deadEnemies = new List(); currentTime = timeBetweenSpawns - 2; AudioManager.instance.Stop("Menu"); AudioManager.instance.Play("Intro"); StartCoroutine(StartGame()); } List limboEnemies; public void EnemyDeath(EnemyController enemy){ enemy.gameObject.SetActive(false); foreach(Vector3 spawnPos in spawnerPositions){ deadEnemies.Add(enemy); enemy.transform.position = spawnPos + Vector3.up; spawnerPositions.Remove(spawnPos); StartCoroutine(RespawnEnemy(enemy)); break; } } public void PlayerDeath(PlayerController player){ player.gameObject.SetActive(false); player.transform.position = playerStartPos; player.Respawn(); player.gameObject.SetActive(true); for (int i = 0; i < spawnerPositions.Count; i++){ enemies[i].gameObject.SetActive(false); enemies[i].transform.position = spawnerPositions[i] + Vector3.up; enemies[i].OnPlayerDie(); enemies[i].gameObject.SetActive(true); enemies[i].directionLooking = Vector3.forward; enemies[i].canMove = false; } deadEnemies.Clear(); limboEnemies.Clear(); currentEnemy = 0; currentTime = timeBetweenSpawns - 2; } IEnumerator RespawnEnemy(EnemyController enemy){ yield return new WaitForSeconds(.5f); spawnerPositions.Add(enemy.transform.position + Vector3.down); limboEnemies.Remove(enemy.transform.position + Vector3.down); enemy.EnterRespawn(); enemy.gameObject.SetActive(true); } bool won; // Update is called once per frame void Update(){ dollyTrackCamera.GetCinemachineComponent().m_PathPosition += Time.deltaTime / timeToStart * 2; if(dollyTrackCamera.GetCinemachineComponent().m_PathPosition >= 2){ dollyTrackCamera.enabled = false; } if (started){ currentTime += Time.deltaTime; if(currentTime >= timeBetweenSpawns){ if(currentEnemy < enemies.Count){ enemies[currentEnemy].positionToGo = new Vector3(spawnerExitPosition.x, enemies[currentEnemy].positionToGo.y, spawnerExitPosition.z); enemies[currentEnemy].targetAngle = -90f; enemies[currentEnemy].directionLooking = Vector3.left; enemies[currentEnemy].canMove = true; currentEnemy++; currentTime = 0; }else if(deadEnemies.Count != 0){ EnemyController enemy = deadEnemies[0]; //EnemyController enemy = deadEnemies.Dequeue(); enemy.Respawn(); enemy.positionToGo = new Vector3(spawnerExitPosition.x, enemy.positionToGo.y, spawnerExitPosition.z); enemy.targetAngle = -90f; enemy.directionLooking = Vector3.left; enemy.canMove = true; deadEnemies.Remove(enemy); currentTime = 0; } }else if(deadEnemies.Count == 0 && currentEnemy >= enemies.Count){ currentTime = 0; } } coinsText.text = "x" + numberOfCoins; if(numberOfCoins == 0 && !won){ GameOverCanvas.instance.Win(); won = true; } } int currentScale; public void PlayButtonScale(){ switch (currentScale){ case 0: AudioManager.instance.PlayOneShot("Scale1"); currentScale++; break; case 1: AudioManager.instance.PlayOneShot("Scale2"); currentScale++; break; case 2: AudioManager.instance.PlayOneShot("Scale3"); currentScale++; break; case 3: AudioManager.instance.PlayOneShot("Scale4"); currentScale++; break; case 4: AudioManager.instance.PlayOneShot("Scale2"); currentScale++; break; case 5: AudioManager.instance.PlayOneShot("Scale3"); currentScale++; break; case 6: AudioManager.instance.PlayOneShot("Scale4"); currentScale++; break; case 7: AudioManager.instance.PlayOneShot("Scale5"); currentScale++; break; case 8: AudioManager.instance.PlayOneShot("Scale3"); currentScale++; break; case 9: AudioManager.instance.PlayOneShot("Scale4"); currentScale++; break; case 10: AudioManager.instance.PlayOneShot("Scale5"); currentScale++; break; case 11: AudioManager.instance.PlayOneShot("Scale6"); currentScale++; break; case 12: AudioManager.instance.PlayOneShot("Scale5"); currentScale++; break; case 13: AudioManager.instance.PlayOneShot("Scale4"); currentScale++; break; case 14: AudioManager.instance.PlayOneShot("Scale3"); currentScale++; break; case 15: AudioManager.instance.PlayOneShot("Scale2"); currentScale = 0; break; } } IEnumerator StartGame(){ yield return new WaitForSeconds(timeToStart + 2.5f); onStart.Invoke(); AudioManager.instance.Play("Main"); started = true; } void OnDrawGizmos(){ Gizmos.color = Color.green; Gizmos.DrawSphere(spawnerExitPosition, .2f); } }