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; public class EnemySpawnerManager : MonoBehaviour { public static EnemySpawnerManager Instance; public static Action UpdateTick; public static Action GizmoTick; [SerializeField] public List EnemyPrefabKey; [SerializeField] public List EnemyPrefab; [SerializeField] public List EnemySpawnCountForTesting; [SerializeField] public bool CanStartSpawning = true; private Dictionary PrefabIndex = new Dictionary(); private Dictionary EnemySpawnCountForTestingDict = new Dictionary(); private List ListOfEnemies; public void Awake() { Instance = this; for (int i = 0; i < EnemyPrefabKey.Count; i++) { PrefabIndex.Add(EnemyPrefabKey[i], i); EnemySpawnCountForTestingDict.Add(EnemyPrefabKey[i], EnemySpawnCountForTesting[i]); } //ListOfEnemies = Enum.GetValues(typeof(Enemies)).Cast().ToList(); ListOfEnemies = EnemyPrefabKey; Owner = this.GameObject(); RestartData(); foreach (var enemy in ListOfEnemies) { InitializeEnemyData(enemy, EnemyPrefab[PrefabIndex[enemy]]); ApplyInitialTestSpawnIfApplicable(enemy); } } private void ApplyInitialTestSpawnIfApplicable(Enemies enemy) { if (!EnemySpawnCountForTestingDict.ContainsKey(enemy)) return; MaxSpawnCount[enemy] = EnemySpawnCountForTestingDict[enemy]; } public static void DestroyEnemy(GameObject gameObject, Enemies enemy) { Destroy(gameObject); CurrentSpawnCount[enemy]--; } public void Update() { StartSpawning(); UpdateTick?.Invoke(); } public void StartSpawning() { if (!CanStartSpawning) return; foreach (var enemy in ListOfEnemies) while (CurrentSpawnCount[enemy] < MaxSpawnCount[enemy]) { var enemyObject = EnemyGameObjectPools[enemy].Get(transform.position, Quaternion.identity); var enemyScript = new Gobler(enemyObject); EnemyMap.Add(enemyObject, enemyScript); CurrentSpawnCount[enemy]++; } CanStartSpawning = false; } 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 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(Enemies enemy, GameObject prefab) { EnemyGameObjectPools.Add(enemy, new GameObjectPool(prefab, 50, 200)); EnemyManagers.Add(enemy, Owner.AddComponent()); MaxSpawnCount.Add(enemy, 0); CurrentSpawnCount.Add(enemy, 0); } //public static Dictionary Goblers = new Dictionary(); //public static int MaxGoblers = 100; }