코린이 부트캠프 일상

유니티 풀매니저

게발인개발자 2023. 12. 11. 19:51

강의로 보면서 게임을 만드는 과정에서 PoolManager를 배습니다.

화살을 발사하여 몬스터를 없애는 기본 게임

보통 저렇게 화살을 생성하기 위해 화살을 Prefabs로 만들어주고 Instantiate와 Destroy를 활용해서 화살을 관리 해줬었다.

하지만 이렇게 관리하게 되면 두 함수들이 상당히 많은 메모리를 잡아먹게 됩니다. 따라서 화살이 필요할 때 새로 생성하는 것이 아닌 오브젝트 풀매니저에게 미리 생성해둬서 필요한 만큼 쓰고 반환하는 방식인 PoolManager를 사용한다고 합니다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SearchService;

public class ObjectPool : MonoBehaviour //pool스크립트 만들기
{
    [System.Serializable] 
    
    public struct Pool //pool 구조체 만들기
    {
        public string tag;
        public GameObject prefab;
        public int size;
    }

    public List<Pool> pools;
    public Dictionary<string, Queue<GameObject>> poolDictionary;

    private void Awake()
    {
        poolDictionary = new Dictionary<string, Queue<GameObject>>();
        foreach (var pool in pools)
        {
            Queue<GameObject> objectPool = new Queue<GameObject>();
            for (int i = 0; i < pool.size; i++)
            {
                GameObject obj = Instantiate(pool.prefab);
                obj.SetActive(false);
                objectPool.Enqueue(obj);
            }
            poolDictionary.Add(pool.tag, objectPool);

        }
    }
    public GameObject SpawnFromPool(string tag)
    {
        if (!poolDictionary.ContainsKey(tag))
            return null;

        GameObject obj = poolDictionary[tag].Dequeue();
        poolDictionary[tag].Enqueue(obj);

        return obj;
    }
}

.Tag에 풀매니저 적용할 Prefab 태그 적어주고 해당 오브젝트 주입 사이즈에 미리 생성해둘 갯수 설정

 

20개를 풀에 생성한 뒤 필요한 만큼 사용하고 사용하지 않는 오브젝트는 반환하는 방식으로 변경