using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyHandler : MonoBehaviour { [Header("Assigned on start")] [SerializeField] PathFinder pathFinder; [SerializeField] GridManager gridManager; [Header("Parameters")] [SerializeField] [Range(0.1f, 60f)] float spawnRate = 60f; [SerializeField] int objectPoolSize = 15; [Header("Prefabs")] [SerializeField] GameObject objectPool; [SerializeField] List enemyPrefabs = new List(); [Header("Lists")] [SerializeField] List path = new List(); [SerializeField] List enemyPools = new List(); [SerializeField] List allEnemies = new List(); public List Path { get { return path; } } private void Awake() { gridManager = FindObjectOfType(); } private void Start() { //gridManager.CalculateNewPath(); PopulateObjectPools(); StartCoroutine(Spawner()); } private void Update() { if (Input.GetKeyDown(KeyCode.N)) { SpawnNewEnemy(); } } public void SetPath(List _nodes) { path.Clear(); foreach (Node _node in _nodes) { path.Add(_node); } UpdateEnemyPath(); } void UpdateEnemyPath() { foreach (GameObject _pool in enemyPools) { foreach (EnemyMovement _enemy in _pool.GetComponentsInChildren()) { _enemy.SetPath(path); } } } void PopulateObjectPools() { foreach (GameObject enemy in enemyPrefabs) { GameObject newPool = Instantiate(objectPool, transform); newPool.transform.name = $"ObjectPool:{enemy.name}"; ObjectPool poolScript = newPool.GetComponent(); enemyPools.Add(newPool); for (int i = 0; i < objectPoolSize; i++) { enemy.SetActive(false); poolScript.AddObject(enemy); } } } public void AddEnemyToAllEnemies(GameObject _enemy) { allEnemies.Add(_enemy); } public void RemoveEnemy(GameObject _enemy) { allEnemies.Remove(_enemy); } public List ReturnAllEnemies() { return allEnemies; } void SpawnNewEnemy() { int spawnEnemyIndex = Mathf.RoundToInt(Random.Range(-0.49f, 2.49f)); enemyPools[spawnEnemyIndex].GetComponent().EnableFirstAvailableObject(); } IEnumerator Spawner() { while (true) { SpawnNewEnemy(); yield return new WaitForSeconds(spawnRate); } } public Vector2Int GetCoordinatesFromPosition(Vector3 position) { Vector2Int coordinates = new Vector2Int(); coordinates.x = Mathf.RoundToInt(position.x / UnityEditor.EditorSnapSettings.move.x); coordinates.y = Mathf.RoundToInt(position.z / UnityEditor.EditorSnapSettings.move.z); return coordinates; } public void NotifyEnemiesOfNewPath() { BroadcastMessage("RecalculatePath", SendMessageOptions.DontRequireReceiver); } }