11. 트러블 슈팅

Crat3 ㅣ 2024. 3. 8. 18:32

1. 적 AI가 스스로를 쏘는 문제 - Gun.cpp

Gun.cpp에서 총이 발사되는 함수를 보면 라인트레이스가 액터의 눈높이에서 시작되는 것을 볼 수 있다.

FVector Location;
	FRotator Rotation;
	OwnerController->GetPlayerViewPoint(Location, Rotation);

AI 폰의 눈에서 발사된 라인 트레이스가 본인의 캡슐에 부딫히며 HitResult가 반환되면서 발생하는 버그이다.

이를 수정하기 위해 라인 트레이스에 쿼리 파라미터를 추가하여 총과 소유자는 무시하도록 설정한다.

	// 라인트레이스
FHitResult Hit;
FCollisionQueryParams Params;
Params.AddIgnoredActor(this);
Params.AddIgnoredActor(GetOwner());

bool bSuccess = GetWorld()->LineTraceSingleByChannel(Hit, Location, End, ECollisionChannel::ECC_GameTraceChannel1, Params);

라인 트레이스 함수의 마지막에 해당 파라미터를 인수로 넘겨주면 된다.

 

 

2. 폰 사망 이후에도 여전히 사격하는 문제 - AShooterCharacter

폰이 사망 이후에도 충돌판정을 가지는 문제를 해결한다.

#include "Components/CapsuleComponent.h"
float AShooterCharacter::TakeDamage(float DamageAmount, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser)
{
	float DamageApplied = Super::TakeDamage(DamageAmount, DamageEvent, EventInstigator, DamageCauser);

	DamageApplied = FMath::Min(Health, DamageApplied);
	Health -= DamageApplied;

	UE_LOG(LogTemp, Display, TEXT("Your message %f"), Health);

	if (IsDead())
	{
		DetachFromControllerPendingDestroy();
		GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);
	}

	return DamageApplied;
}

기존에 생성했던 IsDead 함수를 활용해 컨트롤러를 분리하고 캡슐 컴포넌트의 콜리전을 제거한다.