티스토리 뷰

🟩 구현 목표

  • IEnemy 인터페이스 연동을 통해 몬스터에게 데미지를 전달하고 수류탄의 물리 충격량(Impulse)을 구현한다.
  • 마우스 커서 추적 방식의 에임 시스템을 구축하고 근거리 예외 처리 및 Z축 수평 보정 로직을 적용한다.
  • 몸체 회전과 사격 방향을 분리하여 쌍권총 발사 시 발생하는 캐릭터 진동 및 카메라 흔들림 버그를 해결한다.

🟧 1. 몬스터 인터페이스 및 수류탄 시스템 강화

🟦 IEnemy 인터페이스 연동 및 데미지 감쇄

몬스터 담당자와 협업하여 정의한 IEnemy 인터페이스를 무기 시스템에 이식했다. 단순히 고정 데미지를 주는 것이 아니라, 수류탄 폭발 중심부와의 거리에 따라 FMath::Lerp를 활용한 데미지 감쇄 로직을 적용해 현실감을 높였다.

// 몬스터 인터페이스 형변환 및 데미지 전달
IEnemy* Enemy = Cast<IEnemy>(HitActor);
if (Enemy)
{
    // 데이터 테이블의 Max/Min 데미지를 거리비율에 따라 계산
    float FinalDamage = FMath::Lerp(MinDamage, MaxDamage, DistanceRatio);
    Enemy->TakeDamage(FinalDamage);
}

🟦 수류탄 물리 충격(Impulse) 구현

폭발 시 데미지 전달과 동시에 주변 물리 액터들을 밀쳐내는 Radial Impulse 기능을 추가했다. 이를 통해 적 몬스터뿐만 아니라 주변 사물들이 폭발 방향으로 튕겨 나가는 시각적 피드백을 강화했다.


🟧 2. 쿼터뷰 최적화 에임 시스템 구현

🟦 마우스 커서 추적 및 근거리 예외 처리

기존의 정면 발사 방식에서 마우스 커서의 ImpactPoint를 실시간으로 추적하는 방식으로 고도화했다. 특히 마우스가 캐릭터와 너무 가까울 때 벡터 계산 오류로 탄환이 튀는 현상을 막기 위해, Dist2D가 100 이하일 경우 ForwardVector로 강제 고정하는 예외 처리를 수행했다.

// 수평 사격 및 근거리 예외 처리
FVector TargetPoint = CursorHit.ImpactPoint;
float DistToMouse = FVector::Dist2D(OwnerChar->GetActorLocation(), TargetPoint);

if (DistToMouse < 100.f) {
    FireDir = OwnerChar->GetActorForwardVector(); // 근거리는 정면 발사
} else {
    FVector DirToTarget = (TargetPoint - Start);
    DirToTarget.Z = 0.f; // Z축 고정으로 수평 사격 보장
    FireDir = DirToTarget.GetSafeNormal();
}

🟦 Z축 수평 보정 로직

쿼터뷰 시점에서는 마우스 포인터가 지면을 찍기 때문에 단순 벡터 계산 시 총알이 바닥으로 박히는 문제가 발생한다. 사격 벡터의 Z값을 0.f로 고정하여 모든 탄환이 지면과 평행하게 날아가도록 보정했다.


🟧 3. 쌍권총 사격 진동 및 카메라 흔들림 해결

🟦 몸체 회전과 사격 벡터 분리

좌우 총구 소켓의 위치 차이로 인해 사격 시마다 캐릭터 몸체가 미세하게 회전하며 카메라가 떨리던 버그를 수정했다. 캐릭터의 ActorRotation은 캐릭터 중심점 기준의 마우스 방향으로만 회전시키고, 실제 총알이 나가는 방향(FireDir)만 각 소켓에서 마우스 포인트를 향해 수렴하도록 로직을 분리했다.

// 몸체 회전과 사격 방향 분리 (진동 방지)

// 몸체는 캐릭터 중심 기준으로만 회전하여 카메라 떨림 방지
FVector BodyDir = (TargetPoint - OwnerChar->GetActorLocation());
BodyDir.Z = 0.f;
OwnerChar->SetActorRotation(BodyDir.Rotation());

// 총알은 각 총구(Start)에서 목표점을 향해 수렴 발사
FVector FireDir = (TargetPoint - Start).GetSafeNormal();

🟧핵심 요약

  • 협업 : 인터페이스(IEnemy) 기반 설계를 통해 몬스터와 무기 시스템 간의 결합도를 낮추고 유연한 공격 처리가 가능해졌다.
  • 안정성 : Dist2D 기반의 근거리 예외 처리와 Z축 고정을 통해 쿼터뷰 슈팅의 고질적인 조준 버그를 해결했다.
  • 디테일 : 몸체 회전과 사격 벡터를 분리하는 것만으로도 쌍권총 특유의 사격감을 해치지 않으면서 화면 떨림 문제를 완벽히 제어할 수 있음을 배웠다.