내일배움캠프/TIL

[내배캠][Unity6기][TIL] Trigger 트러블슈팅

binary는 호남선 2024. 11. 11. 23:15

요약

[ OnTriggerEnter 이벤트 발생 오류시 확인할 사항 ]

1. 트리거 대상인 두 물체 모두 Collider 있는지 확인(2D, 3D 환경에 맞는 컴포넌트인지 체크)

2. 트리거 대상 중 움직이는 오브젝트에 Rigidbody 있는지 확인

3. 트리거 대상 중 적어도 하나는 Collider에 isTrigger 체크되어있는지 확인

4. Collider 크기 확인

5. 컴포넌트가 각 오브젝트에 잘 붙어있는지 확인

6. Trigger 시에 실행될 로직 작성한 스크립트 붙어있는지 확인

7. Collider 컴포넌트 삭제했다가 다시 생성해보기

문제 상황

플레이어가 장애물을 지나갈 때 OnTriggerEnter 가 돼야 하는데 되지 않는 문제 발생

 

[ Player ]

- Rigidbody, isKinematic false

- Collider, IsTrigger false

- Player Tag

[ MovingObject ]

- Collider, IsTrigger true

- 충돌 판정 시 실행할 스크립트

/* MovingObject.cs */
private void OnTriggerEnter(Collider other)
{
    if (other.tag == "Player")
    {
        Debug.Log("Player entered");
        GameManager.Instance.GameOver();
    }
}

문제 분석

1. 위와 같이 현재 Trigger 대상인 두 오브젝트의 상태 확인

2. Unity Docs에서 Trigger Matrix 확인

(이전에 작성한 블로그 내용 참고 : https://lbtm.tistory.com/36)

OnTriggerEnter()

- 오브젝트가 서로 겹치는 이벤트 발생할 때 호출되는 함수

- 물리적 충돌이 필요하지 않고 닿았거나 특정 영역에 들어왔는지 확인하는 경우에 주로 사용

- Trigger matrix (0열이 자신, 0행이 상대), static은 Rigidbody없이 collider만 있는 상태

참고 : https://docs.unity3d.com/Manual/collider-types-interaction.html

https://docs.unity3d.com/ScriptReference/Collider.OnTriggerEnter.html

 

위 표를 현재 상황에 대입해보자면

Player: Rigidbody O, IsKinematic false, Collider O, IsTrigger false => Dynamic collider

Obstacle: Rigidbody X, Collider O, IsTrigger true => Static trigger collider

 

열이 자기 자신(움직이는 대상), 행이 부딪치는 대상으로 보면 Player가 5열, Obstacle이 4행

4행 5열은 트리거 발생하는 조건인 것을 확인!

 

3. 반대로 Player에서 OnTriggerEnter 발생하면 디버그로그 콘솔에 출력하도록 작성해도 실행 x

4. ......? 그럼 대체 왜 안될까...? 더 이것저것 시도해보다가 결국 튜터님께 질문!

문제 해결

튜터님께서도 문제 상황을 보시더니 이렇게 하면 원래 작동이 되는 것이 맞다고 하셨다!

혹시 Collider 컴포넌트를 삭제했다가 다시 생성하라고 해서 시도해보니 놀랍게도 실행이 되었다.

유니티 엔진 자체의 오류인 것 같다고 말씀해주셨다 ㅠㅠ 나중에 이렇게 확인해봐도 또 안되는 일이 생기면 Collider를 삭제했다가 다시 생성해보면 된다고 조언해주셨다!

2시간 붙잡고 있다 도저히 답이 안보여 빨리 질문드리러가서 해결이 되어 다행이다! (마참내!)