72 - Spawning the Projectile

This commit is contained in:
Kingsmedia 2022-05-05 12:51:14 +02:00
parent 53a50536f1
commit e56044608a
8 changed files with 47 additions and 4 deletions

View File

@ -106,9 +106,11 @@ void UCombatComponent::TraceUnderCrosshairs(FHitResult& TraceHitResult)
if (!TraceHitResult.bBlockingHit) if (!TraceHitResult.bBlockingHit)
{ {
TraceHitResult.ImpactPoint = End; TraceHitResult.ImpactPoint = End;
HitTarget = End;
} }
else else
{ {
HitTarget = TraceHitResult.ImpactPoint;
DrawDebugSphere( DrawDebugSphere(
GetWorld(), GetWorld(),
TraceHitResult.ImpactPoint, TraceHitResult.ImpactPoint,
@ -131,7 +133,7 @@ void UCombatComponent::MulticastFire_Implementation()
if (Character) if (Character)
{ {
Character->PlayFireMontage(bAiming); Character->PlayFireMontage(bAiming);
EquippedWeapon->Fire(); EquippedWeapon->Fire(HitTarget);
} }
} }

View File

@ -58,4 +58,6 @@ private:
float AimWalkSpeed; float AimWalkSpeed;
bool bFireButtonPressed; bool bFireButtonPressed;
FVector HitTarget;
}; };

View File

@ -3,3 +3,38 @@
#include "ProjectileWeapon.h" #include "ProjectileWeapon.h"
#include "Projectile.h"
#include "Engine/SkeletalMeshSocket.h"
void AProjectileWeapon::Fire(const FVector& HitTarget)
{
Super::Fire(HitTarget);
APawn* InstigatorPawn = Cast<APawn>(GetOwner());
const USkeletalMeshSocket* MuzzleFlashSocket = GetWeaponMesh()->GetSocketByName(FName("MuzzleFlash"));
if (MuzzleFlashSocket)
{
FTransform SocketTransform = MuzzleFlashSocket->GetSocketTransform(GetWeaponMesh());
// From muzzle flash socket to hit location from TraceUnderCrosshairs
FVector ToTarget = HitTarget - SocketTransform.GetLocation();
FRotator TargetRotation = ToTarget.Rotation();
if (ProjectileClass && InstigatorPawn)
{
FActorSpawnParameters SpawnParams;
SpawnParams.Owner = GetOwner();
SpawnParams.Instigator = InstigatorPawn;
UWorld* World = GetWorld();
if (World)
{
World->SpawnActor<AProjectile>(
ProjectileClass,
SocketTransform.GetLocation(),
TargetRotation,
SpawnParams
);
}
}
}
}

View File

@ -13,7 +13,11 @@ UCLASS()
class BLASTER_API AProjectileWeapon : public AWeapon class BLASTER_API AProjectileWeapon : public AWeapon
{ {
GENERATED_BODY() GENERATED_BODY()
virtual void Fire(const FVector& HitTarget) override;
private:
UPROPERTY(EditAnywhere)
TSubclassOf<class AProjectile> ProjectileClass;
}; };

View File

@ -109,7 +109,7 @@ void AWeapon::ShowPickupWidget(bool bShowWidget)
} }
} }
void AWeapon::Fire() void AWeapon::Fire(const FVector& HitTarget)
{ {
if (FireAnimation) if (FireAnimation)
{ {

View File

@ -25,7 +25,7 @@ public:
AWeapon(); AWeapon();
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override; virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
void ShowPickupWidget(bool bShowWidget); void ShowPickupWidget(bool bShowWidget);
void Fire(); virtual void Fire(const FVector& HitTarget);
protected: protected:
virtual void BeginPlay() override; virtual void BeginPlay() override;