본문 바로가기

개발/언리얼

Collision Response, Linetrace

https://www.unrealengine.com/blog/collision-filtering

 

언리얼 엔진 4 의 콜리전 필터링

무엇이 충돌하는지를 선택하는 것은 매우 중요하지만 까다로울 수 있으며, UE4 개발 도중 꽤 오래 논의를 거쳤던 문제입니다. 저희 시스템이 처음에는 약간 복잡해 보일 수는 있지만, 매우 강력

www.unrealengine.com

위의 글에서 콜리전과 라인 트레이스에 관해 굉장히 잘 설명되어있다

언리얼 콜리전시스템의 Collision Response (콜리전 반응)의 유형,

우선순위는 Block < Overlap < Ignore순으로 높다. 이에 대한 내용은 아래 및 후술.

A가 Block일때 A가 B에게 이동한다면. B의 Collision 설정에 따라 다음의 반응이 일어난다.

  • Block이라면, 서로 물리적으로 부딫혀 서로 통과되지 않는다(Block), Hit이벤트가 발생할 수 있다.
  • Overlap이라면, A는 B를 통과할수 있고, Begin Overlap등의 이벤트를 발생시킬 수 있다.
  • Ignore이라면, A는 B를 통과하고, 아무런 이벤트도 발생하지 않는다.

목적에 따라 상호작용할 각각의 객체의 Collision Response를  적절하게 선택해야 한다.

 

Trace/Object Type?

콜리전과 라인트레이스채널에 대해서,

콜리전 프리셋의 Ignore, Overlap, Block은 앞서 설명한 Collision Response에 대한 설정이고,

옆에 Trace Type과  Object Type을 볼 수 있는데, 이것이 바로 트레이스 채널에 대한 부분이다.

 

언리얼에서 LineTrace를 시도하면 특정한 채널을 통해 시도하게 되는데,

이때 반응은 Collision Preset의 설정에 따라 결정되니 세심하게 설정해야 한다.

이부분은 아래 예시 코드 이미지와 함께 설명.

 

대표적인 라인트레이스 방식

  • 라인트레이스 : Block되는 객체 하나를 반환(Block지점에서 정지)
  • 멀티라인트레이스 : Overlap되는 객체를 투과하여 시작지점~ 처음 Block되는 지점(객체)까지를 반환
  • 비동기 트레이스 : 위의 Trace를 비동기로 진행하는 방법.

 

멀티 라인 트레이스 예시.

테스트 환경은 아래 이미지처럼 설정하였음.

중간의 투명 액터의 Collision Response를 변경하면서 테스트하고, 트레이스코드는 아래에 설명

Kismet라이브러리를 사용한 라인트레이스

(1~3번 param) 액터 전방  1000거리 까지,

ECC_Visibility : Visibility채널로 트레이스를 시도,

Simple Collision에 Trace할것을 의미(true이면 Complex Collision : 캐릭터 메시 등 눈으로 보이는 콜리전),

예외 액터 배열(본인이나 관통이 가능한 객체 등 TArray)

out FHitResult

(디버그)라인 색상,

(디버그) block탐지 이후 색상.

 

 

아래에서 투명액터의 Visibility채널의 Collision Response를 바꿔가면서 결과를 이미지로 보겟음.

 

중간 액터가 Ignore일때, LineTrace에는 아무 반응이 없다.
중간액터가 Overlap일때, Linetrace는 감지하였으나 이어서 다음 Block될때까지 trace를 진행한다.
중간 액터가 Block일때, 충돌지점에서 Linetrace가 종료되었다(녹색 부분은 Trace가 종료된 부분으로 감지 X)

이처럼 라인트레이스로 객체감지등을 할때 어떤 채널을 사용할것인지, 어떤 반응이 필요한지 등을 제대로 설정해두는 게 중요하다.

본문 시작부분의 링크로 가서 자세한 내용을 살펴보면 "상황"설명과 함께 더 이해하기 쉬울것이다.

 

 

 

다음에 정리해볼것

Kismet 라이브러리를 이용한 데미지 주고받기 시스템 구현방법.