WeirdBeardDev

QueuePool for Unity

Jun 22nd, 2021 (edited)
555
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.43 KB | None | 0 0
  1. /*
  2.  * This work by Jason "Aj" Comfort (https://weirdbearddev.com) is licensed under
  3.  * CC BY-SA 4.0. To view a copy of this license, visit https://creativecommons.org/licenses/by-sa/4.0
  4. */
  5.  
  6. using System.Collections.Generic;
  7. using UnityEngine;
  8.  
  9. namespace SpaceMonkeys.Core
  10. {
  11.     public class QueuePool : MonoBehaviour
  12.     {
  13.         #region Members
  14.         [SerializeField] private GameObject _prefab = default;
  15.         [SerializeField] private Queue<GameObject> _pool = default;
  16.         [SerializeField] private int _poolSize = 10;
  17.  
  18.         private const int _increaseWhenEmpty = 10;
  19.         #endregion Members
  20.  
  21.         #region MonoBehaviours
  22.         void Awake() => GeneratePool();
  23.         #endregion MonoBehaviours
  24.  
  25.         #region Methods
  26.         /// <summary>
  27.         /// Gets the first item from the queue.  The position and rotation are equal to QueuePool's, and it is active.
  28.         /// </summary>
  29.         /// <returns>The GameObject from the QueuePool.</returns>
  30.         public GameObject Request()
  31.         {
  32.             if (_pool.Count > 0)
  33.             {
  34.                 GameObject item = _pool.Dequeue();
  35.                 item.transform.SetPositionAndRotation(transform.position, transform.rotation);
  36.                 item.SetActive(true);
  37.                 return item;
  38.             }
  39.             else
  40.             {
  41.                 IncreasePool(_increaseWhenEmpty);
  42.                 return Request();
  43.             }
  44.         }
  45.         public void Return(GameObject item)
  46.         {
  47.             item.SetActive(false);
  48.             item.transform.SetPositionAndRotation(transform.position, transform.rotation);
  49.             if (!_pool.Contains(item))
  50.                 _pool.Enqueue(item);
  51.         }
  52.         #endregion Methods
  53.  
  54.         #region Helpers
  55.         private void GeneratePool()
  56.         {
  57.             _pool = new Queue<GameObject>(_poolSize);
  58.             AddItems(_poolSize);
  59.         }
  60.         private void IncreasePool(int amount)
  61.         {
  62.             _poolSize += amount;
  63.             AddItems(amount);
  64.         }
  65.         private void AddItems(int amount)
  66.         {
  67.             for (int i = 0; i < amount; i++)
  68.             {
  69.                 GameObject p = Instantiate(_prefab, transform);
  70.                 p.name = $"{p.name}-{i}";
  71.                 p.SetActive(false);
  72.                 if (!_pool.Contains(p))
  73.                     _pool.Enqueue(p);
  74.             }
  75.         }
  76.         #endregion Helpers
  77.     }
  78. }
Add Comment
Please, Sign In to add comment