inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

6강 캐릭터 공격 판정

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

495

조준수

작성한 질문수 33

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 일때도 결과는 똑같았습니다.

 

 

 

 

 

 

 

 

 

 

 

unreal-engine ue-blueprint 언리얼-c++

답변 1

0

이득우

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

무한맵 제작과정중에 GetWorld 가 Nullptr 을 반환합니다.

0

46

2

12강 행동트리에서 질문이 있습니다.

0

52

1

위젯 사이즈랑 위치 질문드려요.

0

81

3

행동트리의 데코레이션 관련하여 질문이 있습니다.

0

94

3

VS 2026 의 문제일까요?

0

488

2

에셋참조 블루프린트질문

0

67

2

애님 몽타주 콤보 관련질문

0

70

2

ThirdPerson CDO 에러가 생깁니다.

0

95

3

캐릭터가 움직이지 않습니다.

0

181

4

쿠킹 폴더 지정시 , Item 이외에는 지정하지 않는지 궁금합니다.

0

62

2

TSoftObjectPtr 를 사용했음에도, 메모리에 로드 됩니다.

0

94

2

7강에 나오는 생성자에 대해서 궁금합니다.

0

78

2

6강을 마무리하며 트레이스 채널 을 이해하지 못했습니다.

0

73

2

3강을 마무리 하며, 카메라가 움직이지 않습니다.

0

71

2

Use Controller Rotation 옵션값이 궁금합니다.

0

84

2

3강 입력 시스템 적용 중, 5.6 버전은 입력 매팅이 2개 입니다.

0

65

2

PlayerController 에 대헤 제가 잘못 이해한 것 같습니다.

0

78

2

13강 UpdateStat 부분에서 문제를 겪고 있습니다.

0

63

2

BP_PlayerController의 CustomEvent노드 이유가 궁금합니다.

0

64

1

콤포넌트 포인터 선언시 TObjectPtr<>과 UStaticMeshComponent* 차이점

0

72

2

CharacterMovementComponent의 RotationRate관련해서 질문이 있습니다.

0

115

2

언리얼 공부방법에 대해 질문드립니다.

0

87

2

4강 에서 이상한 그림자가 남습니다.

0

46

1

2강에서 카메라 회전안되시는분 참고

2

91

2