Enemy spawner

This commit is contained in:
2023-10-22 16:30:29 +02:00
parent 7ebff78708
commit ac4cbfa911
4 changed files with 154 additions and 2 deletions
+114
View File
@@ -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;
}
}
}
+11
View File
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e6db2d9573175344fa4455c70d440232
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: