Trace 란?

트레이스 (Trace)란, 추적이란 의미를 담고있는 단어 그대로, 레벨속에서 직선상으로 뻗어나가 무엇이 존재하는지 확인할 수 있는 방법이다. 언리얼에서는 이 방법을 Trace 라고 하며, 유니티에서는 레이 케스트 (Raycast)라고 한다.
기본적으로 시작과 끝을 정해주면, Physics 시스템에서 그 두 점에 직선을 그으며, 그곳까지 도달하는데 걸리는 액터가 있는지 보고해준다.
보통 한 액터가 다른 액터를 볼 수 있는지 알고싶거나, 특정 폴리곤의 노멀값을 알아내거나, 고속의 탄을 가진 총기 시뮬레이션, 액터가 어느 공간에 들어섰는지 알고싶은 등등의 상황에서, 트레이스는 매우 저렴한 비용의 아주 믿을만한 솔루션이 되어준다.
트레이스는 물리 시스템을 사용해서 트레이스 대상 카테고리를 정의할 수 있다.
크게 두가지 범주로 나눌 수 있는데, 채널(Channel)과 Object Type(오브젝트 유형)이다.
채널은 카메라 속에 보이는지 안보이는지, 즉 Visibility나 Camera 같은 것에 사용되어 거의 트레이스에만 쓰인다.
오브젝트 유형은 씬에 콜리전 (Collision)이 있는 거의 모든것에 대한 것이다. 대부분은 액터 탐지를 위해 쓰니, 콜리전이 있는 액터라고 보면 되겠다.
채널과 오브젝트 유형은 필요에 따라 추가할 수 있다. 아마 기본적으로 제공되는 것들로는 다양한 조건을 만족시키기 어려워 직접 추가를 하게 될텐데 그에 대한 부분을 잠시 정리하겠다.
프로젝트에 커스텀 콜리전 채널 추가하기
프로젝트 세팅에서 콜리전 메뉴를 보면 이렇게 되어있다.

여기서 새로운 오브젝트와 트레이스의 반응 채널을 추가할 수있다.
두 채널 모두 새 채널을 만들게 되면 이런 작은 창이 하나 뜨게된다.

이곳에 원하는 이름을 넣고 수락을 눌러주기 전에 기본 반응 창을 내려보자.

이름을 설정하고 수락을 누르자. 나의 경우에는 TEST로 적겠다.

이렇게 잘 추가가 되었다면, 다른 트레이스, 오브젝트 채널과의 반응을 설정하기 위한 단계를 진행해줘야 한다.
Preset 탭 오른쪽에 있는 새 프로파일 버튼을 눌러보면 이런 창이 하나 뜬다.

여기서는 콜리전 상태와 오브젝트 유형을 넣을 수 있다.
이름은 햇갈리지 않도록 TEST_OBJ로 넣고, 콜리전 켜짐 (콜리전 상태)는 리스트를 내려 Collision Enable로 설정해보자.
오브젝트 유형은 이 오브젝트 채널이 어떻게 인식되었으면 하는가에 대한 것을 설정하는 단계이다.
우리는 우리만의 오브젝트 채널인 TEST를 만들었으니, 탭의 리스트를 열어 TEST로 설정해주고 수락 버튼을 누르면 끝이다.

