[Memo-Unity] 10. 오브젝트 풀(ObjectPool)

업데이트:

카테고리:

태그: ,




오브젝트 풀(ObjectPool)

오브젝트 풀(ObjectPool)








오브젝트 풀

프리팹 -> 인스턴스화 setactive.False -> 오브젝트풀 -> 활성화 -> 실제 오브젝트 -> 사용한 오브젝트 false -> 다음에 재사용

이유 : 성능향상, 메모리 관리
활용 : 총알, 적 캐릭터

1) 미리 생성하는 방식

문제점 오브젝트 생성할때 너무 많으면 로딩이 오래걸릴 수 있다.

public class ObjectPool : MonoBehaviour
{
    public GameObject prefab;
    public int poolSize;

    private List<GameObject> objectPool;

    private void Start()
    {
        objectPool = new List<GameObject>();

        for (int i = 0; i < poolSize; i++)
        {
            GameObject obj = Instantiate(prefab, transform);
            obj.SetActive(false);
            objectPool.Add(obj);
        }
    }

    public GameObject GetObjectFromPool()
    {
        foreach (GameObject obj in objectPool)
        {
            if (!obj.activeInHierarchy)
            {
                obj.SetActive(true);
                return obj;
            }
        }

        return null;
    }
}

오브젝트를 다 썻는데 더 필요할 때 오래된걸 지우고 가져오기.
dequeue(오래된거 뺴기) -> enqueue(다시 pool)

2) 동적 오브젝트 풀

public class ObjectPool : MonoBehaviour
{
    public GameObject prefab;
    public int initialPoolSize; // 100
    public int maxPoolSize; // 10000

    private List<GameObject> objectPool;

    private void Start()
    {
        objectPool = new List<GameObject>();

        for (int i = 0; i < initialPoolSize; i++)
        {
            GameObject obj = Instantiate(prefab, transform);
            obj.SetActive(false);
            objectPool.Add(obj);
        }
    }

    public GameObject GetObjectFromPool()
    {
        foreach (GameObject obj in objectPool)
        {
            if (!obj.activeInHierarchy)
            {
                obj.SetActive(true);
                return obj;
            }
        }

        if (objectPool.Count < maxPoolSize)
        {
            GameObject obj = Instantiate(prefab, transform);
            objectPool.Add(obj); 
            obj.SetActive(true);
            return obj;
        }
        else
        {
            // 풀에 더 이상 생성할 수 없음
            return null;
        }
    }
}

3) 유니티 내장 함수

Objectpool()
image

Objectpool()

using UnityEngine;
using UnityEngine.Pool;

public class BulletPoolExample : MonoBehaviour
{
    public GameObject bulletPrefab;

    private ObjectPool<GameObject> bulletPool;

    private void Start()
    {
        bulletPool = new ObjectPool<GameObject>(
            createFunc: () => Instantiate(bulletPrefab), // 오브젝트 생성 방법
            actionOnGet: (obj) => obj.SetActive(true),   // 오브젝트를 풀에서 가져올 때 실행할 액션
            actionOnRelease: (obj) => obj.SetActive(false), // 오브젝트를 풀에 반환할 때 실행할 액션
            actionOnDestroy: (obj) => Destroy(obj),     // 오브젝트를 파괴할 때 실행할 액션
            defaultCapacity: 10,                        // 초기 용량
            maxSize: 20                                 // 최대 용량
        );
    }

    public GameObject GetBullet()
    {
        return bulletPool.Get();
    }

    public void ReturnBullet(GameObject bullet)
    {
        bulletPool.Release(bullet);
    }
}

언제사용?
오브젝트의 생성과 파괴가 계속 일어난다.
오브젝트를 많이 생성해야된다. (30개 이상)
생성관리를 체계적으로 하고 싶다.




[Unity] 오브젝트 풀(ObjectPool)
TOP


📔

댓글남기기