이번 글에서는 아주 중요한 트레이스라는 개념에 대해서 알아보고자 한다.
트레이스는 게임 내에서 매우 많은 기능을 가능하게 한다.
가령, 어떤 물체를 바라보고 집을 수 있게 하거나, 어떤 공간 안에 액터가 들어왔는지 여부를 판단하거나, 이 액터가 다른 액터를 '볼' 수 있는지 판단하는 등에 사용된다.
Trace (트레이스)는 레벨을 뻗어나가며 직선상에 무엇이 존재하는지 확인할 수 있는 메서드를 제공합니다. 두 (시작과 끝 위치) 지점을 제공해 주면, 피직스 스시템에서 그 두 점에 직선을 그으며 거기에 (콜리전으로) 걸리는 액터가 있는지 보고해 주는 식으로 사용합니다.
시작점으로부터 끝점까지의 직선을 연결하여, 그 직선에 닿는 물체를 검출해 낼 수 있다.
이 글에서는, 최종적으로 맵 상에서 어떤 물체를 식별하고, 이를 집어드는 등의 상호작용을 할 수 있도록 하는 것을 목표로 한다.
트레이스는 피직스 시스템을 사용하므로, 트레이스 대상 카테고리를 정의할 수 있다.
이와 관련된 개념은 이전에 Collision에 대해서 간단히 알아볼 때 다루었는데 더욱 자세히 알 필요가 있다.
여기서 채널(Channel)과 오브젝트 유형(Object) 이라는 개념이 등장한다.
채널을 만들고, 이 채널이 어떤 오브젝트에 어떻게 반응할지를 설정할 수 있다. 반응은 세 가지가 있으며, Block, Ignore, Overlap 이 있다.


어떤 액터가 다른 액터들에 대해 어떻게 동작할지를 표시할 수 있다. 그러나 프리셋만으로는 세부적인 게임의 구현이 힘들 것이다. 이에 따라 직접 커스텀 채널을 생성할 수 있다.
'Project Settings -> Engine -> Collision' 으로 들어간다.
이 글에서 주목하는 곳은 'Trace Channel' 이다.
배경, 지형지물 등의 사물에 대해서는 상호작용을 할 수 없고, 내가 목표로 하는 일부 오브젝트와만 상호작용할 수 있게 하려고 한다. 즉 'New Trace Channel'을 생성하고, Default Response를 Ignore로 설정한다. 모든 물체에 대한 반응을 무시하고, 일부 물체에 대해서는 수동으로 설정해 주는 것이 훨씬 수월하기 때문이다.
물체와 상호작용하여 집어들기 위한 채널로써 이름을 'Grabber' 로 설정했다.

이후, 다시 콜리젼 프리셋에 들어가면 'Grabber' 가 추가됐음을 볼 수 있다.

그리고 반응은 기본값인 'Ignore' 로 설정되어 있다.
이제 나머지 지형지물이나 배경 등을 제외하고, 우리가 상호작용 할 수 있도록 하고 싶은 물체에만 'Grabber' 에 대한 반응을 'Block' 으로 설정한다.

플레이 화면을 보여주는 이 카메라 컴포넌트를 시작점으로 삼으려고 한다.
그리고 끝 지점은 이 카메라 컴포넌트의 Forward 벡터를 구한 뒤, 일정 값을 곱한 값을 더해주면 될 것이다.
이제, 블루프린트에서 Line Trace By Channel 노드를 이용해서 트레이스를 실시해 보려고 한다.

먼저 인풋 핀은 다음과 같이 연결했다.
Event Tick 노드를 연결해 준다.Get World Location을 통해 Start 벡터를 구한다.Forward Vector에서 일정 길이만큼 뻗어나가는 벡터 를 더해주면, 끝점 벡터를 구할 수 있다. Get Forward Vector 에다가 400을 곱한 값, 즉 4m 전방으로 뻗어나가는 벡터를 더해서 End 벡터를 만들어 준다.
그리고 아웃풋 핀은 다음과 같다.
Out Hit 에는 이 트레이스와 충돌한 액터들과 관련된 결과 정보를 담고 있다. 이것을 Break 해서 세분화한 후에, 그 중에서 'Hit Actor'를 가져와 Display Name을 뽑아서 출력하고 있다.

그 결과, 빨간 점 (카메라에서 뻗어나가는 직선이라 점으로 보이는데 실제로는 직선이다)이 가고일 석상에 닿아 있는 동안 액터의 이름이 매 틱마다 출력되고 있는 것을 확인할 수 있다.

실행 도중 F8을 눌러 화면을 이탈시킬 수 있는데, 여기서 화면을 움직여서 보면 플레이어 액터에서 뻗어나가 석상에 부딪히는 빨간 직선을 볼 수 있다.

바닥에는 컬리젼 프리셋에서 Block으로 설정을 바꿔주지 않았기 때문에 감지되지 않고, 석상들에 대해서만 감지하고 있는 것을 볼 수 있다.