게임 서버가 매 틱 위치로 충돌을 검사하는데 빠른 투사체가 얇은 벽을 통과합니다. 왜 생기며 어떻게 막나요?
잠깐, 답변을 보기 전에
먼저 내 말로 설명해 볼까요?
답변과 점검 포인트 펼치기답변 접기
구두 답변
정의를 외우기보다, 원리와 조건을 연결해 설명해 보세요.
매 틱의 시작 위치와 끝 위치에서만 겹침을 검사하면 두 위치 모두 벽 밖이어도 이동 선분이 얇은 벽을 가로지를 수 있습니다. 투사체가 한 틱에 벽 두께보다 멀리 이동할 때 생기는 이 현상을 터널링(tunneling)이라고 부릅니다. 틱률을 높이면 위험을 줄일 수는 있지만 속도가 충분히 빠르거나 벽이 충분히 얇으면 여전히 발생하고, 틱률 상승만으로 계산 비용과 지연을 해결할 수도 없습니다.
이동 구간을 검사하기
반경이 거의 없는 점 투사체라면 이전 위치에서 다음 위치까지의 선분과 정적 형상의 교차를 검사하는 raycast가 적절할 수 있습니다. 캐릭터나 폭발체처럼 반경이 있는 물체는 중심선만 검사하면 몸체가 벽에 걸리는 충돌을 놓치므로, 도형을 이동시킨 전체 부피와 장애물의 교차를 찾는 swept-shape 또는 연속 충돌 검사(continuous collision detection)를 사용해야 합니다. 이 검사는 단순히 끝점이 겹치는지 보는 것이 아니라 이동 중 최초로 닿는 충돌 시간(time of impact)을 구해 그 위치에 멈추거나 반사·관통하는 규칙을 적용합니다. 시작·끝 위치와 투사체 속도는 서버 틱의 권위 상태에서 가져오겠습니다. 움직이는 대상과 충돌하면 투사체만 움직인다고 볼 수 없으므로 상대 운동으로 선분 또는 swept volume을 계산해야 합니다. 벽의 모서리와 접하는 경우 접촉을 충돌로 볼지, 부동소수점 오차를 어느 방향으로 보수화할지 정합니다. 투사체가 처음부터 고체 안에 있다면 진입 충돌과 탈출 충돌을 혼동할 수 있으므로 시작 상태를 별도로 처리해야 합니다.
비용과 반복 충돌
모든 객체에 정밀한 연속 검사를 적용하지 않고, 속도·크기·벽 두께를 기준으로 터널링 가능성이 큰 객체만 대상으로 삼겠습니다. 먼저 swept 경계로 broad phase 후보를 만들고, narrow phase에서 정확한 충돌 시간을 구합니다. 충돌 후 남은 틱 시간 동안 또 다른 벽을 만날 수 있으므로 남은 시간으로 재검사하되, 한 틱 내 최대 충돌 횟수와 최소 이동량을 두어 두 표면 사이의 수치 오차가 무한 반복을 만들지 않게 합니다. 한계를 넘으면 안전한 정지·폐기·관통 중 게임 규칙에 맞는 탈출 정책을 적용하고 로그를 남깁니다. 검증은 얇은 벽, 매우 빠른 투사체, 낮은 틱률, 움직이는 벽과 대상, 모서리, 연속 반사, 시작점이 내부인 경우를 포함합니다. 서버의 충돌 위치와 클라이언트의 시각 효과가 달라질 수 있으므로 판정 결과와 보정 정보를 분리해 전송합니다.
즉, 연속 충돌의 목적은 틱 사이를 무한히 시뮬레이션하는 것이 아니라 이동 구간에서 최초 충돌을 놓치지 않는 것입니다. 연속 검사는 시작점이 이미 장애물 안에 있는 상황을 자동으로 해결하지 않습니다. 이전 틱의 관통을 오류로 기록하고 밖으로 밀어낼지, 투사체를 소멸시킬지, 마지막 유효 위치로 되돌릴지 정책을 둡니다. 접촉 직후 같은 표면을 다시 만나는 수치적 재충돌을 막기 위해 충돌 법선 방향으로 작은 안전 여유를 두되, 그 여유가 이동 규칙을 바꾸지 않는지 확인하겠습니다. 움직이는 대상과 정적 벽을 함께 처리하면 각 충돌의 기준 시간을 같은 틱 안에서 유지해야 합니다. 첫 충돌 뒤 남은 시간으로 상태를 갱신하고 다음 후보를 찾되, 여러 충돌이 몰리면 최대 반복에서 보수적으로 종료합니다. 서버와 클라이언트가 다른 결과를 보여 주지 않도록 충돌 시각과 최종 권위 위치를 별도 메시지로 전달하겠습니다.
충돌 시간이 틱의 시작이나 끝과 정확히 겹칠 때 접촉을 어느 틱의 사건으로 기록할지도 결정해야 합니다. 같은 투사체가 경계에서 두 번 처리되지 않도록 이동 구간을 반열린 구간으로 정의하거나, 충돌 이벤트에 투사체 ID·세대·틱·충돌 순번·대상 ID를 붙여 같은 사건의 재전달만 제거하겠습니다. 틱과 투사체만 키로 쓰면 한 틱의 여러 유효 충돌까지 합쳐 버릴 수 있습니다. 움직이는 대상의 상태도 동일한 기준 시각에서 읽어야 한쪽만 과거인 판정이 생기지 않습니다. 시간 예산이나 반복 상한을 넘으면 성공으로 숨기지 않고 안전한 정지·소멸 같은 명시적 결과를 반환하고 발생 횟수를 계측하겠습니다.
득점 포인트
이해가 드러나는 지점을 확인해 보세요.
- 끝점 겹침 검사에서 터널링이 생기는 기하 조건을 설명한다.
- 점 raycast와 반경 있는 swept-shape, 최초 충돌 시간을 구분한다.
- broad phase·충돌 반복 횟수·수치 오차의 비용 상한을 제시한다.
감점 포인트
놓치기 쉬운 조건과 오해를 짚어 보세요.
- 틱률만 올리면 모든 터널링이 사라진다고 말한다.
- 반경 있는 물체를 중심선 하나로만 검사한다.
- 충돌 후 남은 시간을 무제한 재검사한다.
더 파고들 거리
하나 더 질문하며 이해의 범위를 넓혀 보세요.
- 계산한 최초 충돌 시점이 수치 오차로 벽 안에 놓입니다. 정지 위치와 접촉 여유를 어떻게 정하나요?
- 관통 투사체가 한 틱에 여러 대상을 만납니다. 충돌 순서·반복 상한·이벤트 ID를 어떻게 정하나요?
- 클라이언트 예측 효과와 서버 충돌 위치가 다를 때 시각 보정과 판정 설명을 어떻게 분리하나요?
득점·감점 포인트는 학습용 자기 점검 기준이며, 특정 회사의 실제 채점표가 아닙니다.
원리부터 공부하고 싶다면
답변을 보충하는 개념·예제·슈도코드를 읽어 보세요.