Game Engine/Unity

[Unity] 터널링(Tunneling)과 Collision Detection

양양줘 2025. 4. 8. 12:01

유니티의 Rigidbody는 물리 컴포넌트로

물리 충돌을 할 경우 Collision 이벤트를 발생시킨다.

 

이때 이 Collision 충돌 감지를

어떤 방식으로 처리할지에 대한 속성

바로 Collision Detection 속성이다.

 

Collision Detection 속성은 4가지가 있고

기본 Discrete가 설정되어있다.

각 속성에 대한 이야기는 아래에서 하도록 하며

먼저 Collision 충돌 체크의 원리를 이야기해보겠다.

 

 

📌 Collision Detection을 상황에 맞게 써야하는 이유 - 충돌 누락, 터널링(Tunneling)

 유니티에서는 Rigidbody가 움직일 때, 프레임마다 콜라이더 위치를 계산해서 충돌을 체크하고있다.
 
>> 매 프레임
1. 현재 위치 → 다음 위치 이동
2. 두 위치 사이에서 충돌이 있는지 확인
3. 충돌이 감지되면 → OnCollisionEnter 등 호출
 
 
여기서 만약 현재 프레임에서는 충돌이 되지 않았는데, 오브젝트의 속도가 너무 빨라 다음 프레임에서 충돌했어야 할 오브젝트를 건너 뛴 위치에 포지션값이 계산된다면 Collision 을 감지할 수 없게 된다. 이러한 현상을 충돌 누락(통과 현상, tunneling) 이라고 하며 빠르게 움직이는 물체에서 충돌 연산을 할 때 발생한다.
 
이럴때 Collision Detection 속성을 설정하여 프레임 사이의 경로까지 고려한 충돌 감지 방식을 선택할 수 있다.
 
 
 

 

📌 Collision Detection 속성 

속성 설명 언제 사용하나요?
Discrete (기본값) 프레임마다 단순 위치 체크
 - 빠른 물체는 충돌 놓칠 수 있음
느리게 움직이는 물체
Continuous 이동 경로 상의 충돌 예측
총알, 화살처럼 빠른 물체가 정지된 벽과 충돌
Continuous Dynamic 본인과 상대의 이동경로상의 충돌 예측
빠르게 움직이는 물체끼리 충돌 
ex) bullet끼리의 충돌
Continuous Speculative 예측 기반의 충돌 감지
 - 움직이지 않아도 충돌 예측 (Rigidbody가 Sleep)
 - 위치 기반이 아닌, 형태(Shape) 기반으로 예측
 - 유니티에서 가장 안전한 충돌 체크 방식
작거나 얇은 오브젝트
이동 경로가 예측 불가능한 오브젝트

 

💡 Continuous 모드들에 대해서 조금더 자세히 보자면?

1. Continuous

  • 충돌 연산 원리
    Rigidbody가 움직일 때, 현재 위치 → 다음 위치까지의 경로를 선분으로 가정하고
    그 선분과 충돌체의 콜라이더가 겹치는지 계산한다.
  • 감지 대상 : 정적인 콜라이더

2. Continuous Dynamic

  • 충돌 연산 원리
    기본적으로 Continuous와 같으며 상대방의 경로까지 예측하여 충돌을 감지한다.
    상대의 경로까지 예측해야하기 때문에 상대 오브젝트도 ContinuousDynamic 설정을 해줘야한다.
  • 감지 대상 : 정적, 동적 콜라이더 모두(Rigidbody가 있고 ContinuousDynamic설정이 되어있어야함)

3. Continuous Speculative

  • 충돌 연산 원리
    프레임이 바뀌기 이전에 앞으로 부딪힐 수도 있을 것 같은 상황을 예측(speculate) 해서 미리 충돌 처리를 시도한다.
    때문에 가끔은 충돌 안 일어났는데 감지되는 false-positive 가능성이 있다.
  • 감지 대상 : 정적, 동적 콜라이더 모두

 

 

 

📌 주의할 점 

  • Continuous 모드들은 더 많은 연산을 요구하므로, 과도한 사용은 성능 저하를 일으킬 수 있다.
  • Continuous 모드는 Rigidbody끼리 충돌하면 감지 안 될 수도 있다. → 이때 ContinuousDynamic 필요.
  • Trigger와의 충돌에는 영향을 미치지 않는다. (OnTriggerEnter는 별개 시스템)

 

 

상황에 맞게 콜리션 디텍션을 설정하고

터널링을 방지하자!

하지만 컨티뉴어스를 남발하면...

성능이 매우 저하되니 진짜 필요한 곳에 설정하자!

 

 


 

wooj22 - Overview

🎮 Game Programmer. wooj22 has 22 repositories available. Follow their code on GitHub.

github.com

 

양우정

 

www.youtube.com