인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

조준수님의 프로필 이미지
조준수

작성한 질문수

이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해

6강 캐릭터 공격 판정

Collision 관련 감지 문제에 대한 질문입니다

작성

·

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

이득우님의 프로필 이미지
이득우
지식공유자

음.. 이상하네요.
언리얼도 자체 구현한게 아닌 외부 물리 엔진을 사용하는거니 디버깅은 안될겁니다.
왜 그런지는 프로젝트를 보고 파악해야 할 것 같은데,
두 방법에는 차이가 없으니 우선은 동작하는 방법으로 쓰셔도 무방할 것 같습니다.

조준수님의 프로필 이미지
조준수

작성한 질문수

질문하기