주둔지 경비병의 Player 감지 로직을 만들다 문득 궁금증이 생겼다.
Physics.Raycast 같은 Cast 계열이 존재하고
Physics.OverlapSphere 같은 Overlap 계열이 있는데
둘의 명확한 차이가 뭔지 궁금해졌다.
이번 포스팅에선 질문과 검색을 통해 정리한 두 방식의 작동 원리 차이를 정리해보겠다.
추가로 내 프로젝트(소음 탐지)에선 오버랩을 쓴 이유도.
Raycast, SphereCast, BoxCast 등이 존재
RaycastHit 구조체를 통해 상세한 정보를 반환.OverlapSphere, OverlapBox 등이 존재
Collider[] 배열을 반환.이번에 구현하려는 기능은 플레이어 에게서 발생하는 소음 을
주둔지 경비병이 듣고 추적하는 기능. 나는 OverlapSphereNonAlloc를 선택
소리는 공기 중으로 퍼져나가는 파동이다.
OverlapSphere는 구체 형태의 감지 영역을 생성하므로 소리의 성질과 일치한다고 생각.
"소리가 가드 귓바퀴에 32도 각도로 닿았다"
이런 정밀한 정보는 필요 없다.
단지 내 영역 안에 소음원이 존재하는가? 만 알면 된다.
따라서 값비싼 RaycastHit 정보가 필요 없음.
프렉쳐 시스템을 사용하는 게임 특성상 주변에 파편이 수백 개가 굴러다닐 수 있다.
이때 OverlapSphere의 오버로드를 최적화에 활용.
LayerMask: GarrisonGuard 레이어만 검출하도록 설정하여, 수백 개의 파편은 물리 연산에서 배제.
NonAlloc: Physics.OverlapSphereNonAlloc을 사용하여 GC 발생을 감소시킴.
//최적화 예시
private Collider[] noiseBuffer = new Collider[10];
public void EmitNoise(float radius)
{
//LayerMask로 경비병만 거르고 NonAlloc으로 메모리 할당 방지
int count = Physics.OverlapSphereNonAlloc(transform.position, radius, noiseBuffer, guardLayer);
for (int i = 0; i < count; i++)
{
//소음 전달
}
}
이런 식으로 구현!
마지막으로 아까 적어둔 광역 단계
Broad-phase 개념만 알아보고 마쳐보자.
물리 엔진이 충돌을 계산할 때, 맵에 있는 모든 물체끼리 1:1로 비교하면 연산량이 너무 커짐.
그래서 근처에 있는 객체끼리만 그룹 짓는 단계를 먼저 거치는데
이걸 광역 단계 = Broad-phase라고 함.
따라서 Overlap은 이 단계에서 "이 구역에 누가 있냐" 정도만 묻고 끝내기 때문에 저렴한 거고
Cast는 정확한 표면을 찾기 위해 그 다음 단계인 협역 단계(Narrow-phase) 가야 하므로 비쌈.
나중에 시간되면 이 단계 자체의 라이프사이클 관해서도 알아보자.
정확한 타격과 좌표가 중요하다면? -> Cast
범위 내 존재 여부만 중요하다면? -> Overlap
데이터의 목적에 맞는 도구를 선택하는 연습을 통해, 최적화까지 챙겨가며 코딩해보자.