using System.Collections.Generic; using RR.Common.Entities.Props; using UnityEngine; namespace RR.Game2D.Behaviour { public sealed class EnvironmentalPool : MonoBehaviour { private readonly Dictionary> _poolByPrefab = new(); public void Warmup(GameObject prefab, int count) { if (prefab == null || count <= 0) return; Queue queue = GetQueue(prefab); for (int i = queue.Count; i < count; i++) { GameObject instance = Instantiate(prefab, transform); instance.SetActive(false); queue.Enqueue(instance); } } public GameObject Get(GameObject prefab, Vector3 position, Quaternion rotation) { if (prefab == null) return null; Queue queue = GetQueue(prefab); GameObject instance = queue.Count > 0 ? queue.Dequeue() : Instantiate(prefab, transform); Transform cachedTransform = instance.transform; cachedTransform.SetPositionAndRotation(position, rotation); instance.SetActive(true); return instance; } public void Return(GameObject prefab, GameObject instance) { if (prefab == null || instance == null) return; EnvironmentalCollectibleBase collectible = instance.GetComponent(); if (collectible != null) collectible.transform.SetParent(transform, false); instance.SetActive(false); GetQueue(prefab).Enqueue(instance); } private Queue GetQueue(GameObject prefab) { if (_poolByPrefab.TryGetValue(prefab, out Queue queue)) return queue; queue = new Queue(); _poolByPrefab.Add(prefab, queue); return queue; } } }