자료 관리

오브젝트 풀링

noc777 2024. 10. 23. 14:45

Object Pooling 방식은 오브젝트를 미리 생성해두어 비활성화 시켜두었다가 적절한 때에 활성화시켜 동작시키는 형태입니다.

 

왜 Object Pooling 을 쓰는가

Object Pooling 을 쓰는 이유는 오브젝트를 생성하고 파괴하는데 드는 동작비용이 있기 때문입니다.

 

public class ObjectPool : MonoBehaviour
{
    // 오브젝트 풀링을 할 게임오브젝트 프리팹
    public GameObject prefab;
    private List<GameObject> pool = new List<GameObject>();
    private int poolSize = 300; // 최소 300의 반복의 조건을 받음
   
    void Start()
    {
        for (int i = 0; i < poolSize; i++) //시작할 때 poolSize 만큼 prefab을 만들어 놓기위해 반복문
        {
            GameObject obj = Instantiate(prefab); //prefab을 생성한 후 obj 에 할당
            Release(obj); //비활성화하는 메서드
            pool.Add(obj); //리스트 pool에 Add로 저장 
        }
    }
    
    public GameObject Get()
    {
        for (int i =0; i < pool.Count; i++) //비활성화 된 것을 찾아 쓰기위해 조건문
        {
            if (!pool[i].activeInHierarchy) //만약 pool의 i번째가 비활성화라면(activeInHierarchy는 유니티 에디터 Hierarchy 창 상에서 활성화여부를 나타냄)
            {
                pool[i].SetActive(true); //비활성화된 개체를 활성화
                return pool[i]; //활성화하고나서 반환 (메서드 종료)
            }   
        }
        GameObject obj = Instantiate(prefab); // 조건 ,  비활성화 된 것이 없다면 새로 프리팹을 만들고 obj에 할당
        pool.Add(obj); //pool 리스트에 추가하고
        return obj; //그것을 반환 (메서드 종료)
    }

    public void Release(GameObject obj)
    {
        obj.SetActive(false); //게임 오브젝트 obj를 비활성화
    }
}

처음 만들 때

오브젝트 풀링을 적용시킬 오브젝트 프리팹 

오브젝트를 넣을 자료구조

풀의 크기를 나타낼 수 있는 int 값을 설정해두었습니다.

 

start나 awake 안에 오브젝트를 생성하고 생성한 오브젝트를 비활성화 시켜 자료구조에 넣어주는 로직을 작성하고

 

Get 메서드는 따로 필요한 때에 활성화시켜 쓸 수 있도록 GameObject 값을 외부로 반환하는 메서드로 활성화 되었을 때의 특성은 외부에서 구현하여 주면된다.

 

Release 메서드는 오브젝트를 비활성화시키는데 여기선 start에서 오브젝트를 비활성화 시킬 때도 쓰였으며 

외부에서 호출할 땐 쓰임을 다하였을 때 풀에 반환하는 용도로 사용하면 될 것 같다.

 

비활성화 시키기만 하여도 되는 이유는 이미 리스트안에 들어가있는 프리팹이기에 Hirerarchy에서 활성화하고 비활성화되더라도 리스트 안에 그대로 있기 때문에 다음 차례가 왔을 때도 재활용이 가능한 것이다. 

'자료 관리' 카테고리의 다른 글

out ref 키워드  (0) 2024.10.25
시간 복잡도  (0) 2024.10.23
RayCast  (0) 2024.10.23
Rigidbody - ForceMode  (1) 2024.10.22
유니티 인풋 필드(Input Field)  (1) 2024.10.12