Enemy spawner
This commit is contained in:
@@ -0,0 +1,114 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using Random = UnityEngine.Random;
|
||||
|
||||
public class Spawner : MonoBehaviour
|
||||
{
|
||||
public GameObject Mayor;
|
||||
public GameObject Minautor;
|
||||
public GameObject BringerOfDeath;
|
||||
|
||||
private float _radius = 5f;
|
||||
|
||||
private int spawnedMayors = 0;
|
||||
private int spawnedMinautor = 0;
|
||||
private int spawnedBringerOfDeath = 0;
|
||||
|
||||
private readonly int mayorsLimit = 300;
|
||||
private readonly int minautorsLimit = 15;
|
||||
private readonly int bringerOfDeathLimit = 5;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
_radius = Camera.main.orthographicSize * Camera.main.aspect + 2f;
|
||||
}
|
||||
|
||||
private void Start()
|
||||
{
|
||||
InvokeRepeating(nameof(SpawnWave), 5f, 5f);
|
||||
}
|
||||
|
||||
private void OnDrawGizmos()
|
||||
{
|
||||
|
||||
Gizmos.DrawWireSphere(transform.position, Camera.main.orthographicSize * Camera.main.aspect + 2f);
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
spawnedMayors = Array.FindAll(GameObject.FindGameObjectsWithTag("Ennemy"), (value) => value.name.Contains("Mayor")).Length;
|
||||
spawnedMinautor = Array.FindAll(GameObject.FindGameObjectsWithTag("Ennemy"), (value) => value.name.Contains("Minautor")).Length;
|
||||
spawnedBringerOfDeath = Array.FindAll(GameObject.FindGameObjectsWithTag("Ennemy"), (value) => value.name.Contains("Bringer of Death")).Length;
|
||||
}
|
||||
|
||||
private void SpawnWave()
|
||||
{
|
||||
// Determine how much enemies will spawn on this wave
|
||||
int enemiesAmount = Random.Range(20, 30);
|
||||
|
||||
for (int i = 0; i < enemiesAmount; i++)
|
||||
{
|
||||
GameObject enemyToSpawn = ChooseEnemy();
|
||||
string enemyName = enemyToSpawn.name.Split(' ')[0];
|
||||
|
||||
int retries = 0;
|
||||
|
||||
while (
|
||||
(enemyName == "Mayor" && spawnedMayors >= mayorsLimit) ||
|
||||
(enemyName == "Minautor" && spawnedMinautor >= minautorsLimit) ||
|
||||
(enemyName == "Bringer of Death" && spawnedBringerOfDeath >= bringerOfDeathLimit)
|
||||
)
|
||||
{
|
||||
enemyToSpawn = ChooseEnemy();
|
||||
enemyName = enemyToSpawn.name.Split(' ')[0];
|
||||
|
||||
retries++;
|
||||
if (retries >= 20)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
switch (enemyName)
|
||||
{
|
||||
case "Mayor":
|
||||
spawnedMayors++;
|
||||
break;
|
||||
case "Minautor":
|
||||
spawnedMinautor++;
|
||||
break;
|
||||
case "Bringer of Death":
|
||||
spawnedBringerOfDeath++;
|
||||
break;
|
||||
}
|
||||
|
||||
// Determine the spawn position on a circle around the player
|
||||
float angle = Mathf.PI * 2f / Random.Range(0f, 40f);
|
||||
Instantiate(
|
||||
enemyToSpawn,
|
||||
transform.position + new Vector3(Mathf.Cos(Random.Range(0f, 10f) * angle) * _radius, Mathf.Sin(Random.Range(0f, 10f) * angle) * _radius, 0),
|
||||
Quaternion.identity,
|
||||
transform
|
||||
);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// Determine which enemy to spawn based on chance percentage
|
||||
private GameObject ChooseEnemy()
|
||||
{
|
||||
int enemyChance = Random.Range(0, 101);
|
||||
if (enemyChance > 80 && enemyChance <= 98)
|
||||
{
|
||||
return Minautor;
|
||||
}
|
||||
else if (enemyChance > 98 && enemyChance <= 100)
|
||||
{
|
||||
return BringerOfDeath;
|
||||
}
|
||||
else
|
||||
{
|
||||
return Mayor;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user