유니티 터널링 (Tunnelling) 현상이란 충돌 처리가 필요한 게임 오브젝트가 다른 충돌체를 뚫고 지나가는 현상을 말한다.
터널링이 발생하는 이유는
프레임 드랍 현상이나 물체가 너무 빨리 움직이는 이유 등으로
충돌 처리가 제대로 이루어지지 않으면 발생할 수 있다
프레임 드랍과 이벤트 함수 호출 주기
유니티의 Update의 호출 간격은 일정하지 않기때문에
void Update()
{
transform.position += (Direction) * moveSpeed * Time.deltaTime;
}
위처럼 Update 함수에서 물체를 움직이게 되면
Time.deltaTime의 시간이 프레임에 따라 변동됨으로 의도한 일정한 moveSpeed 만큼의 이동이 이루어지지 않을 수 있다.
따라서 일정한 비율만큼의 이동을 위해서는
void FixedUpdate()
{
transform.position += (Direction) * moveSpeed * Time.fixedDeltaTime;
}
FixedUpdate함수에서 물체에 대한 이동을 처리해야한다.
fixedDeltaTime은 fixed TimeStep값으로 고정된 FixedUpdate의 호출 주기를 보장한다.
0.02초란 값은 0.02초마다 호출되는 것을 뜻하는 것이 아니다.
유니티 함수 호출 순서의 Physics 단계를 0.02초의 시간으로 반복 처리한다는 내용이다.
(다음에 FixedUpdate와 Update, LateUpdate에 대해 설명해보는 시간이 있으면 좋겠다)
Rigidbody 설정
Rigidbody의 보간 방법을 Interpolate (보간) 혹은 Extrapolate (보외) 를 설정으로 보완할 수 있다.
- Interpolate
- 움직임의 범위 안에 있는 값을 예측하여 계산
- 게임의 프레임 속도가 물리 업데이트 속도보다 훨씬 높을 때 물리 개체의 움직임을 부드럽게 만드는 데 유용
- Extrapolate
- 움직임의 범위 밖에 있는 값을 예측하여 계산
- 보간에 의해 도입될 수 있는 인지 지연을 줄이려는 경우, 특히 개체가 플레이어 입력에 의해 직접 제어되는 경우에 유용
Collision Detection Mode (충돌 감지 모드) 수정
- Discrete
- Rigidbody와 충돌체 간의 이동 경로에 따라 이동 중인 동안 충돌을 계속 검사
- 빠르게 움직이는 물체의 경우 터널링이 발생할 수 있음
- Continuous
- 물체의 이동 경로를 미리 예측하여 미래에 발생할 충돌을 사전에 감지
- 더 정확한 충돌을 감지하지만 물리 연산이 많아질 수 있음
- ContinuousDynamic
- 물리적으로 움직이는 물체에 대한 연속적인 충돌 검사를 수행
- 물체가 다른 물체와 충돌할 때마다 이동 경로를 계산하고, 이동 경로에 따라 충돌을 지속적으로 검사
- 가장 많은 물리 연산
지난번 충돌 방법의 글에 이어 충돌처리에 대한 문제가 발생할 수 있는 부분에 대해 작성했는데
프로젝트마다 원하는 충돌 체크 감지에 대한 요구사항을 적절히 파악하여 해결하는 방법이 필요하다.
'프로그래밍 > Unity3D' 카테고리의 다른 글
Unity - On-demand Rendering (0) | 2024.05.13 |
---|---|
함수 생명 주기(Life Cycle)와 FixedUpdate (0) | 2024.01.09 |
Unity - SendMessage (0) | 2023.11.03 |
Unity - Sprite Atlas 왜 사용할까? (0) | 2023.10.30 |
Unity - 가비지 컬렉터 (Garbage Collector) (1) | 2023.10.24 |