공부/Unity

[Unity] 오브젝트 풀링 - Component 이용

굴러다니다니 2025. 8. 20. 11:58

아래처럼 코드를 생성

using System.Collections.Generic;
using UnityEngine;

public class ObjectPool<T> where T : Component
{
    private T prefab;
    private Queue<T> pool = new Queue<T>();

    public ObjectPool(T prefab, int initialSize)
    {
        this.prefab = prefab;
        for (int i = 0; i < initialSize; i++)
        {
            T obj = GameObject.Instantiate(prefab);
            obj.gameObject.SetActive(false);
            pool.Enqueue(obj);
        }
    }

    public T Get(Transform parent = null)
    {
        T obj;
        if (pool.Count > 0)
        {
            obj = pool.Dequeue();
        }
        else
        {
            obj = GameObject.Instantiate(prefab);
        }
        obj.gameObject.SetActive(true);
        if (parent != null) obj.transform.SetParent(parent);
        return obj;
    }

    public void ReturnToPool(T obj)
    {
        obj.gameObject.SetActive(false);
        pool.Enqueue(obj);
    }
}

 

기존에 instantiate하는 코드 안에 

ObjectPool<Enemy> enemyPool;

이런식으로 생성하고자 하는 타입, pool 선언을 해주고

private void Awake()
{
    enemyPool = new ObjectPool<enemy>(enemyPrefab.GetComponent<enemy>(), 64);
}

이런식으로 시작할 때 연결해준다. prefab도 연결해줘야됨

 

그리고 instantiate로 생성했던 부분마다 pool.Get(); 해준다

GameObject enemy = Instantiate(enemyPrefab, enemyHolder);
=>
GameObject enemy = chessPool.Get(enemyHolder).gameObject;

이렇게 사용

Destroy(enemies[x, y]);
=> 
enemyPool.ReturnToPool(enemies[x,y].GetComponent<Enemy>());

나는 이런식으로 써줬는데 각자 원하는 타입에 맞춰 뒷부분은 바꾸면 되겠고

pool.ReturnToPool 사용하면 된다

728x90
반응형