/// <summary>
        /// Generates a <see cref="Wave"/> based on the config from <see cref="generationConfig"/>.
        /// </summary>
        /// <param name="number">The number of the <see cref="Wave"/> to generate.</param>
        /// <returns>A <see cref="Wave"/> that was generated based on the <paramref name="number"/>, and the <see cref="generationConfig"/>.</returns>
        public Wave GenerateWave(int number, int pointsAvailable)
        {
            List <EnemySpawnInfo> enemiesToSpawn = new List <EnemySpawnInfo>();

            #region Add introduction enemies to the spawn queue

            EnemySpawnInfo[] enemiesToIntroduce = GetEnemiesToIntroduce(number);
            if (enemiesToIntroduce.Length > 0)
            {
                enemiesToSpawn.AddRange(enemiesToIntroduce);

                for (int i = 0; i < enemiesToIntroduce.Length; i++)
                {
                    pointsAvailable -= enemiesToIntroduce[i].PointsRequiredToSpawn;
                }
            }

            #endregion

            while (pointsAvailable > 0)
            {
                EnemyWaveInfo enemy = GetEnemyBasedOnPoints(pointsAvailable, number);
                if (enemy == null)
                {
                    break;
                }

                #region Check if enemy is already added

                EnemySpawnInfo spawnInfo = null;
                for (int i = 0; i < enemiesToSpawn.Count; i++)
                {
                    if (enemiesToSpawn[i].EnemyPool == enemy.EnemyPool)
                    {
                        spawnInfo = enemiesToSpawn[i];
                        break;
                    }
                }

                #endregion

                // Add to spawn amount or add a new enemy entry based on the previous check.
                if (spawnInfo == null)
                {
                    enemiesToSpawn.Add(new EnemySpawnInfo(enemy.EnemyPool, enemy.PointsRequiredToSpawn));
                }
                else
                {
                    spawnInfo.AddToSpawnAmount();
                }
                pointsAvailable -= enemy.PointsRequiredToSpawn;
            }

            return(new Wave(number, enemiesToSpawn.ToArray()));
        }
        private EnemySpawnInfo[] GetEnemiesToIntroduce(int waveNumber)
        {
            List <EnemySpawnInfo> enemiesToSpawn = new List <EnemySpawnInfo>();

            for (int i = 0; i < enemies.Length; i++)
            {
                if (enemies[i].IntroduceAtWave == waveNumber)
                {
                    EnemySpawnInfo spawnInfo = new EnemySpawnInfo(enemies[i].EnemyPool, enemies[i].PointsRequiredToSpawn);
                    enemiesToSpawn.Add(spawnInfo);

                    for (int j = 1; j < enemies[i].IntroductionSpawnAmount; j++)
                    {
                        spawnInfo.AddToSpawnAmount();
                    }
                }
            }

            return(enemiesToSpawn.ToArray());
        }
示例#3
0
        private IEnumerator SpawnWave()
        {
            int currentEnemyIndex = 0;

            while (currentEnemyIndex < currentWave.EnemyCount)
            {
                EnemySpawnInfo spawnInfo = currentWave.GetEnemy(currentEnemyIndex);
                for (int i = 0; i < spawnInfo.SpawnAmount; i++)
                {
                    yield return(new WaitForSeconds(generationConfig.GetRndEnemySpawnDelay()));

                    GameObject spawnedEnemy = spawner.Spawn(spawnInfo.EnemyPool);
                    GameEvents.SignalEnemyShipSpawned(spawnedEnemy);
                }

                currentEnemyIndex++;
            }

            // Start the next wave after the delay
            Invoke(nameof(StartNextWave), generationConfig.NextWaveStartDelay);
        }