Paste
Of Code


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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);
    }
}

Toggle: theme, font