private void OnTriggerEnter(Collider other)
{
ICollisionHandler collisionable = other.gameObject.GetComponent<ICollisionHandler>();
if (collisionable != null)
{
collisionable.OnPlayerHit();
}
}
위 코드의 OnPlayerHit()에서 충돌한 오브젝트를 Destroy(gameObject)를 통해 파괴했는데, 파괴되기 전에 OnTriggerEnter가 한 번 더 동작하여 한 번만 실행되어야 할 OnPlayerHit() 메서드가 두 번 실행되어 문제가 발생함
유니티의 물리 시스템과 Destroy 메서드의 호출 타이밍 차이에서 파괴되기 전 한 번 더 OnTriggerEnter가 발생할 수 있다. 유니티에서 Destroy는 즉각적으로 실행되지 않고, 해당 프레임이 끝난 후에 제거되는데, 물리 시스템에서 그 사이에 OnTriggerEnter가 발생할 수 있다.
DestroyImmediate 사용 : 오브젝트를 즉시 파괴할 수 있다. 다만 여러 오류를 발생시킬 가능성이 크기 때문에 실제로 사용하는 것은 지양해야 한다.
중복 호출 방지 조건 추가
오브젝트풀에서 꺼내쓰다가 SetActive(false)로 비활성화하는 경우에는 collider와 관련된 Trigger 이벤트가 즉시 중단되기 때문에 두 번 호출될 가능성은 거의 없다. 어차피 오브젝트풀을 사용할 예정이기 때문에 해결될 것으로 보인다.
다만 타이밍이 맞지 않으면 어떻게 될지 모르기 때문에 중복 방지 조건을 추가하는 것이 좋아보인다.