이번 글에서는 아주 중요한 트레이스라는 개념에 대해서 알아보고자 한다.
트레이스는 게임 내에서 매우 많은 기능을 가능하게 한다.
가령, 어떤 물체를 바라보고 집을 수 있게 하거나, 어떤 공간 안에 액터가 들어왔는지 여부를 판단하거나, 이 액터가 다른 액터를 '볼' 수 있는지 판단하는 등에 사용된다.
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으로 설정을 바꿔주지 않았기 때문에 감지되지 않고, 석상들에 대해서만 감지하고 있는 것을 볼 수 있다.