using JetBrains.Annotations; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; using Unity.VisualScripting; using UnityEngine; using static EnemySpawnerData; using static UnityEngine.EventSystems.EventTrigger; [CreateAssetMenu(fileName = "EnemySpawnInfo", menuName = "Enemy Spawn Info")] public class EnemySpawnInfo : ScriptableObject { [Header("Info")] public Enemies Type; public GameObject Prefab; public int MaxSpawnCount; public int CurrentSpawnCount; public int MaxCountPerSpawn; public bool CanStartSpawning; } public class SpawnableEnemyInfo : MonoBehaviour { public static SpawnableEnemyInfo Instance; public static Action UpdateTick; public static Action GizmoTick; public static float SpawnIntervalInSeconds = 10; public static float NextSpawnableTime = 0; [SerializeField] public List SpawnableEnemies; public void Awake() { Instance = this; Owner = this.GameObject(); RestartData(); for (int i = 0; i < SpawnableEnemies.Count; i++) SpawnableEnemies[i] = Instantiate(SpawnableEnemies[i]); foreach (var enemy in SpawnableEnemies) InitializeEnemyData(enemy); } public static void DestroyEnemy(GameObject gameObject, Enemies enemy) { Destroy(gameObject); EnemySpawnerData.SpawnableEnemies[enemy].CurrentSpawnCount--; } public void Update() { StartSpawning(); UpdateTick?.Invoke(); } public void StartSpawning() { if (NextSpawnableTime > Time.time) return; NextSpawnableTime = Time.time + SpawnIntervalInSeconds; foreach (var enemy in SpawnableEnemies) { int currentSpawnCount = 0; while (enemy.CanStartSpawning && enemy.CurrentSpawnCount < enemy.MaxSpawnCount && currentSpawnCount++ < enemy.MaxCountPerSpawn) { var enemyObject = EnemyGameObjectPools[enemy.Type].Get(transform.position, Quaternion.identity); var enemyScript = new Gobler(enemyObject); EnemyMap.Add(enemyObject, enemyScript); enemy.CurrentSpawnCount++; } } } public void OnDrawGizmos() { GizmoTick?.Invoke(); } public static void DrawWireSphere(Color color, Vector3 center, float radius) { Gizmos.color = color; Gizmos.DrawWireSphere(center, radius); } } public class EnemyManager : MonoBehaviour { public Action UpdateTick; public Action GizmoTick; public void Update() { UpdateTick?.Invoke(); } public void OnDrawGizmos() { GizmoTick?.Invoke(); } public void DrawWireSphere(Color color, Vector3 center, float radius) { Gizmos.color = color; Gizmos.DrawWireSphere(center, radius); } } public static class EnemySpawnerData { public enum Enemies { Gobler, } public static GameObject Owner; public static Dictionary SpawnableEnemies = new Dictionary(); public static Dictionary ObjectPrefabs = new Dictionary(); public static Dictionary EnemyGameObjectPools = new Dictionary(); public static Dictionary EnemyManagers = new Dictionary(); public static Dictionary MaxSpawnCount = new Dictionary(); public static Dictionary CurrentSpawnCount = new Dictionary(); public static Dictionary EnemyMap = new Dictionary(); public static void RestartData() { ObjectPrefabs = new Dictionary(); EnemyGameObjectPools = new Dictionary(); EnemyManagers = new Dictionary(); MaxSpawnCount = new Dictionary(); CurrentSpawnCount = new Dictionary(); EnemyMap = new Dictionary(); } public static void InitializeEnemyData(EnemySpawnInfo enemy) { SpawnableEnemies.Add(enemy.Type, enemy); EnemyGameObjectPools.Add(enemy.Type, new GameObjectPool(enemy.Prefab, 50, 200)); EnemyManagers.Add(enemy.Type, Owner.AddComponent()); MaxSpawnCount.Add(enemy.Type, 0); CurrentSpawnCount.Add(enemy.Type, 0); } }