Unity/트러블 슈팅

[Unity] 오브젝트 풀링 트러블 슈팅

turbulence93 2025. 7. 9. 22:06

문제 상황

오브젝트 풀에서 발사체를 최대 10개까지 등록했는데,
일정 횟수 이후부터는 Get()이 되지 않고 발사체가 안 나오는 현상이 발생함.
풀 자체는 비어 있지 않은 상태인데도 사용 가능한 객체가 없다고 판단되는거 처럼 보임.


원인 분석

발사체는 풀에서 꺼냈을 때 일정 시간 동안만 유지되고,
duration이 지난 후 자동으로 Release되어야 다시 풀에 반환됨.

그런데 OnGet 시점에 duration 값이 초기화되지 않아
기존에 남아있던 과거의 값이 유지된 상태로 동작함.
결과적으로 duration이 Release 되는 시간에 멈춰 있어 수명이 끝났다고 판단되어 Release()가 바로 호출됨

즉, 재사용되는 발사체가 제대로 초기화되지 않아서 생성과 동시에 반환 됨


해결 방법

오브젝트 풀에서 객체를 꺼낼 때(OnGet 시점),
발사체의 수명(duration) 및 내부 상태를 명시적으로 초기화하도록 수정.

내부에서 모든 초기 상태를 설정하도록 분리하여
풀에서 꺼낼 때마다 항상 동일한 상태에서 시작되도록 보장함.


개인적인 생각

풀을 쓰는건 정말 효율적이지만, 객체의 상태 관리에 소홀하면 오히려 문제를 유발할 수 있게 된다.
특히 MonoBehaviour 기반 객체는 꺼낼 때의 상태가 실행 흐름에 직접 영향을 미치기 때문에
명시적으로 초기화하여 관리하는 것이 중요하다.

초기화 로직을  설계하는 습관이 시스템 안정성에 매우 중요하다는 걸 다시 한 번 느꼈다.