기본 패턴
csharp
GameObject item = pool[index];
item.SetActive(true);설명
- 오브젝트 풀링은 필요할 때마다
Instantiate와Destroy를 반복하지 않고, 미리 만들어 둔 오브젝트를 껐다 켰다 하며 재사용하는 방식입니다. - 총알, 폭발 이펙트, 데미지 숫자처럼 짧은 생명주기를 자주 반복하는 대상에 잘 맞습니다.
- 초기 생성 비용과 런타임 성능을 맞바꾸는 전략이므로, 너무 큰 풀을 무조건 만드는 것도 좋은 선택은 아닙니다.
- 풀에서 꺼낼 때는 상태 초기화가 함께 이뤄져야 재사용 버그가 줄어듭니다.
짧은 예제
csharp
[SerializeField] private GameObject bulletPrefab;
private readonly List<GameObject> pool = new();
private GameObject GetBullet()
{
foreach (GameObject item in pool)
{
if (!item.activeSelf)
{
item.SetActive(true);
return item;
}
}
GameObject created = Instantiate(bulletPrefab);
pool.Add(created);
return created;
}빠른 정리
| 항목 | 설명 |
|---|---|
| 사전 생성 | 미리 오브젝트를 준비 |
| 재사용 | 비활성 오브젝트를 다시 활성화 |
| 성능 | 생성/삭제 비용과 GC 부담 완화 |
| 상태 초기화 | 위치, 속도, 타이머를 다시 맞춤 |
| 적용 대상 | 총알, 이펙트, UI 숫자 등 |
주의할 점
풀링은 만능 최적화가 아닙니다. 재사용할 때 상태를 제대로 초기화하지 않으면 이전 사용 흔적이 남아 디버깅이 더 어려워질 수 있습니다.
참고 링크
2 sources