잘 추가 되었다면 저렇게 Preset 리스트에 보이게 될 것이다. 여기서 끝인줄 알겠지만, 우리는 기본 반응을 Block으로 설정했었다. 그럼 우리의 TEST_OBJ 프리셋 이외에 다른 모든 프리셋들과 충돌할 경우, 뚫고 지나가는 것이 아닌, 가다 막혀버릴 것이다.
우리는 각각의 모든 프리셋에 대해 우리의 TEST_OBJ의 충돌 설정을 또 수정해줘야한다… 이건 상당히 노가다이니 가능하면 오브젝트 트레이스 채널을 만들 때, 미리 어떤 용도로 만드는지를 생각하고 콜리전 필터링을 잘 설정하길 바란다.
딱 하나만 예로 들어 설명해보고 이 부분은 마치겠다.
OverlapAllDynamic은 움직이는 모든 액터에 대해 오버랩 이벤트를 발생시키기 위해 사용된다. 예를들면 잠깐 들어와 지나간 액터를 찾는 공간은 부딪히는게 아닌 뚫고 지나가는 곳을 체크하기 위해 만들어져있으니 Block이 아니라 아래와 같이 Overlap으로 해야한다.
왼쪽으로 설정된 것을 오른쪽 처럼 바꿔주면 된다.
이제 우리는 OverlapAllDynamic으로 콜리전 프로필이 설정된 액터들과는 충돌이 아닌 뚫고 지나가게된다.
만약 Hit 이벤트를 봐야하는 상황이라면, 부딪히는 두 액터중 하나라도 Block으로 설정되어 있어야한다.
이런 부분들은 나중에 Collision에 관한 글을 쓰며 더 정리하겠다.
트레이스 유형에 따른 Hit 반환
다시 트레이스로 돌아와서, 선으로 진행하는 트레이스에는 두가지의 충돌 반환 방식이 존재한다.
싱글 트레이스 (Single Trace)와 멀티 트레이스 (Multi Trace)로 나뉘는데, 싱글 트레이스는 트레이스 시작점으로부터 종점까지 가는동안 가장 처음 Hit 되는 부분에 대한 정보를 알려주지만, 멀티 트레이스는 시작점부터 종점까지 가는동안 닿은 모든 것들에 대해 Overlap을 발생시킨다. 아래의 사진을 보면 조금 더 이해하기 쉽다.

왼쪽은 싱글 트레이스로 위에서부터 트레이스를 시작해 아래로 가는데, 가장 위에있는 판과 Block된 곳의 정보만을 갖고 있는 반면에, 오른쪽의 멀티 트레이스를 진행한 부분은 판을 지나가며 닿은 모든 Block된 부분에 대한 정보를 갖고있다.
Hit된 결과는 Hit Result 라는 구조체에 담기게 된다. 그에 대한 설명은 아래와 같다.

Shape Trace
Line Trace로는 부피가 부족해 충분히 검출할 수 없는 경우, Shape Trace를 사용하면 원하는 결과를 얻을 확률이 높아진다.
예를들어 적이 플레이어를 감지하기 위해서는 눈에서부터 진행되는 원뿔모양의 충돌이 필요할텐데, Line Trace로는 거의 불가능한 탐지 범위이다.
이런 상황에서 Box, Capsule, Sphere 등의 같은 부피가 있는 모양의 트레이스를 사용하면, 검출이 가능해진다.

Shape Trace는 시작 지점에서 끝 지점까지 쭈우욱 휩쓸며 (Sweep) 검사를 하는 것은 Line Trace와 비슷하나, 부피가 있는 만큼 더 검사할 수 있다는 부분에서 차이가 존재한다.
빠광님 카페에서도 블로그에서도 많은 도움 받고 있습니다. 감사합니다. 혹시 오브젝트 채널과 트레이스 채널의 실질적인 차이가 뭔지 알 수 있을까요? 단순히 구분을 해놓은 것인지 아니면 두 채널이 내부에서 다르게 처리된다거나, 두 채널이 할 수 있는 일이 다른건지 궁금합니다.
안녕하세요. 도움이 되셨다니 참 기분 좋네요 질문 주셔서 감사합니다.
둘의 실질적인 차이는 크게 없는 것 같습니다. 결국엔 물리충돌 여부를 살펴볼때 논리적인 모양이나 선으로 라인트레이스를 한다는게 전부입니다.
질문주신 Channel 로 트레이스 하는건 씬에서 콜리전을 갖지 않는(오브젝트가 아닌) 트레이스에 많이 쓰입니다.
논리적인 판단만 필요할 때 사용하신다고 보시면 될 것 같습니다.
예를들면, 라인트레이스를 통해 주위에 무엇이 있나 확인하신다거나 하는 탐색이나 판별을 위해 보통 사용을 하게 됩니다.
반면에 Object Type의 경우는 콜리전 타입별로의 서로의 충돌에 신경을 써야할 때 쓰신다고 보시면 될 것 같습니다.
씬에서 콜리전을 갖는 물체들에게 사용할때 사용하는 것이라고 보시면 될 것 같습니다.
둘의 차이는 결국 씬에서 콜리전을 갖는 물체에 사용하느냐(Object Type) 아니면 콜리전을 갖지 않는 논리적인 판단을 위해 사용하느냐(Channel) 이라고 보시면 될 것 같습니다.
이해가 되시도록 잘 설명드린지는 모르겠네요. 혹시 더 궁금하시다면 댓글 남겨주시기 바랍니다. 좋은하루 보내세요!