174 - Replicating Shotgun Shatter
This commit is contained in:
parent
e107458690
commit
82e10b18a6
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
#include "Blaster/Character/BlasterCharacter.h"
|
#include "Blaster/Character/BlasterCharacter.h"
|
||||||
#include "Blaster/PlayerController/BlasterPlayerController.h"
|
#include "Blaster/PlayerController/BlasterPlayerController.h"
|
||||||
|
#include "Blaster/Weapon/Shotgun.h"
|
||||||
#include "Blaster/Weapon/Weapon.h"
|
#include "Blaster/Weapon/Weapon.h"
|
||||||
#include "Camera/CameraComponent.h"
|
#include "Camera/CameraComponent.h"
|
||||||
#include "Engine/SkeletalMeshSocket.h"
|
#include "Engine/SkeletalMeshSocket.h"
|
||||||
|
@ -124,9 +125,13 @@ void UCombatComponent::Fire()
|
||||||
|
|
||||||
void UCombatComponent::FireProjectileWeapon()
|
void UCombatComponent::FireProjectileWeapon()
|
||||||
{
|
{
|
||||||
|
if (PrimaryWeapon)
|
||||||
|
{
|
||||||
|
HitTarget = PrimaryWeapon->bUseScatter ? PrimaryWeapon->TraceEndWithScatter(HitTarget) : HitTarget;
|
||||||
LocalFire(HitTarget);
|
LocalFire(HitTarget);
|
||||||
ServerFire(HitTarget);
|
ServerFire(HitTarget);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void UCombatComponent::FireHitScanWeapon()
|
void UCombatComponent::FireHitScanWeapon()
|
||||||
{
|
{
|
||||||
|
@ -140,6 +145,11 @@ void UCombatComponent::FireHitScanWeapon()
|
||||||
|
|
||||||
void UCombatComponent::FireShotgun()
|
void UCombatComponent::FireShotgun()
|
||||||
{
|
{
|
||||||
|
if (AShotgun* Shotgun = Cast<AShotgun>(PrimaryWeapon))
|
||||||
|
{
|
||||||
|
TArray<FVector> HitTargets;
|
||||||
|
Shotgun->ShotgunTraceEndWithScatter(HitTarget, HitTargets);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include "Blaster/Character/BlasterCharacter.h"
|
#include "Blaster/Character/BlasterCharacter.h"
|
||||||
#include "Engine/SkeletalMeshSocket.h"
|
#include "Engine/SkeletalMeshSocket.h"
|
||||||
#include "Kismet/GameplayStatics.h"
|
#include "Kismet/GameplayStatics.h"
|
||||||
|
#include "Kismet/KismetMathLibrary.h"
|
||||||
|
|
||||||
void AShotgun::Fire(const FVector& HitTarget)
|
void AShotgun::Fire(const FVector& HitTarget)
|
||||||
{
|
{
|
||||||
|
@ -75,3 +76,26 @@ void AShotgun::Fire(const FVector& HitTarget)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AShotgun::ShotgunTraceEndWithScatter(const FVector& HitTarget, TArray<FVector>& HitTargets)
|
||||||
|
{
|
||||||
|
const USkeletalMeshSocket* MuzzleFlashSocket = GetWeaponMesh()->GetSocketByName("MuzzleFlash");
|
||||||
|
if (MuzzleFlashSocket == nullptr) return;
|
||||||
|
|
||||||
|
const FTransform SocketTransform = MuzzleFlashSocket->GetSocketTransform(GetWeaponMesh());
|
||||||
|
const FVector TraceStart = SocketTransform.GetLocation();
|
||||||
|
|
||||||
|
const FVector ToTargetNormalized = (HitTarget - TraceStart).GetSafeNormal();
|
||||||
|
const FVector SphereCenter = TraceStart + ToTargetNormalized * DistanceToSphere;
|
||||||
|
|
||||||
|
|
||||||
|
for (uint32 i = 0; i < NumberOfPellets; i++)
|
||||||
|
{
|
||||||
|
const FVector RandVec = UKismetMathLibrary::RandomUnitVector() * FMath::FRandRange(0.f, SphereRadius);
|
||||||
|
const FVector EndLoc = SphereCenter + RandVec;
|
||||||
|
FVector ToEndLoc = EndLoc - TraceStart;
|
||||||
|
ToEndLoc = FVector(TraceStart + ToEndLoc * TRACE_LENGTH / ToEndLoc.Size())
|
||||||
|
|
||||||
|
HitTargets.Add(ToEndLoc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@ class BLASTER_API AShotgun : public AHitScanWeapon
|
||||||
public:
|
public:
|
||||||
|
|
||||||
virtual void Fire(const FVector& HitTarget) override;
|
virtual void Fire(const FVector& HitTarget) override;
|
||||||
|
void ShotgunTraceEndWithScatter(const FVector& HitTarget, TArray<FVector>& HitTargets);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
|
|
@ -299,14 +299,14 @@ FVector AWeapon::TraceEndWithScatter(const FVector& HitTarget)
|
||||||
const USkeletalMeshSocket* MuzzleFlashSocket = GetWeaponMesh()->GetSocketByName("MuzzleFlash");
|
const USkeletalMeshSocket* MuzzleFlashSocket = GetWeaponMesh()->GetSocketByName("MuzzleFlash");
|
||||||
if (MuzzleFlashSocket == nullptr) return FVector();
|
if (MuzzleFlashSocket == nullptr) return FVector();
|
||||||
|
|
||||||
FTransform SocketTransform = MuzzleFlashSocket->GetSocketTransform(GetWeaponMesh());
|
const FTransform SocketTransform = MuzzleFlashSocket->GetSocketTransform(GetWeaponMesh());
|
||||||
FVector TraceStart = SocketTransform.GetLocation();
|
const FVector TraceStart = SocketTransform.GetLocation();
|
||||||
|
|
||||||
FVector ToTargetNormalized = (HitTarget - TraceStart).GetSafeNormal();
|
const FVector ToTargetNormalized = (HitTarget - TraceStart).GetSafeNormal();
|
||||||
FVector SphereCenter = TraceStart + ToTargetNormalized * DistanceToSphere;
|
const FVector SphereCenter = TraceStart + ToTargetNormalized * DistanceToSphere;
|
||||||
FVector RandVec = UKismetMathLibrary::RandomUnitVector() * FMath::FRandRange(0.f, SphereRadius);
|
const FVector RandVec = UKismetMathLibrary::RandomUnitVector() * FMath::FRandRange(0.f, SphereRadius);
|
||||||
FVector EndLoc = SphereCenter + RandVec;
|
const FVector EndLoc = SphereCenter + RandVec;
|
||||||
FVector ToEndLoc = EndLoc - TraceStart;
|
const FVector ToEndLoc = EndLoc - TraceStart;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
DrawDebugSphere(GetWorld(), SphereCenter, SphereRadius, 12, FColor::Red, true);
|
DrawDebugSphere(GetWorld(), SphereCenter, SphereRadius, 12, FColor::Red, true);
|
||||||
|
|
|
@ -116,6 +116,14 @@ protected:
|
||||||
int32 OtherBodyIndex
|
int32 OtherBodyIndex
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Trace end with scatter
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, Category = "Weapon Scatter")
|
||||||
|
float DistanceToSphere = 800.f;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, Category = "Weapon Scatter")
|
||||||
|
float SphereRadius = 75.f;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
UPROPERTY(VisibleAnywhere, Category = "Weapon Properties")
|
UPROPERTY(VisibleAnywhere, Category = "Weapon Properties")
|
||||||
USkeletalMeshComponent* WeaponMesh;
|
USkeletalMeshComponent* WeaponMesh;
|
||||||
|
@ -158,14 +166,6 @@ private:
|
||||||
UPROPERTY(EditAnywhere)
|
UPROPERTY(EditAnywhere)
|
||||||
EWeaponType WeaponType;
|
EWeaponType WeaponType;
|
||||||
|
|
||||||
// Trace end with scatter
|
|
||||||
|
|
||||||
UPROPERTY(EditAnywhere, Category = "Weapon Scatter")
|
|
||||||
float DistanceToSphere = 800.f;
|
|
||||||
|
|
||||||
UPROPERTY(EditAnywhere, Category = "Weapon Scatter")
|
|
||||||
float SphereRadius = 75.f;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void SetWeaponState(EWeaponState State);
|
void SetWeaponState(EWeaponState State);
|
||||||
FORCEINLINE USphereComponent* GetAreaSphere() const { return AreaSphere; }
|
FORCEINLINE USphereComponent* GetAreaSphere() const { return AreaSphere; }
|
||||||
|
|
Loading…
Reference in New Issue