BB프로젝트 6일차

김재혁·2025년 2월 25일

계획

  • 어제 작성한 코드 재확인 후 정리
  • AI 사망 로직 구현 재정의
  • 공격 방식의 다양화 구현
  • 공격 범위 재설정
  • AI가 경사진곳(계단 등)을 이동할 수 있게 설정

공격 범위 수정

Trace 수정

  • 지금 공격을 할때는 Line Trace를 써서 적을 찾아 충돌하는 원리로 작성했기 때문에 손으로 근접공격을 하는 좀비에게는 맞지 않음. 그래서 다른 방식으로 변경해야 할 필요성 느낌.
    -> Sphere Trace를 이용하여 선 대신 구체로 변경하면 그 범위내에 있을 시 타격이 가능하므로 AI를 더 입체적으로 구현 할 수 있을 거라 생각.

변경 전(Line Trace)

bool bHit = GetWorld()->LineTraceSingleByChannel(HitResult, Start, End, ECC_Pawn, CollisionParams);

변경 후(Sphere Trace)

bool bHit = GetWorld()->SweepMultiByChannel(HitResults,
Start, End, FQuat::Identity, ECC_Pawn, 
FCollisionShape::MakeSphere(SphereRadius), CollisionParams);

-> 실험 결과 범위 변경 되는거 확인 (UPROPERTY로 씌워서 범위 수정가능하게 만듦).

부위별 피격 데미지 설정

  • FHitResultBoneName에 포함되어 있다고 함.
    -> BoneName 별로 데미지를 다르게받는걸로 작성.
  • 머리(HeadShotDamage) / 몸통(BodyShotDamage) / 팔다리(ArmLegDamage) 추가 후 구현
float ANXNonPlayerCharacter::TakeDamage(float DamageAmount, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser)
{
    float Health = GetCurrentHealth();
    const FPointDamageEvent* PointDamageEvent = static_cast<const FPointDamageEvent*>(&DamageEvent);
    if (PointDamageEvent)
    {
        FName HitBone = PointDamageEvent->HitInfo.BoneName;
        if (HitBone == FName("head")) // 머리
        {
            DamageAmount = HeadShotDamage; // 헤드샷 데미지
        }
        else if (HitBone == FName("torso")) // 몸통
        {
            DamageAmount = BodyShotDamage;
        }
        else if (HitBone == FName("leg")) // 다리
        {
            DamageAmount = ArmLegDamage;
        }
    }
    Health -= DamageAmount;
    if (Health <= 0.f)
    {
        Die();
    }
    return DamageAmount;
}

처음에 Cast를 썼는데 오류가 발생 ( 엔터티를 초기화 할 수 없다?)

-> 처음보는 문구라 인터넷 서칭..

  • DamageEvent가 실제로 FPointDamageEvent 객체가 아닐수도 있다..?
    언리얼 커뮤니티에서 찾아보니까 비슷한 문구가 있었음 (솔직히 지금은 봐도 이해가 잘안된다..)
    언리얼 커뮤니티 관련 질문
    -> DamageEvent의 타입이 FPointDamageEvent가 아닐 경우 Cast는 실패할 수 있다는 원인이 가장 내 문제와 근접해보임 하지만 커뮤니티에도 static_cast를 사용하라는 피드백이 있었기 때문에 DamageEvent가 실제로 FPointDamageEvent 타입이라고 확신하는 것이라고 판단해서 static_cast를 사용해보기로함.

결과는 성공적..!

깃 부분에 대해서 시간소모가 너무 많이 돼서 나머지 부분은 내일로....

0개의 댓글