언리얼에는 트레이스 (a.k.a. "레이캐스트") 라는 시스템이 있다.

 

간단히 요약하면 원하는 방향으로 빔을 쏴서 무언가가 걸리면 인식하는 시스템 정도로 이해해주면 되겠다.

 

언리얼에서는 해당 시스템을 좀 더 "디테일하게" 나눠서 판단을 하도록 해두었는데

 

이번에 회사에서 작업하면서 해당 시스템 관련 문제를 하나 마주쳤다.

 

 

 

 

언리얼 트레이스는 크게 2가지로 나뉘어진다.

Single Trace

Multi Trace

 

Single Trace는 "히트한 단 한개의 타겟"에 대한 결과만을 리턴

Multi Trace는 "목적지까지 다다랐을때 히트한 모든 타겟" 에 대한 결과를 리턴한다.

 

히트한 결과는, "HitResult" 라는 자료형/배열로 리턴되며, Trace 자체가 히트했는지는 각 함수의 리턴값을 통해 알 수 있다.

 

그런데 여기서 함정.

 

HitResult가 있더라도 Trace 함수의 Hit 결과는 False가 나올 수 있다.

 

이게 무슨소리냐

 

 

이걸 설명하기 위해서는 언리얼 콜리전 판정의 특이사항을 알 필요가 있다.

 

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

 

Collision Filtering in Unreal Engine 4

Choosing what collides is obviously very important, but it can be tricky, and it’s a problem that we have spent quite a while discussing while developing UE4. The system we have can seem a little complex at first, but it is very powerful and consistent,

www.unrealengine.com

 

 

자세한 내용은 위의 링크를 참고하면 확실하게 볼 수 있으니, 필요한 설명만 하도록 하겠다.

 

 

언리얼의 콜리전은 총 3가지 타입으로 분리된다.

 

무시 (Ignore) / 오버랩 (Overlap) / 충돌(Block)

 

 

 

Ignore는 모든 충돌 방식을 Ignore

Overlap은 Overlap / Block을 Overlap (판정은 발생하나 지나침)

Block은 Block끼리 충돌

 

 

 Trace에서 추출되는 결과는, Overlap과 Block 2가지만 추출된다. (아무래도 Ignore는 충돌을 안하니까...)

그런데, Single Trace의 경우, "Overlap" 결과는 리턴되지 않는다.

 

이에 대해서 여러 자료를 좀 찾아보았으나, 공식 문서 상에서는 확답이 없어 분석해본 결과,

공식문서에서는

1. Trace 결과는 "Hit" 라는 표현을 사용한다.

2. 공식문서에서, SingleTrace에는 없는 "Overlap" 이라는 표현이 MultiTrace에서부터 등장한다.

 

라는 결론을 얻을 수 있었다.

 

 

 

이게 무슨말이냐, 예시를 들어 설명하자면...

 

 

 

우선 간단하게 테스트용 함수를 구성했다.

테스트용 채널은 Camera 채널을 이용.

 

SingleTrace를 이용하며, Hit 시 출력은 True, 아니라면 False가 나올것이다.

 

 

뒤의 파란 블럭은 Camera 채널을 Block, 앞의 빨간 블럭은 채널을 Overlap으로 지정했다.

 

 

그리고....

 

 

빨간색 가까이에 가면 Hit Result가 False

 

 

 

파란색의 경우, 화살표 위치에서처럼 Hit 결과가 보이면서 Hit가 True로 나온다.

 

 

 

 

 

그럼 Overlap된 액터는 검출이 불가능한가?

 

그건 또 아닌게, 위에서 말한것과 같이 MultiTrace의 경우에는 Overlap이 검출이 된다.

 

 

 

 

Trace를 Multi로 변경했다.

 

 

 

아무것도 없으면 Hit Result False, Hit 0

 

 

Overlap만 있으면 Hit Result : False, Hit 1

 

 

Block이 있다면 Hit Result : True, Hit 1

 

 

즉, 결과를 요약하면 다음과 같다.

 

 

Single Trace Hit Result (히트 결과) Out Hit (히트 액터 검출)
Ignore False False
Overlap False False
Block True True
Multi Trace Hit Result (히트 결과) Out Hit (히트 액터 검출)
Ignore False False
Overlap False True
Block True True

 

=
Overlap 설정으로 충돌한 (채널/타입) 경우에는 Hit Event Result (Trace의 성공/실패여부) 를 변화시키지 않는다.
SingleTrace의 경우, Overlap만 발생한 경우에는 Hit Event Result가 False로 발생하면서 결과물이 리턴되지 않음.
MultiTrace의 경우 Overlap이 걸려도 HitResult가 채워지나, Hit Event Result는 Block으로 끝나지 않는 한 False로 리턴된다.

 

 

 

왜 Overlap에만 이런 특이한 경우가 반영되었는지는 (공식문서상 확답이 없어서) 잘 모르겠지만... 

작업할때 참고할 필요가 있을것 같다.

 

+ Recent posts