private void SpawnEnemies(List <WaveEntity> selectedFormationEntities, int[] shipTypes, float minVerticalStartCoord, float maxVerticalStartCoord, float enemyHorizontalDist, float enemyVerticalDist, float maxEnemyHorizontalDist) { bool waveManeuvers = false; Vector2 maneuveringVector; float maneuveringVerticalLength = 0.0f; float selectedVerticalStartCoord = Random.Range(minVerticalStartCoord, maxVerticalStartCoord); float diffFromCeiling = maxVerticalStartCoord - selectedVerticalStartCoord; float diffFromFloor = selectedVerticalStartCoord - minVerticalStartCoord; float waveManeuveringRoom; if (diffFromCeiling > diffFromFloor) { waveManeuveringRoom = diffFromCeiling; maneuveringVector = Vector2.up * ManeuveringDirectionMoveSpeed; } else { waveManeuveringRoom = diffFromFloor; maneuveringVector = Vector2.down * ManeuveringDirectionMoveSpeed; } if (waveManeuveringRoom > ShipColliderVertSize) { //20 40 60 80 100 percent chance of a maneuvering wave depending on difficulty coefficient float waveManeuveringChangePercentage = (float)(_difficultyManagerScript.DifficultyCoefs[DifficultyParameter.DpWaveManeuveringChance] * 100) / GameConstants.MaxDifficulty; int doManeuver = Random.Range(0, 100); if (doManeuver < waveManeuveringChangePercentage) { waveManeuvers = true; maneuveringVerticalLength = Random.Range(ShipColliderVertSize, waveManeuveringRoom); } } //VII. Spawn Enemies GameObject waveScoreIndicator = Instantiate(WaveScoreIndicatorPrefab); waveScoreIndicator.transform.SetParent(CanvasScorePanel.transform, false); GameObject lineRendererObject = Instantiate(ShipConnectionPrefab, Vector3.zero, Quaternion.identity); EnemyWave curEnemyWave = new EnemyWave(_playerScript, lineRendererObject.GetComponent <LineRenderer>(), _canvasRectTransform, waveScoreIndicator, _scoreLeftAnchorXPos, _scoreRightAnchorXPos); for (int i = 0; i < selectedFormationEntities.Count; i++) { int enemyKind = shipTypes[i]; GameObject enemyPrefab = EnemyPrefabArray[enemyKind]; BasicEnemy enemyPrefabScript = enemyPrefab.GetComponent <BasicEnemy>(); Vector2 enemyPos; if (i > 0) { Vector2 posDiff = selectedFormationEntities[i].Position - selectedFormationEntities[i - 1].Position; int xPosDiff = (int)posDiff.x; int yPosDiff = (int)posDiff.y; int xIncrement = xPosDiff != 0 ? Math.Sign(xPosDiff) : 0; int yIncrement = yPosDiff != 0 ? Math.Sign(yPosDiff) : 0; Vector3 previousEnemyPos = curEnemyWave.GetLastEnemyPosition(); enemyPos = new Vector2(previousEnemyPos.x + xIncrement * enemyHorizontalDist, previousEnemyPos.y + yIncrement * enemyVerticalDist); } else { //determining first enemy position enemyPos = new Vector2(enemyPrefabScript.HorizontalSpawnCoord + selectedFormationEntities[i].Position.x * maxEnemyHorizontalDist, selectedVerticalStartCoord); } GameObject enemy = Instantiate(enemyPrefab, enemyPos, Quaternion.identity); Assert.IsNotNull(enemy); BasicEnemy basicEnemyScript = enemy.GetComponent <BasicEnemy>(); BasicMove basicMoveScript = enemy.GetComponent <BasicMove>(); curEnemyWave.AddNewEnemy(enemy, basicEnemyScript); basicEnemyScript.Initialize(_playerScript, _difficultyManagerScript, basicMoveScript, selectedFormationEntities[i].MoveDir, curEnemyWave); basicEnemyScript.SetMoveDir(selectedFormationEntities[i].MoveDir); } curEnemyWave.FinalizeAfterWaveIsFilled(waveManeuvers, maneuveringVector, maneuveringVerticalLength); _enemyWaves.Add(curEnemyWave); }