언리얼4 C++ 범위형 데미지와 발사 딜레이(Radial Damage & Fire Delay)
Intro
- 범위형 보조 무기 추가
보조 무기 슬롯 추가
슬롯을 추가해준다음 1번 2번키로 교체할수 있도록 함
보조무기 재장전 추가
void AFPSPlayer::ReloadEnd()
{
if (BowState)
{
if ((BoltMagazine - Bolt) > RemainBolt)
{
Bolt = (RemainBolt + Bolt);
RemainBolt = 0;
}
else
{
RemainBolt = RemainBolt - (BoltMagazine - Bolt);
Bolt = (BoltMagazine - Bolt) + Bolt;
}
}
else {
if ((Magazine - Ammo) > RemainAmmo)
{
Ammo = (RemainAmmo + Ammo);
RemainAmmo = 0;
}
else
{
RemainAmmo = RemainAmmo - (Magazine - Ammo);
Ammo = (Magazine - Ammo) + Ammo;
}
}
IsReloading = false;
}
보조무기(CrossBow)를 든상태에서는 Bolt
를 재장전하도록 수정
보조무기 발사 추가
void AFPSPlayer::StartFire()
{
if (BowState)
{
isFiring = true;
BowFire();
}
else
{
isFiring = true;
Fire();
}
}
좌클릭했을때 실행되는 StartFire
함수에서 보조무기를 든 상태에서는 BowFire
가 실행되도록 함
## 범위형 데미지(Radial Damage)
ApplyDamage ```cpp if (isHit) { if (OutHit.GetActor()) { AActor* HitActor = OutHit.GetActor();
ActualDamage = FMath::RandRange((Damage - (Damage / 100) * 20)*10, (Damage + (Damage / 100) * 20)*10);
GameStatic->SpawnEmitterAtLocation(GetWorld(), ExplosionParticle, OutHit.ImpactPoint,FRotator::ZeroRotator,FVector(5.0f,5.0f,5.0f));
//GameStatic->ApplyPointDamage(HitActor, ActualDamage, HitActor->GetActorLocation(), OutHit, nullptr, this, nullptr); // 포인트 데미지
GameStatic->PlaySoundAtLocation(this, ExplosionCue, OutHit.ImpactPoint);
GameStatic->ApplyRadialDamage(GetWorld(), ActualDamage, OutHit.ImpactPoint, 1000.0f,nullptr,TArray<AActor*>(),this,false,ECC_Visibility);
}
}
충돌지점에 폭발 파티클을 생성하고 포인트 데미지 대신 `ApplyRadialDamage`를 사용하여 `ImpactPoint`에서 1000.0f 만큼 범위에 기존 데미지의 10배를 주도록 함
> ReceiveDamage
```cpp
void AZombie::ReceiveRadialDamage(float DamageReceived, const UDamageType * DamageType, FVector Origin, const FHitResult & HitInfo, AController * InstigatedBy, AActor * DamageCauser)
{
HP -= DamageReceived;
if (HP <= 0)
{
IsDeath = true;
Death();
}
}
좀비 클래스에 ReceiveRadialDamage
함수를 통해 범위형 데미지에 반응하도록 함
발사 딜레이
FireDelay = true;
GetWorld()->GetTimerManager().SetTimer(timer, this, &AFPSPlayer::Delay, 1.0f, false);
void AFPSPlayer::Delay()
{
FireDelay = false;
}
무기 발사시 FireDelay
상태를 true로 만들어 발사를 불가능하게 한다음
SetTimer
함수를 통해 1초뒤에 Delay
함수를 실행해 발사가능하게 만들어준다.
댓글남기기