212 lines
7.1 KiB
C#
212 lines
7.1 KiB
C#
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<Vector3> spawnerPositions;
|
|
|
|
List<EnemyController> deadEnemies;
|
|
[SerializeField, Range(0f, 15f)] float timeBetweenSpawns = 7.5f;
|
|
float currentTime;
|
|
int currentEnemy;
|
|
|
|
public List<EnemyController> enemies = new List<EnemyController>();
|
|
|
|
[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<Vector3>();
|
|
deadEnemies = new List<EnemyController>();
|
|
currentTime = timeBetweenSpawns - 2;
|
|
AudioManager.instance.Stop("Menu");
|
|
AudioManager.instance.Play("Intro");
|
|
StartCoroutine(StartGame());
|
|
}
|
|
|
|
List<Vector3> 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<CinemachineTrackedDolly>().m_PathPosition += Time.deltaTime / timeToStart * 2;
|
|
if(dollyTrackCamera.GetCinemachineComponent<CinemachineTrackedDolly>().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);
|
|
}
|
|
}
|