TowerDefenseGame/Assets/Scripts/Runtime/AI/EnemyManager/SpawnableEnemyInfo.cs
Nico a492afdf1b Switch over to isometric map and set navmesh
Refactor attack animator
Refactor SpawnerManager - utilize SO (SpawnableEnemyInfo)
2025-07-18 23:51:27 -07:00

135 lines
4.1 KiB
C#

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<EnemySpawnInfo> 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<Enemies, EnemySpawnInfo> SpawnableEnemies = new Dictionary<Enemies, EnemySpawnInfo>();
public static Dictionary<Enemies, GameObject> ObjectPrefabs = new Dictionary<Enemies, GameObject>();
public static Dictionary<Enemies, GameObjectPool> EnemyGameObjectPools = new Dictionary<Enemies, GameObjectPool>();
public static Dictionary<Enemies, EnemyManager> EnemyManagers = new Dictionary<Enemies, EnemyManager>();
public static Dictionary<Enemies, int> MaxSpawnCount = new Dictionary<Enemies, int>();
public static Dictionary<Enemies, int> CurrentSpawnCount = new Dictionary<Enemies, int>();
public static Dictionary<GameObject, Alive> EnemyMap = new Dictionary<GameObject, Alive>();
public static void RestartData() {
ObjectPrefabs = new Dictionary<Enemies, GameObject>();
EnemyGameObjectPools = new Dictionary<Enemies, GameObjectPool>();
EnemyManagers = new Dictionary<Enemies, EnemyManager>();
MaxSpawnCount = new Dictionary<Enemies, int>();
CurrentSpawnCount = new Dictionary<Enemies, int>();
EnemyMap = new Dictionary<GameObject, Alive>();
}
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<EnemyManager>());
MaxSpawnCount.Add(enemy.Type, 0);
CurrentSpawnCount.Add(enemy.Type, 0);
}
}