작성
·
326
·
수정됨
0
void AABCharacterBase::NotifyHitCheck()
{
//const float AttackRange = CharacterStatComponent->GetTotalStat().AttackRange;
const float AttackRange = 1000.f;
const float AttackRadius = 50.f;
const float AttackDamage = CharacterStatComponent->GetTotalStat().AttackDamage;
const FVector Start = GetActorLocation() + GetActorForwardVector() * GetCapsuleComponent()->GetScaledCapsuleRadius();
const FVector End = Start + GetActorForwardVector() * AttackRange;
FCollisionQueryParams Params(SCENE_QUERY_STAT(Attack), true, this);
TArray<FHitResult> HitResults;
bool bHitResult = GetWorld()->SweepMultiByChannel(HitResults, Start, End, FQuat::Identity, ECollisionChannel::ECC_GameTraceChannel1, FCollisionShape::MakeCapsule(AttackRadius, AttackRange * 0.5f), Params);
//bool bHitResult = GetWorld()->SweepMultiByObjectType(HitResults, Start, End, FQuat::Identity, FCollisionObjectQueryParams::AllDynamicObjects, FCollisionShape::MakeCapsule(AttackRadius, AttackRange * 0.5f), Params);
//bool bHitResult = GetWorld()->SweepMultiByProfile(HitResults, Start, End, FQuat::Identity, TEXT("ABCapsule"), FCollisionShape::MakeCapsule(AttackRadius, AttackRange * 0.5f), Params);
if (bHitResult)
{
for (const auto& HitResult : HitResults)
{
FDamageEvent DamageEvent;
HitResult.GetActor()->TakeDamage(AttackDamage, DamageEvent, GetController(), this);
}
}
#if ENABLE_DRAW_DEBUG
FVector CapsuleOrigin = Start + (End - Start) * 0.5f;
float CapsuleHalfHeight = AttackRange * 0.5f;
DrawDebugLine(GetWorld(), Start, End, FColor::Purple, false, 2.f);
FColor Color = FColor::Red;
if (bHitResult)
{
if (HitResults.Num() > 2)
{
Color = FColor::Cyan;
}
else if (HitResults.Num() > 1)
{
Color = FColor::Magenta;
}
else if (HitResults.Num() > 0)
{
Color = FColor::Green;
}
}
DrawDebugCapsule(GetWorld(), CapsuleOrigin, CapsuleHalfHeight, AttackRadius, FRotationMatrix::MakeFromZ(GetActorForwardVector()).ToQuat(), Color, false, 1.f);
#endif
}
Collision 을 채널 또는 프로파일로 할 경우 아래와 같이 가장 가까운 물체만 충돌감지를 합니다. (초록색의 경우 1개만 감지했을때)
Collision 을 오브젝트 타입으로 할 경우 위와 같은 문제가 발생하지 않습니다. (청록색의 경우 3개 이상 감지 했을때)
왜 이러나 디버깅을 해보려 하였는데 내부 구현이 전부 템플릿으로 되어있어 디버깅이 어렵더라고요... 하여 혹시나 위의 문제가 왜 발생하는건지 아시는지 궁금하여 질문드려봅니다.
확인차 강의에서 제공되는 샘플코드에서도 테스트를 해봤는데 위와 같은 문제가 똑같이 발생하네요.
Sweep 이 아닌 LineTrace 일때도 결과는 똑같았습니다.
답변 1
0
음.. 이상하네요.
언리얼도 자체 구현한게 아닌 외부 물리 엔진을 사용하는거니 디버깅은 안될겁니다.
왜 그런지는 프로젝트를 보고 파악해야 할 것 같은데,
두 방법에는 차이가 없으니 우선은 동작하는 방법으로 쓰셔도 무방할 것 같습니다.