UE5

레이캐스트와 트레이스

게임 개발 2024. 1. 11. 00:04

레이캐스트와 트레이스는 같은 작업을 뜻한다.

 

 게임에서 플레이어 캐릭터가 무언가를 바라보고 있는지 확인하여 그런 경우 게임을 어떤 상태로 변경하고자
(예를 들어 플레이어가 무언가를 바라보면 강조시키고자)하는 경우가 있다.

또는 적이 플레이어 캐릭터를 볼 수 있는지 확인하여

그런 경우 어떤 식으로든 발사 또는 교전을 시작시켰으면 하는 경우가 있다.

이러한 두 가지 모두 레이캐스트 또는 트레이스를 통해 보이지 않는 광선을 "발사"하여

두 점 사이에 걸리는 지오메트리가 있는지 확인하고,

걸리는 지오메트리가 있으면 어떤 작업을 할 수 있도록 반환한다.

 

트레이스 실행 시 사용할 수 있는 옵션은 여러가지가 있다.

트레이스를 실행하여 오브젝트와 콜리전 검사를 한 뒤

히트한 오브젝트를 반환하거나,

Trace Channel(트레이스 채널)로 트레이스를 실행하여

특정 (콜리전 세팅으로 설정 가능한) 트레이스 채널에 반응하도록 지정된 오브젝트의 경우에만

히트 정보를 반환하도록 할 수도 있다.

 

오브젝트 또는 트레이스 채널로 트레이스를 실행하는 것에 추가로,

트레이스를 실행시켜 Single(싱글) 히트 또는 Multi(멀티) 히트 감지가 가능하다.

싱글 트레이스는 트레이스에서 단일 히트 결과만을,

멀티 트레이스는 다중 히트 결과를 반환한다.

 

트레이스를 통해 사용되는 광선 유형을 직선, 박스, 캡슐, 구체 중에서 지정할 수도 있다.

 

 

트레이스 개요

트레이스는 레벨을 뻗어나가며 직선사엥 무엇이 존재하는지 확인할 수 있는 메서드를 제공한다.

두 (시작과 끝 위치) 지점을 제공해 주면, 피직스 시스템에서

그 두 점에 직선을 그이며 거기에 (콜리전으로) 걸리는 액터가 있는지 보고해 주는 식으로 사용한다.

트레이스는 본질적으로 다른 소프트웨어의 레이 캐스트 또는 레이 트레이스와 같다.

 

한 액터가 다른 액터를 "볼" 수 있는지를 알고싶다거나,

특정 폴리곤의 노멀을 알아낸다거나,

고속의 무기 시뮬레이션을 한다거나,

액터가 어떤 공간에 들어섰느지 알고싶다거나 하는 상황에서,

트레이스는 저렴한 비용의 믿을만한 해결책이된다.

 

 

 

채널 또는 오브젝트 유형으로 트레이스

 

트레이스는 피직스 시스템을 사용하므로, 트레이스 대상 카테고리를 정의할 수 있다.

크게 두 가지 범주로 나눌 수 있는데, 체널과 오브젝트 유형이다.

채널은 비저빌리티와 같은 카메라같은 것에 사용되며, 거의 트레이스에만 쓰인다.

오브젝트 유형은 씬에 콜리전이 있는 피직스 액터 유형으로, 폰, 비히클, 디스트럭터블 액터 등이다.

 

채널과 오브젝트 유형은 필요에 따라 추가할 수 있다.

 

자세한 방법은 추후에 프로젝트 커스텀 오브젝트 유형 추가 라는 언리얼 문서를 참고하길 바란다.

 

 

 

싱글 또는 멀티 히트 반환

 

트레이스를 할 때,

걸린 것 중 범주에 일치하는 첫 번째 것을 반환하도록 할 수도 있고, 모든 것을 반환하도록 할 수도 있다.

 

Multi Trace by Channel (채널로 멀티 트레이스) vs Multi Trace by Object (오브젝트로 멀티 트레이스)

사이에는 특벌한 주의가 필요하다.

 

채널로 멀티 트페이스 사용시 트레이스는 첫 block 을 포함하여 그 곳까지의 모든 오버랩을 반환한다.

발사된 총알이 큰 유리를 관통하여 벽에 맞는 것을 생각해 보면 된다.

 

오브젝트로 멀티 트레이스는 컴포넌트가 트레이스 쿼리를 반환하도록 설정되어있다 가정하고,

트레이스가 찾는 오브젝트 유형에 일치하는 모든 것을 반환한다.

트레이스 시작 및 끝 지점 사이의 오브젝트 수를 세기에 좋다.

 

 

히트 결과("Hit Result")

 

트레이스가 무언가에 걸릴 때, "Hit Result" 구조체를 반환한다.

블루프린트 및 C++에서도 사용 가능한 구조체이다.

 

BP Hit Result 구조체

 

기능 설명

 

