[내배캠] 유니티 심화 팀프로젝트#2

Sungchan Ahn(안성찬)·2024년 11월 18일

내일배움캠프

목록 보기
64/104

문제점

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가 발생할 수 있다.

해결

  1. DestroyImmediate 사용 : 오브젝트를 즉시 파괴할 수 있다. 다만 여러 오류를 발생시킬 가능성이 크기 때문에 실제로 사용하는 것은 지양해야 한다.

  2. 중복 호출 방지 조건 추가

  3. 오브젝트풀에서 꺼내쓰다가 SetActive(false)로 비활성화하는 경우에는 collider와 관련된 Trigger 이벤트가 즉시 중단되기 때문에 두 번 호출될 가능성은 거의 없다. 어차피 오브젝트풀을 사용할 예정이기 때문에 해결될 것으로 보인다.
    다만 타이밍이 맞지 않으면 어떻게 될지 모르기 때문에 중복 방지 조건을 추가하는 것이 좋아보인다.

profile
게임 개발 기록

0개의 댓글