// GDnD wiki example // Demonstrates: the Object Pool pattern — reuse bullets instead of Instantiate/Destroy on every shot // Related pages: [[overview-arcade-classics-as-learning-projects]], [[object-pool-pattern]], [[factory-pattern]] using System.Collections.Generic; using UnityEngine; // A single pool shared by the player and the invaders. Both sides fire the same // projectile prefab, parameterised at launch. The Get/Release/SetPool API matches // the [[object-pool-pattern]] reference page. public class ProjectilePool : MonoBehaviour { [SerializeField] private Projectile projectilePrefab; [SerializeField] private int initialSize = 30; private readonly Stack inactive = new Stack(); private void Awake() { for (int i = 0; i < initialSize; i++) { Projectile projectile = Instantiate(projectilePrefab, transform); projectile.SetPool(this); projectile.gameObject.SetActive(false); inactive.Push(projectile); } } public Projectile Get() { Projectile projectile = inactive.Count > 0 ? inactive.Pop() : Instantiate(projectilePrefab, transform); projectile.SetPool(this); projectile.gameObject.SetActive(true); return projectile; } public void Release(Projectile projectile) { projectile.gameObject.SetActive(false); inactive.Push(projectile); } }