상세 컨텐츠

본문 제목

1011 TIL - Unity 오브젝트 풀링

스파르타 코딩캠프/'24 Today I Learned

by lucar 2024. 10. 12. 00:50

본문

오브젝트 풀이란?

 

예를 들어서 종이동 식 슈팅게임 이를테면 1945같은 게임인데

출처 : 구글플레이

옛날에 오락실 좀 다녀보신 분들은 다들 아실껀데

이런 비슷한 슈팅게임을 만든다고 쳤을 때

적이나 내가 발사된 총알이 삭제되지 않고 계속 게임 데이터에 남아있다면

메모리에 큰 영향을 미치게 될 것이다.

 

그래서 Destroy(GameObject)를 쓰는거 아닌가요? 싶은데

Instance와 Destroy를 통해 연산을 계속 만들기 때문에 그렇게 막 남아도는 장사는 아니다.

 

하지만 오브젝트 풀링 기법을 사용하면 일정 수의 탄환을 미리 만들어놓고

발사되면 SetActive true상태가 되어 화면에 비춰졌다가 충돌이 발생하거나 게임 화면 밖으로 나가면

SetActive를 false로 바꾸어 그냥 켰다 껐다만 하면 된다.

 

최초의 로딩 중에 메모리에 오브젝트 풀을 올려놓고 나면 이 후로는

추가적인 연산이라고 해봐야 SetActive밖에 없는 것이다.

 

보시는 바와 같이 이미 생성되어있는 클론이 활성화 되며 모든 클론이 활성화되면

먼저 활성화 된 순서대로 지워진다.

 

public class ObjectPool : MonoBehaviour
{
    [System.Serializable]
    public class Pool
    {
        public string tag;
        public GameObject prefab;
        public int size;
    }

    public List<Pool> pools = new List<Pool>();
    public Dictionary<string, Queue<GameObject>> PoolDictionary;

    private void Awake()
    {
        PoolDictionary = new Dictionary<string, Queue<GameObject>>();

        foreach (var pool in pools)
        {
            Queue<GameObject> queue = new Queue<GameObject>();
            for (int i = 0; i < pool.size; i++)
            {
                GameObject obj = Instantiate(pool.prefab);
                obj.SetActive(false);
                queue.Enqueue(obj);
            }

            PoolDictionary.Add(pool.tag, queue);
        }
    }

    public GameObject SpawnFromPool(string tag)
    {
        if(!PoolDictionary.ContainsKey(tag))
        {
            return null;
        }
        GameObject obj = PoolDictionary[tag].Dequeue();
        PoolDictionary[tag].Enqueue(obj);

        obj.SetActive(true);
        return obj;
    }
}

관련글 더보기