플레이어가 원거리 공격 (투사체 발사)을 할 때, 투사체 오브젝트를 새로 생성-파괴 해서 사용하는 것이 아닌, 미리 오브젝트를 비활성화 상태로 만들어두고 활성/비활성화를 통해 재활용하는 오브젝트 풀링 방식을 사용하고 있었다.

투사체 오브젝트에 부착 된 스크립트 중 일부 내용인데, 만약 투사체를 적중 시킬 다른 오브젝트(몬스터, 벽 등) 외에 투사체가 어느 정도 공중을 날아가다가 5초 뒤에 사라지도록 하는 코드를 Invoke 구현했었다.
다만 이런 방식으로 하니, 종종 투사체가 5초가 지나도 사라지지 않는 문제가 발생했다.
정확히 말하자면, 예를 들어 오브젝트 풀링을 할 투사체의 갯수가 20개라면, 이 20개의 투사체 풀링 갯수 범위를 넘어서서 호출을 할 경우 투사체는 발사되지 않고, 그렇다고 이미 생성 된 투사체가 사라지지도 않는 문제였다.
어디까지 날아갈 셈이니
이 글을 쓰는 와중에도 날아가고 있다.
Start 메서드에 구현한 Invoke 비활성화 방식은, 스크립트가 활성화되면 설정된 시간이 지난 후 한 번만 특정 메소드를 호출한다.
그러나 연속적으로 투사체를 발사할 경우, 비활성화 된 투사체가 재활용 되기 전에 Invoke로 설정된 예정 시간에 호출이 되었고, 이로 인해 동기화 문제가 발생한 것이다.
(오브젝트가 비활성화되었을 때 Invoke가 여전히 실행될 경우 문제가 발생 한 것)

OnEnable과 코루틴을 사용하는 방식으로 변경했다.
각각 투사체가 활성화될 때마다 자신의 비활성화 로직을 리셋하고 관리한다.
이는 객체 자신의 활성, 비활성화까지의 시간을 개별적으로 계산하기 때문에, 각 투사체가 독립적으로 일정 시간 후에 비활성화 된다.
결과적으로 Invoke 방식을 사용 할 때의 오브젝트 풀 안에 투사체를 전부 사용 + 다음 투사체가 준비 될 때까지 공격을 호출해도 동기화 문제는 해결되었다.