using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.Pool; public class MySpawnManager : MonoBehaviour { [Header("References")] [SerializeField] private Transform[] spawnPoint; [SerializeField] private Transform enemyContainer; [SerializeField] private GameObject enemyPrefab; [SerializeField] private EnemyManager enemyManager; [SerializeField] private TextMeshProUGUI enemyCounterText; [SerializeField, Range(0f, 100f)] private float timeBetweenSpawns; [Space] [Header("Horde Cap Settings")] [SerializeField, Range(0f, 10000f)] private float zombiesMaxAmount; private int currentEnemiesSpawned; private float timeSinceLastSpawn; private IObjectPool<GameObject> enemyPool; private void Awake() { enemyPool = new ObjectPool<GameObject>(CreateEnemy, OnGet, OnRelease); } private void Update() { if (Time.time > timeSinceLastSpawn) { if (currentEnemiesSpawned < zombiesMaxAmount) { enemyPool.Get(); timeSinceLastSpawn = Time.time + timeBetweenSpawns; } } } private void UpdateEnemyCounter() { if (enemyCounterText != null) { enemyCounterText.text = "Enemies: " + currentEnemiesSpawned; } } private void OnGet(GameObject enemyInstance) { Transform randomSpawnPoint = spawnPoint[Random.Range(0, spawnPoint.Length)]; if (enemyInstance.TryGetComponent<Rigidbody>(out Rigidbody rb)) { rb.linearVelocity = Vector3.zero; rb.angularVelocity = Vector3.zero; rb.position = randomSpawnPoint.position; rb.rotation = randomSpawnPoint.rotation; } enemyInstance.transform.SetPositionAndRotation(randomSpawnPoint.position, randomSpawnPoint.rotation); enemyInstance.transform.SetParent(enemyContainer); enemyInstance.SetActive(true); foreach (Transform child in enemyInstance.transform) { child.localPosition = Vector3.zero; child.localRotation = Quaternion.identity; child.localScale = Vector3.one; } if (enemyManager != null) { enemyManager.RegisterEnemy(enemyInstance); } currentEnemiesSpawned++; UpdateEnemyCounter(); } private void OnRelease(GameObject enemyInstance) { enemyInstance.SetActive(false); if (enemyManager != null) { enemyManager.UnregisterEnemy(enemyInstance); } currentEnemiesSpawned--; UpdateEnemyCounter(); } private GameObject CreateEnemy() { GameObject enemyInstance = Instantiate(enemyPrefab); return enemyInstance; } public void EnemyKilled(GameObject enemy) { enemyPool.Release(enemy); } }