void Update() { //.....................................track time timer = timer + Time.deltaTime; //....................................Spawn 'full-wave' at delay time if (timer >= currentWaveObjectReference.delayBeforeThisWave && fullWaveIsSpawning == false) { timer = 0; fullWaveIsSpawning = true; enemiesToDefeatCurrentWave = 0; indexDelayBeforeWaves = 0; indexEnemyElement = 0; indexNumberOfEnemies = 0; indexEnemyMovementPathsObjects = 0; //set mini wave total from wave object totalMiniWaves = currentWaveObjectReference.waveNumberOfEnemies.Length; //find number of enemies to be defeated in wave for the healthbar for (int i = 0; i < currentWaveObjectReference.waveNumberOfEnemies.Length; i++) { enemiesToDefeatCurrentWave = enemiesToDefeatCurrentWave + currentWaveObjectReference.waveNumberOfEnemies[i]; } //set healthbar max to found total print("Total enemies to be destroyed for this wave: " + enemiesToDefeatCurrentWave); int enemyDifference = enemyHealthBarScript.maxHealth - enemyHealthBarScript.currentEnemyHealth; //how many are left? enemyHealthBarScript.maxHealth = enemyDifference + enemiesToDefeatCurrentWave; enemyHealthBarScript.NewMaxHealth(enemyHealthBarScript.maxHealth); enemyHealthBarScript.currentEnemyHealth = enemyDifference; } //....................................Spawn 'mini-wave' at delay time if full-wave is spawning if (timer >= currentWaveObjectReference.waveDelayBeforeWave[indexDelayBeforeWaves] && miniWaveIsSpawning == false && fullWaveIsSpawning == true && currentMiniWaves < totalMiniWaves) { timer = 0; miniWaveIsSpawning = true; } //....................................Spawn enemy inside 'mini-wave' at delay time if (timer >= currentWaveObjectReference.delayInsideWave && miniWaveIsSpawning == true) { timer = 0; enemyAmountInMiniWave++; GameObject prefabToSpawn = normalEnemyPrefab; //....................................Set enemy type if (currentWaveObjectReference.waveEnemyElementToSpawn[indexEnemyElement] == 0) { prefabToSpawn = normalEnemyPrefab; } if (currentWaveObjectReference.waveEnemyElementToSpawn[indexEnemyElement] == 1) { prefabToSpawn = lightningEnemyPrefab; } if (currentWaveObjectReference.waveEnemyElementToSpawn[indexEnemyElement] == 2) { prefabToSpawn = fireEnemyPrefab; } if (currentWaveObjectReference.waveEnemyElementToSpawn[indexEnemyElement] == 3) { prefabToSpawn = iceEnemyPrefab; } //....................................Spawn enemy at a spawner location //Index is determined both by 'mini-waves' AND 'full-waves.' GameObject newEnemy = Instantiate(prefabToSpawn, spawnerLocationObjects[currentWaveObjectReference.waveSpawnerToUse[indexSpawnerLocationObjects]].transform.position, spawnerLocationObjects[currentWaveObjectReference.waveSpawnerToUse[indexSpawnerLocationObjects]].transform.rotation); //....................................Give spawned unit movement orders //Use "OnCreationWaypoints" function on enemy GameObject, and pass to it a waypoints GameObject of current index in this script //Index is determined both by 'mini-waves' AND 'full-waves.' newEnemy.GetComponent <EnemyMoveToWaypoints>().OnCreationWaypoints(enemyMovementPathsObjects[currentWaveObjectReference.waveRouteToTake[indexEnemyMovementPathsObjects]]); //....................................Turn off 'mini-wave' when limit reached, go to next 'mini-wave' in arrays if (enemyAmountInMiniWave >= currentWaveObjectReference.waveNumberOfEnemies[indexNumberOfEnemies]) { miniWaveIsSpawning = false; enemyAmountInMiniWave = 0; currentMiniWaves++; //cycle mini-wave indexes; this way, if they have less actions than the max number of mini-waves, they start from the top again if (indexDelayBeforeWaves + 1 >= currentWaveObjectReference.waveDelayBeforeWave.Length) { indexDelayBeforeWaves = 0; } else { indexDelayBeforeWaves++; } if (indexEnemyElement + 1 >= currentWaveObjectReference.waveEnemyElementToSpawn.Length) { indexEnemyElement = 0; } else { indexEnemyElement++; } if (indexNumberOfEnemies + 1 >= currentWaveObjectReference.waveNumberOfEnemies.Length) { indexNumberOfEnemies = 0; } else { indexNumberOfEnemies++; } if (indexEnemyMovementPathsObjects + 1 >= currentWaveObjectReference.waveRouteToTake.Length) { indexEnemyMovementPathsObjects = 0; } else { indexEnemyMovementPathsObjects++; } if (indexSpawnerLocationObjects + 1 >= currentWaveObjectReference.waveSpawnerToUse.Length) { indexSpawnerLocationObjects = 0; } else { indexSpawnerLocationObjects++; } } } //....................................Start next wave after finishing all mini-waves of this wave if (currentMiniWaves == totalMiniWaves && fullWaveIsSpawning == true && indexSingleWaveObject + 1 < singleWaveObjects.Length) { timer = 0; fullWaveIsSpawning = false; indexSingleWaveObject++; print("Next wave activated"); currentMiniWaves = 0; //reset mini-wave indexes indexDelayBeforeWaves = 0; indexEnemyElement = 0; indexNumberOfEnemies = 0; indexEnemyMovementPathsObjects = 0; indexSpawnerLocationObjects = 0; //get wave object reference currentWaveObjectReference = singleWaveObjects[indexSingleWaveObject].GetComponent <SingleWaveObject>(); } }