1. 개요

일반적인 TPS 또는 FPS 게임에서 캐릭터의 총구에서 총알이 나가는 것보다, 카메라가 바라보는 곳의 정중앙에서 총알이 나가는 것이 더 직관적으로 작동한다.

또한 특정 물체는 지나가게 하거나, 맞게 하거나, 맞긴 하지만 데미지를 받지 않게 하기 위해 LineTraceByChannel 함수를 사용한다.

 

트레이스 개요

언리얼 엔진 4 의 트레이스 시스템 개요입니다.

docs.unrealengine.com

 

 

2. 트레이스 채널 설정

새로운 트레이스 채널을 생성하고, 각 콜리전 별로 충돌을 무시, 오버랩, 블록하도록 설정한다.

 

 

3. 라인 트레이스

(1) Gun.h

	UPROPERTY(EditAnywhere)
	float MaxRange = 1000;

총의 최대 사거리를 설정한다.

 

(2) Gun.cpp

#include "DrawDebugHelpers.h"
void AGun::PullTrigger()
{
	UGameplayStatics::SpawnEmitterAttached(MuzzleFlash, Mesh, TEXT("MuzzleFlashSocket"));

	APawn* OwnerPawn = Cast<APawn>(GetOwner());
	if (OwnerPawn == nullptr)
		return;

	AController* OwnerController = OwnerPawn->GetController();
	if (OwnerController == nullptr)
		return;
	
	FVector Location;
	FRotator Rotation;
	OwnerController->GetPlayerViewPoint(Location, Rotation);

	FVector End = Location + Rotation.Vector() * MaxRange;

	// 라인트레이스
	FHitResult Hit;

	bool bSuccess = GetWorld()->LineTraceSingleByChannel(Hit, Location, End, ECollisionChannel::ECC_GameTraceChannel1);
	if(bSuccess)
	{
		DrawDebugPoint(GetWorld(), Hit.Location, 20, FColor::Red, true);
	}
}

이제 화면의 중앙이 조준점이 되도록 할 것이므로, 뷰포트의 위치를 가져와야 한다.

 

(2-1) 뷰포트 트랜스폼 가져오기

- 뷰포트의 트랜스폼을 가져오기 위해서는 컨트롤러가 필요하다.

- 컨트롤러는 Pawn만이 소유할 수 있다. 

- 게임 내에서 조작하는 내 캐릭터는 Pawn이므로, GetOwner를 이용해 Controller를 가져온다.

- 가져온 컨트롤러를 이용하여 뷰포트의 트랜스폼을 가져온다.

 

(2-2) 라인 트레이스 계산

- 라인 트레이스가 시작되는 지점은 뷰포트의 중앙이므로 Location을 그대로 사용하면 된다.

- 끝점은 시작된 지점에서부터 일정거리 떨어진 어떤 지점이고, 여기에서는 MaxRange를 활용한다.

- 뷰포트의 회전 트랜스폼의 단위벡터를 Rotation.Vector로 구하고, 이를 최대 사거리로 곱하면 최대 사거리의 크기를 가지는 벡터를 만들 수 있다.

- 첫 위치에 위의 계산식을 더하면 뷰포트 중앙에서 최대 사거리 만큼 나아가는 라인 트레이스를 계산할 수 있다.

 

(2-3) 피격점 표시하기(디버그 포인트 사용)

이제 월드를 가져와 LineTraceSingleByChannel 함수를 사용한다. 이 함수는 불리언을 반환한다.

해당 불리언이 true이면 그 지점에 디버그 점을 그리도록 설정한다.

벽에 부딫힌 LineTrace