멤버 정의
Blocking Hit 블로킹 히트 -
히트가 블로킹 히트였는지에 대한 여부이다.
트레이스가 겹치게만 하고 멈추지는 않도록 하는 기능이기 때문에
채널로 멀티 트레이스 시 사용된다.
Initial Overlap 초기 겹침 - 일련의 결과 중 첫 번째 오버랩인지 판단해주는 것이다.
Time 시간 -
트레이스 방향 상의 임팩트 시간으로, [0.0 에서 1.0 까지] 범위이다.
히트가 없는 경우 1.0을 반환한다.
Location 위치 - 트레이스 셰이프에 따라 변경된 히트의 월드 스페이스 위치이다.
Impact Point 임팩트 지점 - 히트 절대 위치이다.
트레이스 셰이프는 포함되지 않으며, 오롯이 히트 지점만을 뜻한다.
Normal 노멀 - 트레이스 방향이다.
Impact Normal 임팩트 노멀 - 히트된 지점의 표면 노멀이다.
Phys Mat 피지컬 머티리얼 - 히트 표면의 피지컬 머티리얼이다.
Hit Actor 히트 액터 - 히트 액터이다.
Hit Component 히트 컴포넌트 - 특정 히트 컴포넌트이다.
Hit Bone Name 히트 본 이름 -
스켈레탈 메시에 대해 트레이스를 한 경우 히트한 본의 이름을 가져온다.
Hit Item 히트 아이템 -
프리미티브의 어느 아이템에 히트했는지 기록하는
프리미티브 전용 데이터이다.
Face Index 면 인덱스 - 트라이메시 또는 랜드스케이프와 충돌하는 경우,
히트한 면 인덱스를 뜻한다.
Trace Start 트레이스 시작 - 트레이스 시작 위치이다.
Trace End 트레이스 끝 - 트레이스 끝 위치이다.

 

 

 

 

 

셰이프 트레이스 사용

 

 

(Line Trace)라인 트레이스가 충분치 않은 경우,

Shape Trace(셰이프 트레이스)를 사용하면 원하는 결과를 얻을 수도 있다.

예를 들어 적이 플레이어 감지를 위한 "시야 원뿔"을 만든다 치자.

라인 트레이스의 경우 웅크린 플레이어를 감지하지 못할 수기에 충분치 않을 수 있다.

 

이런 상황에서는
Box Trace(박스 트레이스), Capsule Trace(캡슐 트레이스), Sphere Trace(구체 트레이스)같은 것을 사용할 수 있다.

 

 

 

각 셰이프 트레이스 함수는 시작 지점에서 끝 지점까지 스윕 및 검사를 할 때는

라인 트레이스처럼 작동하나, 

셰이프 트레이스는 레이 캐스트에서 어떤 부피를 갖는 모양을 사용하여

한 번 더 검사를 한다는 점이 다르다.

셰이프 트레이스는 싱글 트레이스 또는 멀티 트레이스로도 사용할 수 있으며,

그 각각은 라인 트레이스와 같은 방식으로 구성할 수 있지만,

사용하는 셰이프의 크기나 방향 관련해서 추가적인 정보를 제공해 줘야 한다.

 

 

트레이스에서 UV 좌표 구하기

 

 

복합 트레이스를 사용했다는 가정 하에, 트레이스에 걸린 액터의 UV 좌표를 반환할 수 있다.

4.14 버전 이후로는 이 기능은 Static Mesh Component, Procedural Mesh Component, BSP에서만 작동한다.

Skeletal Mesh Component 에서는 작동하지 않는다. (멀티 트레이스를 선택해도 그러하다.)

UV 좌표가 없는 피직스 애셋을 대상으로 트레이스를 하는 것이기 때문이다.

 

이 기능을 사용하면 CPU 메모리 사용량이 늘어나는데,
언리얼 엔진 4 이후부터는 메모리에 버텍스 위치와 UV 좌표 사본을 추가로 유지하기 때문이다.

 

 

 

트레이스에서 UV 좌표 키기

 

1. 편집 메뉴의 프로젝트 세팅 창을 킨다.

 

 

2. 프로젝트 세팅의 피직스 섹션에서 Support UV From Hit Result (히트 결과에서 UV 지원) 기능을 킨다.

 

 

3. 에디터를 재시작한다.

 

에디터를 재시작하기 전에도
이 기능을 사용하는 블루프린트  Find Collision UV 노드를 조사해 볼 수는 있지만,
조사해도 [0.0, 0.0] 값만 반환한다.
노드가 올바른 UV 데이터를 반환하도록 하려면,
에디터를 재시작해야 합니다.

 

 

 

기타 기능

 

트레이스에는 디버깅 편의를 위해 반환되는 값을 제한시킬 수 있는 자잘한 기능이 여럿 있다.

스태틱 메시나 프로시저럴 메시에 Complex Collision(복합 콜리전) 옵션이 켜져있는 경우,

그를 대상으로 트레이스를 하는 기능이 있다.

액터에서 호출된 경우 액터 스스로를 통해 트레이스하도록 하는 기능을 켜면

붙어있는 컴포넌트 전부를 무시하도록 할 수 있다.

마지막으로 트레이스를 빨강 및 초록색 선으로, 히트는 커다란 박스로 나타내는 옵션이 있다.

 

 

 

참고 문서

 

https://docs.unrealengine.com/4.27/ko/InteractiveExperiences/Tracing/HowTo/