언리얼 엔진 본캠프 8주차-4 언리얼 엔진 C++ : 충돌

정재훈·2025년 2월 5일
0

unreal engine

목록 보기
23/45

<충돌>

충돌 종류

  • 물리적 충돌 : 물리 엔진에서 힘/속도/질량 등을 고려하여 실제 물리 법칙처럼 충돌을 처리하는 방식 => 충돌 후 물리적 반응(폭발, 넉백)이 있음
    • 상호작용을 위해 사용
    • SetSimulatePhysics(true)
    • SetNotifyRigidBodyCollison(true)
    • 충돌이 감지되면 OnComponentHit() 이벤트 발생
  • Overlap 충돌 : 물리적 반응 없이 단순히 Overlap만 감지하고 이벤트를 발생하는 방식
    • Trigger
    • SetGenerateOverlapEvents(true)
    • overlap이 감지되면 OnComponentBeginOverlap(), OnComponentEndOverlap()과 같은 이벤트를 호출
      • 이 이벤트는 특정 컴포넌트를 대상으로 발생하고 호출될 함수를 직접 바인딩해야 함
    • NotifyBeginOverlap()도 있음
      • 이 함수는 특정 액터를 대상으로 발생하고 AActor에게 상속받아 사용하는 가상함수이다
  • Blocking 충돌 : 물리적인 충돌을 감지하고, 충돌한 두 객체가 겹치지 않도록 막는 역할 => 충돌한 객체들이 서로 겹치지 않게 충돌 처리 => 충돌하면 움직이지 못하게 막음

여기서 보면 물리적 충돌과 Blocking 충돌이 비슷해 보인다

  • 물리적 충돌과 Blocking 충돌 차이점

    • 두 충돌 모두 충돌이 발생했을 때에 어떻게 반응하는 지가 다른데 물리적 충돌은 충돌에 대한 반응이 실제 물리 법칙(밀림, 튕겨나감, 폭발 등)에 의해 결정이되고, Blocking 충돌은 객체가 충돌했을 때 더 이상 이동하지 못하게 막아 벽, 장애물 같은 것을 뚫고 지나가지 못하게 한다

충돌 개요

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/collision-in-unreal-engine---overview

각 오브젝트 마다 콜리전에 관한 설정을 해야함

  • block

    • 구체(PhysicsBody)인 경우 Collision Responces에서 WorldDynamic(벽)에 대해 block 체크
    • 벽(WorldDynamic)인 경우 Collision Responces에서 PhysicsBody(구체)에 대해 block 체크
      • => 서로가 충돌 시 block => 충돌만 하고 이벤트는 없음
      • => 만약 한쪽만 block이면 block 작동 안함 => 그냥 ignore
    • 이벤트를 발생하고 싶으면 [Simulation Generates Hit Events]를 활성화
  • Overlap

    • Collision Responses에서 Overlap 체크
      • 하지만 Generate Overlap Events가 꺼져있으면(체크 안되어 있으면) Overlap == Ignore
      • => block과 마찬가지로 Overlap하고 싶은 양쪽 액터 모두 Overlap을 체크하고 [Generated Overlap Events]도 활성화 해야함

Collision Responces

  • block : 충돌이 발생하면 객체가 막히고 더 이상 지나갈 수 없게 됨 => 두 객체가 겹쳐지지 않는 것으로 충돌 처리하는 방식
  • overlap : 충돌이 발생하면 객체가 겹쳐질 수 있도록 허용하는 방식 => 물리적 반응이 없다
    • 겹침이 발생하면 이를 알리기 위한 이벤트가 호출됨
      • OnComponentBeginOverlap(), OnComponentEndOverlap()
  • ignore : 충돌이 발생하더라도 아무런 조치를 취하지 않는 방식
    • 겹침이 발생해도 아무런 이벤트가 발생되지 않음

Collision Enabled

  • No Collision : 충돌 없음
  • Query Only: Overlap, Hit 등 충돌 이벤트는 감지하지만, 물리적으로 튕기거나 밀리는 반응은 없음.
  • Physics Only: 물리 반응만 일어나고, 이벤트 (Overlap/Hit)는 발생하지 않음.
  • Collision Enabled : Query Only + Physics Only

ObjectType에서 2개가 직관적이지 않아 설명 추가 (C++코드에서는 ECC_ 가 붙음)

  • ECC_Visibility : 주로 시야와 관련된 충돌을 감지하는 데 사용, 레이캐스트(= 라인 트레이스), 캐릭터의 시선, 투사체 등에 사용
  • ECC_Camera : 주로 카메라에 대한 충돌을 감지하는 데 사용, 카메라가 가려진다던가 벽에 끼인다던가 할때 카메라의 위치를 조정할 때 사용

위에 있는 방식은 블루프린트를 사용한 것


직접 에디터에서 만든 Collision Preset은 c++로 수정할 수는 있지만, 수정한 상태를 저장하지는 못함 (DefaultEngine.ini 파일에 저장되어 있는 거라 런타임으로 수정 불가능)
=> preset을 사용할 때는 preset을 먼저 적용하고 SetCollisionResponseToChannel()로 개별적으로 변경해서 사용할 수 있음


physics를 끄고 충돌 감지하는 법

sweep : 오브젝트를 이동할 때, 이동 경로상의 충돌을 감지하고 겹쳐지지 않도록 막아주는 기능

  • 이동하기 전에 현재 위치부터 목표 위치까지의 경로에 충돌되는 것이 있는지 검사한 후 이동하도록 함
  • 충돌이 감지되면 충돌이 발생한 위치까지만 이동
  • HitResult에 충돌 정보 저장
    • 충돌한 오브젝트, 충돌한 위치, 충돌한 표면의 법선 등을 알 수 있다
bool SweepSingleByChannel(struct FHitResult& OutHit, const FVector& Start, const FVector& End, const FQuat& Rot, ECollisionChannel TraceChannel, const FCollisionShape& CollisionShape, const FCollisionQueryParams& Params, const FCollisionResponseParams& ResponseParam) const

  • Start에서 End까지의 경로상 CollisionShape 모양의 범위로 충돌을 감지
  • 충돌이 감지되면 충돌된 오브젝트의 정보를 OutHit에 저장

이동 함수에서 sweep 인자와 HitResult 인자에 true와 HitResult 변수를 넣어주면 자동으로 됨

sweep 말고 라인 트레이스(Line Trace)라는 방식도 있는데 sweep과 매우 유사하다

  • sweep은 경로상 collisionshape 범위로 충돌을 감지하지만 라인 트레이스는 이름처럼 start와 end를 잇는 직선으로 충돌을 감지한다
  • 함수 모양도 sweep과 똑같음 collisionshape이 없는것 빼고는 똑같음
bool LineTraceSingleByChannel(struct FHitResult& OutHit, const FVector& Start, const FVector& End,ECollisionChannel TraceChannel, const FCollisionQueryParams& Params = FCollisionQueryParams::DefaultQueryParam, const FCollisionResponseParams& ResponseParam = FCollisionResponseParams::DefaultResponseParam) const;







참조 사이트
1. https://krjm2404.tistory.com/31
2. https://rhksgml78.tistory.com/657
3. https://wecandev.tistory.com/136
4. https://openmynotepad.tistory.com/118
5. https://leekangw.github.io/posts/81/
6. https://dev.epicgames.com/documentation/ko-kr/unreal-engine/collision-response-reference-in-unreal-engine

profile
드가자

0개의 댓글