- 오브젝트 풀링(Object Pooling)이란?

반복적으로 사용되는 객체를 효율적으로 관리하는 생성 패턴으로

게임을 예시로 들자면 슈팅, FPS, TPS 게임 같이 같은 탄환이 여러 개가 발사되는 경우

탄환 객체 생성을 최적화 하기 위해 적용하는 객체 재사용 기법이다!


- 오브젝트 풀링 예시 [Unity]

- 탄환 오브젝트 풀링 코드

public class BulletPool : MonoBehaviour
{
    [SerializeField]
    private GameObject bulletPrefab;
    [SerializeField]
    private int poolSize = 10;  // 풀 사이즈

    [SerializeField] 
    private Transform parentTransform;  // 부모 오브젝트의 Transform
    [SerializeField] List<GameObject> bulletPool;


    void Awake()
    {
        bulletPool = new List<GameObject>();

        for (int i = 0; i < poolSize; i++)
        {
            // GameObject bullet = Instantiate(bulletPrefab);
            GameObject bullet = Instantiate(bulletPrefab, parentTransform);  // 부모를 지정하여 총알 생성
            bullet.SetActive(false);
            bulletPool.Add(bullet);
        }
    }

    public GameObject GetBullet()
    {
        foreach (var bullet in bulletPool)
        {
            if (!bullet.activeInHierarchy)
            {
                bullet.SetActive(true);
                return bullet;
            }
        }
        GameObject newBullet = Instantiate(bulletPrefab);
        bulletPool.Add(newBullet);
        return newBullet;
    }

    public void ReturnBullet(GameObject bullet)
    {
        bullet.SetActive(false);
    }
}

오브젝트 풀링을 적용한 부분

1. 미리 총알을 프리팹으로 저장한다!  -   Awake( ) 부분

    void Awake()
    {
        bulletPool = new List<GameObject>();

        for (int i = 0; i < poolSize; i++)
        {
            // GameObject bullet = Instantiate(bulletPrefab);
            GameObject bullet = Instantiate(bulletPrefab, parentTransform);  // 부모를 지정하여 총알 생성
            bullet.SetActive(false);
            bulletPool.Add(bullet);
        }
    }

 

poolSize만큼 Instantiate()를 호출해서 총알 프리팹을 미리 생성해 리스트에 저장시킨다!


2. 비활성화 된 총알을 재사용 시킨다!  -   GetBullet() 부분

    public GameObject GetBullet()
    {
        foreach (var bullet in bulletPool)
        {
            if (!bullet.activeInHierarchy)
            {
                bullet.SetActive(true);
                return bullet;
            }
        }
        GameObject newBullet = Instantiate(bulletPrefab);
        bulletPool.Add(newBullet);
        return newBullet;
    }

 

foreach 문을 통해 Pool에서 비활성화된 총알을 찾아 활성화 후 반환시킨다!


3. 사용이 끝난 총알을 다시 비활성화 시킨다!   -   ReturnBullet() 부분

    public void ReturnBullet(GameObject bullet)
    {
        bullet.SetActive(false);
    }

SetActive(false)를 호출시켜서 다시 Pool에 반환한다는 뜻이다!


 

총알뿐만 아니라 등장하는 적이 같은 종류일때 오브젝트 풀링을 적용시킬 수 있다!

 

오브젝트 풀링 예시 테스트

 

+ Recent posts