Projext/Assets/Scripts/Systems/ObjectPool/GenericObjectPool.cs

50 lines
3.4 KiB
C#
Raw Normal View History

2026-02-12 15:23:25 +00:00
using System.Collections.Generic; // 리스트와 딕셔너리 기능을 사용할거에요 -> System.Collections.Generic을
using UnityEngine; // 유니티 엔진의 기본 기능을 불러올거에요 -> UnityEngine을
2026-02-02 08:30:23 +00:00
2026-02-12 15:23:25 +00:00
public class GenericObjectPool : MonoBehaviour // 클래스를 선언할거에요 -> MonoBehaviour를 상속받는 GenericObjectPool을
2026-02-02 08:30:23 +00:00
{
2026-02-12 15:23:25 +00:00
public static GenericObjectPool Instance; // 변수를 선언할거에요 -> 싱글톤 인스턴스인 Instance를
2026-02-02 08:30:23 +00:00
2026-02-12 15:23:25 +00:00
[System.Serializable] // 직렬화할거에요 -> 인스펙터에서 수정 가능하게 Pool 클래스를
public class Pool // 내부 클래스를 선언할거에요 -> 풀 정보를 담을 Pool을
2026-02-02 08:30:23 +00:00
{
2026-02-12 15:23:25 +00:00
public string tag; // 변수를 선언할거에요 -> 풀의 태그 이름을 tag에
public GameObject prefab; // 변수를 선언할거에요 -> 생성할 프리팹을 prefab에
public int size; // 변수를 선언할거에요 -> 미리 생성할 개수를 size에
2026-02-02 08:30:23 +00:00
}
2026-02-12 15:23:25 +00:00
public List<Pool> pools; // 리스트를 선언할거에요 -> 설정된 풀 목록을 pools에
public Dictionary<string, Queue<GameObject>> poolDictionary; // 딕셔너리를 선언할거에요 -> 태그별 오브젝트 큐를 관리할 poolDictionary를
2026-02-02 08:30:23 +00:00
2026-02-12 15:23:25 +00:00
private void Awake() // 함수를 실행할거에요 -> 스크립트 시작 시 Awake를
2026-02-02 08:30:23 +00:00
{
2026-02-12 15:23:25 +00:00
Instance = this; // 값을 저장할거에요 -> 내 자신을 싱글톤 인스턴스에
poolDictionary = new Dictionary<string, Queue<GameObject>>(); // 초기화할거에요 -> 딕셔너리를 새로 생성해서
2026-02-02 08:30:23 +00:00
2026-02-12 15:23:25 +00:00
foreach (Pool pool in pools) // 반복할거에요 -> 설정된 모든 풀 정보에 대해
2026-02-02 08:30:23 +00:00
{
2026-02-12 15:23:25 +00:00
Queue<GameObject> objectPool = new Queue<GameObject>(); // 큐를 생성할거에요 -> 오브젝트를 담을 큐를
for (int i = 0; i < pool.size; i++) // 반복할거에요 -> 설정된 사이즈만큼
2026-02-02 08:30:23 +00:00
{
2026-02-12 15:23:25 +00:00
GameObject obj = Instantiate(pool.prefab); // 생성할거에요 -> 프리팹을 인스턴스로
obj.SetActive(false); // 기능을 껄거에요 -> 생성된 오브젝트를 비활성화 상태로 (보관)
objectPool.Enqueue(obj); // 추가할거에요 -> 큐에 오브젝트를
2026-02-02 08:30:23 +00:00
}
2026-02-12 15:23:25 +00:00
poolDictionary.Add(pool.tag, objectPool); // 추가할거에요 -> 딕셔너리에 태그와 큐를
2026-02-02 08:30:23 +00:00
}
}
// ⭐ 몹을 꺼내 쓸 때 호출 (Instantiate 대신 사용)
2026-02-12 15:23:25 +00:00
public GameObject SpawnFromPool(string tag, Vector3 position, Quaternion rotation) // 함수를 선언할거에요 -> 풀에서 오브젝트를 꺼내는 SpawnFromPool을
2026-02-02 08:30:23 +00:00
{
2026-02-12 15:23:25 +00:00
if (!poolDictionary.ContainsKey(tag)) return null; // 조건이 맞으면 반환할거에요 -> 태그가 없다면 null을
2026-02-02 08:30:23 +00:00
2026-02-12 15:23:25 +00:00
GameObject objectToSpawn = poolDictionary[tag].Dequeue(); // 꺼낼거에요 -> 큐의 맨 앞 오브젝트를
objectToSpawn.SetActive(true); // 기능을 켤거에요 -> 오브젝트를 활성화해서
objectToSpawn.transform.position = position; // 위치를 설정할거에요 -> 지정된 위치로
objectToSpawn.transform.rotation = rotation; // 회전을 설정할거에요 -> 지정된 회전으로
2026-02-02 08:30:23 +00:00
2026-02-12 15:23:25 +00:00
poolDictionary[tag].Enqueue(objectToSpawn); // 추가할거에요 -> 다시 큐의 맨 뒤로 (재사용 대기)
return objectToSpawn; // 반환할거에요 -> 꺼낸 오브젝트를
2026-02-02 08:30:23 +00:00
}
}