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 |