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
|
|
|
|
}
|
|
|
|
|
|
}
|