1. 개요
일반적인 TPS 또는 FPS 게임에서 캐릭터의 총구에서 총알이 나가는 것보다, 카메라가 바라보는 곳의 정중앙에서 총알이 나가는 것이 더 직관적으로 작동한다.
또한 특정 물체는 지나가게 하거나, 맞게 하거나, 맞긴 하지만 데미지를 받지 않게 하기 위해 LineTraceByChannel 함수를 사용한다.
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이면 그 지점에 디버그 점을 그리도록 설정한다.
'UE 5 스터디 > C++' 카테고리의 다른 글
7. AI에 길 찾기 알고리즘 적용(NavMesh, MoveTo) (0) | 2024.03.07 |
---|---|
6. 액터에 데미지 입히기(FDamageEvent, TakeDamage) (0) | 2024.03.07 |
4. 이펙트 스포닝하기(SpawnEmitterAttached) (0) | 2024.03.06 |
3. 액터를 다른 액터에 붙이기(AttachToComponent) (0) | 2024.03.06 |
2. 런타임에 액터 스포닝(Spawning) 하기(SpawnActor) (0) | 2024.03.06 |