void AttemptSpawn(IntRect rect, EnemySpawnSettings.EnemySpawn spawn) { if (_coordsList == null) { _coordsList = new List <SpawnCoords>(); } _coordsList.Clear(); IntRect windowRect = CloudSpawner.GetCurrentRect(LayerDepth, GridSize, new Vector2(0.6f, 0.6f)); int minY = rect.MinY; if (spawn.HasMinY) { minY = Mathf.Max(minY, spawn.MinY); } int maxY = rect.MaxY; if (spawn.HasMaxY) { maxY = Mathf.Min(maxY, spawn.MaxY + 1); } for (int x = rect.MinX; x < rect.MaxX; x++) { for (int y = minY; y < maxY; y++) { if (x > windowRect.MinX && x < windowRect.MaxX - 1 && y > windowRect.MinY && y < windowRect.MaxY - 1) { continue; } if (IsSpawnValid(spawn, x, y) == false) { continue; } _coordsList.Add(new SpawnCoords() { X = x, Y = y, }); } } if (_coordsList.Count > 0) { var coord = _coordsList[Random.Range(0, _coordsList.Count)]; SpawnEnemy(spawn, coord); } }
void Update() { if (_firstEnemyKilled) { _timer += Time.deltaTime; } IntRect currentRect = CloudSpawner.GetCurrentRect(LayerDepth, GridSize, MaxSpawnRectModifier); float periodT; var spawnSettings = GetCurrentSpawnSettings(_timer, out periodT); if (_firstEnemyKilled) { _SpawnAccumulator += spawnSettings.SpawnSpeed * spawnSettings.IntensityCurve.Evaluate(periodT) * Time.deltaTime; } if (_SpawnAccumulator >= 0) { float totalSpawnChance = 0; for (int i = 0; i < spawnSettings.Spawns.Length; i++) { var spawn = spawnSettings.Spawns[i]; if (IsValidSpawn(currentRect, spawn, _timer)) { totalSpawnChance += spawn.SpawnChance; } } float randomVal = Random.Range(0, totalSpawnChance); for (int i = 0; i < spawnSettings.Spawns.Length; i++) { var spawn = spawnSettings.Spawns[i]; if (IsValidSpawn(currentRect, spawn, _timer)) { if (spawn.SpawnChance > randomVal) { AttemptSpawn(currentRect, spawn); break; } randomVal -= spawn.SpawnChance; } } } }