메쉬콜라이더와 충돌 감지 문제, 어떻게 해결할까?
게임 개발을 하다 보면 꼭 부딪히는 문제 중 하나가 바로 충돌 감지다. 특히 메시콜라이더를 convex 옵션을 켜고 끄는 상황에서 생기는 문제는 초보자부터 숙련자까지 다 한 번쯤은 겪는다. 이번 글에서는 내가 직접 겪은 상황과 커뮤니티에서 나눴던 이야기를 토대로, 충돌 감지 문제를 어떻게 접근하고 해결할 수 있을지 정리해보려고 한다.

메쉬콜라이더 convex 옵션의 함정
먼저 메쉬콜라이더 convex 옵션부터 짚고 넘어가자. convex를 true로 두면 콜라이더가 볼록껍질 형태로 단순화된다. 그래서 원래 벽에 구멍이 있거나 오목한 구조가 있어도 전부 막혀버린다. 덕분에 충돌 감지는 안정적으로 되지만, 구멍을 통과해야 하는 구조물에서는 원치 않는 결과가 나온다.
반대로 convex를 false로 두면 메시 원본 모양 그대로 충돌 처리를 한다. 하지만 이 경우 문제가 생긴다. 속이 빈 구조물이라면 내부에서 감지가 제대로 되지 않는다. 예를 들어 OverlapSphere를 써서 감지하려고 하면, 스피어가 내부에 있으면 충돌 자체를 잡지 못한다. 내가 만든 화살표 모양 벽에서 정확히 이런 문제가 발생했다. 빠른 속도로 움직이는 벽을 통과하다 보니 감지가 되기 전에 뚫고 지나가버리더라.
OverlapSphere만으로는 부족하다
많은 사람들이 처음에는 OverlapSphere를 쓴다. 간단하게 일정 반경 안의 콜라이더를 감지할 수 있으니까. 하지만 이 방식은 메시 내부에 들어가 버리면 허점을 드러낸다. 내부에서 겹쳐버린 상황에서는 감지가 안 되고, 빠르게 이동하는 경우는 더더욱 허술하다.
그래서 커뮤니티에서 나온 대안이 SphereCast다. SphereCast는 단순히 한 점에서 겹침을 보는 게 아니라, 구체를 쏘듯이 이동 경로를 따라 충돌을 감지한다. 캐릭터 중심에서 바깥쪽으로 쏘면, 웬만한 빠른 속도에서도 벽에 맞기 전에 감지가 가능하다. 물론 성능 비용이 조금 더 들어가지만, 안정성을 생각하면 SphereCast가 확실히 나은 선택이다.
빠른 속도와 물리엔진의 한계
Unity의 물리엔진은 기본적으로 성능 최적화에 초점이 맞춰져 있다. 기본 Rigidbody 충돌 모드는 Discrete인데, 이건 느린 움직임에서는 문제가 없지만 빠른 움직임에서는 충돌을 놓친다. 그래서 뚫림 현상이 생긴다.
이때 써야 하는 게 Collision Detection 모드 변경이다. Rigidbody의 Collision Detection을 Continuous 이상으로 설정하면 빠른 이동에서도 충돌 감지가 강화된다. 특히 플레이어처럼 중요한 오브젝트는 Continuous Dynamic으로 해두는 게 좋다.
또 하나 중요한 게 Fixed Timestep이다. Project Settings → Time 메뉴에서 조정할 수 있는데, 기본값은 0.02초다. 이걸 0.01\~0.016 정도로 줄이면 물리 업데이트가 더 촘촘하게 일어난다. 당연히 충돌 감지 정확도도 올라간다. 물론 성능 부담이 늘어나니까 무작정 낮추면 안 되고, 게임에 맞춰 적당히 조절해야 한다.
메쉬를 쪼개고 콜라이더를 나누자
convex 옵션 때문에 구멍이 막히는 문제를 해결하려면, 메시 자체를 잘게 쪼개는 방법도 있다. 구조물을 여러 개의 파트로 분리하고, 각자 Convex MeshCollider를 붙여서 합쳐 쓰는 것이다. 이렇게 하면 오목한 구조나 내부 공간도 어느 정도 충돌 감지가 가능하다.
더 나아가면 메시 대신 BoxCollider, SphereCollider, CapsuleCollider 같은 기본 프리미티브 콜라이더를 조합해서 쓰는 것도 방법이다. 성능도 더 좋고, 충돌 감지도 훨씬 안정적이다. 복잡한 메시를 단순 콜라이더 몇 개로 대체하면 최적화에도 도움이 된다.
움직이는 벽의 특수한 경우
이번에 내가 겪은 상황처럼, 벽 자체가 움직이거나 회전하는 경우는 더 까다롭다. 플레이어와 벽이 서로 상대 속도를 갖게 되니까 충돌 감지가 훨씬 어려워진다. 이럴 땐 플레이어 쪽은 Continuous Dynamic, 벽 쪽은 Continuous 이상으로 설정해야 한다. 또 Transform.position으로 위치를 강제로 바꾸는 게 아니라 Rigidbody.MovePosition, MoveRotation을 써야 물리엔진이 제대로 추적한다.
만약 속도가 너무 빠르다면 한 프레임에서 이동 거리가 벽 두께를 초과해버리기도 한다. 이런 경우는 SphereCast 같은 보강 방법을 꼭 병행해야 한다.
정리하자면
1. 빠른 속도에서는 Rigidbody Collision Detection을 Continuous 이상으로 바꿔야 한다.
2. Fixed Timestep을 줄여 물리 업데이트 주기를 촘촘하게 맞춰야 한다.
3. OverlapSphere만 쓰지 말고 SphereCast나 멀티 캐스트 방식으로 보완해야 한다.
4. Convex 문제는 메시를 여러 파트로 쪼개거나 프리미티브 콜라이더를 조합해서 해결할 수 있다.
5. 벽이나 오브젝트를 움직일 때는 Transform으로 직접 이동하지 말고 Rigidbody 함수를 써야 한다.
마무리
결국 메시콜라이더 convex 문제는 단순히 옵션 하나 켜고 끄는 걸로 끝나는 게 아니다. 충돌 감지를 어떻게 설계할지, Rigidbody 설정을 어떻게 할지, 물리 업데이트 주기를 얼마나 잡을지까지 다 맞물려 있다.
처음에는 답답하고 복잡해 보여도, 차근차근 적용하다 보면 금방 감이 잡힌다. 중요한 건 “충돌 감지는 결국 성능과 정확도의 균형”이라는 사실이다. 원하는 결과를 얻으려면 여러 방법을 조합해서 상황에 맞는 최적의 해법을 찾는 게 핵심이다.
이번에 겪은 문제도 결국 이런 원칙을 다시 확인하는 계기가 됐다. 나처럼 비슷한 문제로 헤매는 사람들에게 도움이 되었으면 한다.
'자연과학, IT, 공학 > IT, 프로그래밍' 카테고리의 다른 글
| 카카오, 안산 데이터센터에 GPU 2040장 구축…국가 AI 인프라 경쟁 본격화 (0) | 2025.12.29 |
|---|---|
| 픽셀 퍼펙트 카메라 제대로 쓰는 방법 정리 (7) | 2025.08.18 |
| Swiper loop 버그, 왜 자꾸 끊기고 사라질까? (5) | 2025.08.17 |
| 유니티 어드벤처 게임 개발 중 겪은 입력 처리 오류와 해결 과정 (6) | 2025.08.17 |
| 유니티에서 대각선 이동 속도 문제 해결하기 (6) | 2025.08.17 |