※ 해당 기록은 Unreal 5.5.4 버전을 기준으로 작성되었습니다.
이전에 만들었던 WeaponBase와 WeaponDataAsset을 이용해 무기를 구현한다. 그 시작은 샷건부터이다.

샷건으로 근거리 공격이나 휘두르기 등을 가능케할 생각이 없기 때문에 박스 컴포넌트를 RootComponent로 하여, 메쉬와 사격시 총알이 나가는 기준 위치를 지정할 ArrowComponent를 붙였다.
샷건은 따로 스킬을 구현하지 않는 우리 게임의 유이한 원거리 무기이다. 기본 공격은 다섯 갈래로 발사된다. ArrowComoponent인 MuzzlePosComp의 Yaw값을 중앙값으로 각각 { -20, -10, 0, 10, 20 } 의 값의 방향으로 라인트레이스를 쏜다.
for (int i = -2; i < 3; ++i)
{
float angle = BaseAngle + (i * AngleOffset);
FRotator rot (0.f, angle, 0.f);
FVector FireDirection = rot.Vector().GetSafeNormal ();
FVector MuzzlePos = MuzzlePosComp->GetComponentLocation();
FVector TargetPos = MuzzlePos + FireDirection.GetSafeNormal() * Data->NormalAtt.AttRange;
FHitResult outHit;
FCollisionQueryParams params;
params.AddIgnoredActor (this);
params.AddIgnoredActor (this->GetOwner());
bool bHit = GetWorld ()->LineTraceSingleByChannel (outHit, MuzzlePos, TargetPos, ECC_Visibility, params);
DrawDebugLine(GetWorld (), MuzzlePos,TargetPos, FColor::Yellow);
if (bHit)
{
AActor* HitActor = outHit.GetActor();
if (HitActor)
{
AMW_Character* player = Cast<AMW_Character>(HitActor);
if (player)
{
int32& HitCount = HitActorCount.FindOrAdd(player);
}
}
}
}
다음은 피격 처리 로직이다. 다섯 개의 펠릿이 전부 같은 데미지로 들어간다면 근거리에서 이를 대항할 수 없을 것이다. 롤에서 이와 비슷한 스킬로 하이머딩거 W 스킬, 마법공학 초소형 로켓이 있다(앞으로 편의상 w로 한다).

W 특징으로 첫 번째 로켓에 피격당한 적은 추가 로켓에 피격당할 시 첫 로켓보다 더 감소한 피해를 입는다. 그래서 다음과 같은 로직을 사용했다. 라인트레이스 선 한개와 충돌할 때 HitActorCount의 값을 증가시킨다. 첫 데미지는 데이터 에셋에 저장된 데미지를 넣고, 충돌 횟수 - 1 만큼의 추가 데미지를 가한다.
for (const TPair<AMW_Character*, int32>& HitPair : HitActorCount)
{
AMW_Character* HitPlayer = HitPair.Key;
int32 HitCount = HitPair.Value;
float TotalDamage = Data->NormalAtt.AttDamage;
if (HitCount > 1)
{
TotalDamage += (HitCount - 1) * 25.f;
}
UGameplayStatics::ApplyDamage (HitPlayer, TotalDamage, GetOwner ()->GetInstigatorController (), GetOwner (), UDamageType::StaticClass ());
}

애니메이션 블루프린트에 Default Slot을 추가하고 몽타주에서 설정한 Slot으로 변경한다.
맨손을 포함하는 무기 State의 갯수가 9개이다. 애니메이션 블루프린트를 구조화하지 않으면 크게 꼬여 나중에 손대기 힘들어질 것이다. ABP를 정리하고, 나머지 무기를 구현할 계획이다.