언리얼 충돌 시스템 핵심 정리 (콜리전 프리셋, 트레이싱)

언리얼 Collision 학습 노트. 강의 7.1~7.2에서 개념만 추림. 콜리전 헷갈릴 때 다시 보기.

충돌체 종류 세 가지

한 액터에 셋 다 들어갈 수 있음. 보통 루트인 프리미티브 컴포넌트(캡슐/박스)가 충돌체 역할.

  • 스태틱메시 컴포넌트: 메시 애셋 자체를 충돌체로. 비주얼 + 충돌 동시 설정 가능
  • 기본 도형 컴포넌트: 구체/박스/캡슐. 스켈레탈 메시엔 캡슐 조합이 흔함
  • 피직스 애셋: RagDoll용. 각 관절 충돌체. 스켈레탈 메시 전용

콜리전 프리셋 = 세 설정의 묶음

콜리전 프리셋 = 콜리전 프로파일 (같은 말). 다음 셋을 묶은 것:

  • Collision Enabled: 어떤 반응이 가능한가
  • Object Type: 충돌체 분류(채널)
  • Collision Responses: 다른 채널과 어떻게 반응하는가

Collision Enabled 세 종류

  • Query Only: 신호만. 겹침 감지(Overlap), LineTrace, Sweep이 여기 속함
  • Physics Only: 물리 반응만. 밀어내기, 사슬 같은 제약
  • Query and Physics: 둘 다. 다 되지만 계산량 증가

Object Type (채널)

"채널" = 분류라는 뜻.

대분류:

  • 오브젝트 채널: 개체에 붙은 충돌체 종류 식별 (WorldStatic, WorldDynamic, Pawn, PhysicsBody)
  • 트레이스 채널: 경로 따라 충돌 감지 (Visibility, Camera)

소분류 의미:

  • WorldStatic: 안 움직이는 배경. 주로 스태틱메시
  • WorldDynamic: 움직이는 액터
  • Pawn: 플레이어 조종 폰. 캡슐 컴포넌트에 부여
  • PhysicsBody: 물리 시뮬레이션으로 움직임
  • Visibility: 시각적으로 보이는지 탐지(폰 제외). 마우스 피킹에도 사용
  • Camera: 카메라~목표물 장애물 탐지

함정: Collision Presets의 Pawn과 Object Type의 Pawn은 다른 의미. 정확한 채널은 Object Type을 봐야 함. Block All 선택 시 Object Type은 WorldStatic으로 잡힘.

Collision Responses 세 종류

  • 무시(Ignore): 반응 없음, 뚫고 지나감
  • 겹침(Overlap): 뚫고 지나가지만 이벤트 발생
  • 막힘(Block): 못 지나가게 막음

가장 중요한 함정: 양쪽 다 Block이어야 실제로 막힘. A는 B에 Block인데 B는 A에 Overlap이면 결국 안 막히고 겹침. 언리얼은 성능 위해 Ignore를 최대화, Block을 최소화하는 설계.

Overlap 이벤트 vs Hit 이벤트

  • Generate Overlap Events 체크 + 양쪽 겹침 반응 → BeginOverlap / EndOverlap 발생
  • Generate Hit Events 체크 + 양쪽 막힘 반응 → Hit 발생

콜리전 채널 개수 제한

언리얼은 총 32개 채널. 엔진 기본 8개 + 예약 6개 → 프로젝트에서 쓸 수 있는 건 18개. 새로 만든 채널은 ECC_GameTraceChannel1~18 중 배정. 매핑은 Config/DefaultEngine.ini에서 채널 이름으로 검색하면 확인 가능. C++에선 #define으로 ECC_GameTraceChannelN을 의미 있는 이름에 매핑해서 씀.

트레이싱 함수 이름 규칙

{처리방법}{대상}{처리설정} 조합.

  • 처리방법: LineTrace / BoxTrace / SphereTrace / CapsuleTrace / Sweep / Overlap
  • 대상: Test(감지 여부만) / Single·AnyTest(단일 정보) / Multi(전부 배열)
  • 처리설정: ByChannel / ByObjectType(오브젝트 타입) / ByProfile(프리셋)

예) SweepMultiByChannel = 쓸기 + 전부 + 채널 기반. 물리는 월드 기능이라 GetWorld()로 호출.

꼭 기억할 함정 두 개

FHitResult의 Actor는 TWeakObjectPtr. 로우 포인터면 GC돼야 할 액터가 메모리에 남기 때문. 접근 전 IsValid() 체크 필수. GetActor()는 내부적으로 유효성 검사 포함.

트레이스 시 자기 자신은 무시 목록에 넣어야 함. 안 그러면 자기 충돌체에 걸림. FCollisionQueryParams 생성 시 this를 넘기는 이유.

디버그 드로잉

로그 대신 시각화하려면 DrawDebug 계열(DrawDebugCapsule 등) 사용. 콘솔 변수(FAutoConsoleVariableRef)로 on/off 토글하면 릴리즈에 영향 없이 디버깅 가능. 캡슐은 기본이 세로라 트레이스 방향으로 눕히려면 회전 행렬(FRotationMatrix::MakeFromZ) 적용 필요.

+ Recent posts