언리얼4 C++ 범위형 데미지와 발사 딜레이(Radial Damage & Fire Delay)

Intro

  • 범위형 보조 무기 추가

보조 무기 슬롯 추가

1

슬롯을 추가해준다음 1번 2번키로 교체할수 있도록 함

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 함수를 실행해 발사가능하게 만들어준다.

실행결과

3

참고문서

https://api.unrealengine.com/INT/API/Runtime/Engine/Kismet/UGameplayStatics/ApplyRadialDamage/index.html

댓글남기기