오브젝트 풀링을 이용해서 GC 문제를 잡았다고 생각했는데 유니티의 프로파일러를 통해서 확인해보니 중간에 GC에 의해 프레임이 치솟문 문제를 확인했습니다.

위의 상황처럼 성능 테스트 중 녹빛의 GC 컬렉터에 의한 점유율이 70퍼센트를 먹을 정도로 높아지게 되었습니다.
오브젝트 풀링을 사용하고, 현재는 탄환 발사 이외에는 다른 동작을 하고 있지 않아 원인 분석이 쉬웠고, 이에 대한 이유는
아래의 사진에서 확인할 수 있었습니다.

이 사진에서 보듯이 사용이 끝난 오브젝트인데도 풀로 돌아가지 않는 문제가 있었고, 이를 처리해줘야 했습니다.
여러가지로 문제 상황을 고민해보고 다양한 시도를 해봤습니다만, 가장 효과적이고 직관적이었던 해결책은 아래와 같았습니다.

기존에는 Sprite 자체를 부모 객체에서 관리하고 있었으나 이를 분리했습니다.
이미 PoolManager에서 SetActive() 를 관리하고 있었는데도, 추가적으로

이렇게 공격을 발사하는 과정에서 Init 이전에 SetActive를 false로 해주는 과정이 있었고
이 도중 Init을 시켜주기 전에 발사를 주도하는 객체가 파괴되면 문제가 발생했던 것이었습니다.
때문에, PoolObject가 있어 상시 확인해주어야 하는 부모를 상위로 빼고, Sprite는 자식 오브젝트로 두어 키고 끌 수 있도록 했습니다.

하지만 그럼에도 아직까지 객체가 남아있는 경우가 있었습니다.
이는 도착 직후고 발사한 객체가 사라졌을때, 목표 오브젝트가 진행중에 사라졌을때 발생했던 문제로
이미 화살 Sprite의 오브젝트가 꺼져있다면 || Tween 애니메이션이 완료되었다면 || 적에게 맞은것이 체크 되었다면
이 3가지를 기준으로 특정 시간마다 자기 자신을 반환해야하는지 체크하는 부분을 추가해 주었습니다