From ac4cbfa911e66e3412d9c7dcbf88aed51df0bff7 Mon Sep 17 00:00:00 2001 From: UnEpicier Date: Sun, 22 Oct 2023 16:30:29 +0200 Subject: [PATCH] Enemy spawner --- Assets/Enemies/Ennemy.cs | 9 +- Assets/Player/Player.prefab | 22 ++++- Assets/Player/Scripts/Spawner.cs | 114 ++++++++++++++++++++++++++ Assets/Player/Scripts/Spawner.cs.meta | 11 +++ 4 files changed, 154 insertions(+), 2 deletions(-) create mode 100644 Assets/Player/Scripts/Spawner.cs create mode 100644 Assets/Player/Scripts/Spawner.cs.meta diff --git a/Assets/Enemies/Ennemy.cs b/Assets/Enemies/Ennemy.cs index 3c41a8c..2130433 100644 --- a/Assets/Enemies/Ennemy.cs +++ b/Assets/Enemies/Ennemy.cs @@ -1,5 +1,4 @@ using System.Collections; -using Unity.VisualScripting.FullSerializer; using UnityEngine; [ @@ -18,6 +17,14 @@ public class Ennemy : MonoBehaviour [SerializeField] private GameObject _orb; + private void Awake() + { + if (transform.parent != null) + { + transform.parent = null; + } + } + private void Start() { _sr = GetComponent(); diff --git a/Assets/Player/Player.prefab b/Assets/Player/Player.prefab index 86b3172..98ecb01 100644 --- a/Assets/Player/Player.prefab +++ b/Assets/Player/Player.prefab @@ -18,6 +18,7 @@ GameObject: - component: {fileID: 7397454076540391921} - component: {fileID: 8339747699126584523} - component: {fileID: 2991086602376010793} + - component: {fileID: 4761054675786854393} m_Layer: 0 m_Name: Player m_TagString: Player @@ -267,9 +268,13 @@ MonoBehaviour: Speed: 2 Exp: 0 Level: 1 + OrbAbsorberRadius: 0.7 BeamDamages: 50 - BeamFequency: 5 + BeamFrequency: 5 + BeamLife: 0.5 + SwordsHaloRadius: 1 SwordsDamages: 25 + SwordsQuantity: 5 ArrowDamages: 15 ArrowRange: 5 ArrowFrequency: 2 @@ -295,6 +300,21 @@ MonoBehaviour: m_EditorClassIdentifier: laser: {fileID: 4893257253370123985, guid: 95cb513377bf0e248bd66d6f7ddae920, type: 3} arrow: {fileID: 6280786298679187013, guid: 856a449688373494987701d49b79a7af, type: 3} +--- !u!114 &4761054675786854393 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1784956759114531697} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e6db2d9573175344fa4455c70d440232, type: 3} + m_Name: + m_EditorClassIdentifier: + Mayor: {fileID: 0} + Minautor: {fileID: 0} + BringerOfDeath: {fileID: 0} --- !u!1001 &993819705047970090 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/Assets/Player/Scripts/Spawner.cs b/Assets/Player/Scripts/Spawner.cs new file mode 100644 index 0000000..26dd96f --- /dev/null +++ b/Assets/Player/Scripts/Spawner.cs @@ -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; + } + } +} diff --git a/Assets/Player/Scripts/Spawner.cs.meta b/Assets/Player/Scripts/Spawner.cs.meta new file mode 100644 index 0000000..b55b63c --- /dev/null +++ b/Assets/Player/Scripts/Spawner.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e6db2d9573175344fa4455c70d440232 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: