using System.Collections.Generic; using UnityEngine; // HealItemの事前生成、貸し出し、返却を管理する public class HealItemPool : MonoBehaviour { [Tooltip("事前生成する回復アイテムのPrefab")] [SerializeField] private HealItem itemPrefab; [Tooltip("ゲーム開始時に用意する個数")] [SerializeField] private int poolSize = 5; private readonly Queue _availableItems = new(); private readonly HashSet _activeItems = new(); // ゲーム開始時に必要な個数をまとめて生成する private void Awake() { for (var i = 0; i < poolSize; i++) CreateItem(); } // Prefabから生成し、利用可能なアイテムとして保管する private void CreateItem() { var item = Instantiate(itemPrefab, transform); item.Initialize(this); item.gameObject.SetActive(false); _availableItems.Enqueue(item); } // 利用可能なアイテムを指定位置へ配置する public bool TrySpawn(Vector3 position, Quaternion rotation) { // 固定容量のプールなので、足りない場合は追加生成しない if (_availableItems.Count == 0) return false; var item = _availableItems.Dequeue(); // 貸し出し中のアイテムはScene直下へ出し、指定位置に置く item.transform.SetParent(null); item.transform.SetPositionAndRotation( position, rotation); item.PrepareForSpawn(); _activeItems.Add(item); item.gameObject.SetActive(true); return true; } // 使用済みのアイテムを無効化してプールへ戻す public void Release(HealItem item) { // 貸し出し中ではないアイテムの二重返却を防ぐ if (!_activeItems.Remove(item)) return; item.gameObject.SetActive(false); item.transform.SetParent(transform); _availableItems.Enqueue(item); } }