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 함수를 활용해 컨트롤러를 분리하고 캡슐 컴포넌트의 콜리전을 제거한다.
'UE 5 스터디 > C++' 카테고리의 다른 글
13. 승리 조건, 컨트롤러에 종료 조건 전달(TActorRange) (1) | 2024.03.08 |
---|---|
12. 패배 조건 - 게임 재시작, UI 위젯 스폰 (1) | 2024.03.08 |
10. 비헤이비어 트리 - 서비스 노드 (0) | 2024.03.08 |
9. 비헤이비어 트리 노드 생성하기 (0) | 2024.03.08 |
8. 비헤이비어 트리와 블랙 보드 (0) | 2024.03.07 |