private void DestroyAllEnemies()
{
ObjectManager.PoolType[] enemyTypes =
{
ObjectManager.PoolType.EnemyMini1, ObjectManager.PoolType.EnemyElite1, ObjectManager.PoolType.EnemyElite2
}; // 적 종류
foreach (var type in enemyTypes)
{
GameObject[] enemies = ObjectManager.Instance.GetObjects(type); // 해당 타입에 해당되는 enemy 모두 가져옴
foreach (var enemy in enemies) // 배열로 가져온 enemy 각 개체에 접근
{
if (enemy.activeSelf)
{
enemy.GetComponent<EnemyHealth>()?.TakeDamaged(int.MaxValue);
}
}
}
아이템 사용(필살기) 시 GetActiveObjects 메서드를 통해 적 type을 가져오고
무조건 적이 제거될 수 있도록 int.MaxValue를 사용했다.
근데, 아이템을 사용해도 적이 제거되지 않는 문제가 발생
기존 오브젝트 풀링 매니저는 비활성화된 오브젝트만 저장하고 있어 제거가 되지 않았다.
딕셔너리에 List<GameObject> ActiveObject를 추가하여 활성화된 오브젝트를 가져오는 방식으로 해결하였다.
public class ObjectManager : MonoBehaviour
{
public static ObjectManager Instance { get; private set; }
... 생략
private Dictionary<PoolType, Queue<GameObject>> PoolDictionary = new Dictionary<PoolType, Queue<GameObject>>();
private Dictionary<PoolType, List<GameObject>> ActiveObjects = new Dictionary<PoolType, List<GameObject>>(); // 추가
private void Awake()
{
if (Instance == null)
{
Instance = this;
}
else
{
Destroy(gameObject);
}
foreach (var pool in PoolList)
{
Queue<GameObject> queue = new Queue<GameObject>();
List<GameObject> activeList = new List<GameObject>(); // 추가
for (int i = 0; i < pool.size; i++)
{
GameObject obj = Instantiate(pool.prefab);
obj.SetActive(false);
queue.Enqueue(obj);
}
PoolDictionary.Add(pool.key, queue);
ActiveObjects.Add(pool.key, activeList); // 추가
}
}
public GameObject GetObject(PoolType key)
{
if (PoolDictionary.ContainsKey(key) && PoolDictionary[key].Count > 0)
{
GameObject obj = PoolDictionary[key].Dequeue();
obj.SetActive(true);
ActiveObjects[key].Add(obj); // 추가
return obj;
}
return null;
}
public void ReturnObject(PoolType key, GameObject obj)
{
if (!PoolDictionary.ContainsKey(key)) return;
obj.SetActive(false);
PoolDictionary[key].Enqueue(obj);
ActiveObjects[key].Remove(obj); // 추가
}
public GameObject[] GetObjects(PoolType key)
{
return PoolDictionary[key].ToArray();
}
// ✅ 활성화된 오브젝트만 가져오는 함수
public GameObject[] GetActiveObjects(PoolType key)
{
return ActiveObjects[key].ToArray();
}
}
'개발일지' 카테고리의 다른 글
리소스 데이터 관리(제네릭 T, TryGetValue, TryAdd) (0) | 2025.04.08 |
---|---|
매개변수 타입이 다른 경우 값을 넣는 방법 [Enum <-> List] (0) | 2025.03.29 |
Enum 사용하기 (0) | 2025.03.26 |
SceneManager.GetActiveScene(), AddListener (0) | 2025.03.21 |
플레이어까지 거리(벡터) 구하기 (0) | 2025.03.19 |