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)
{
TraceHitResult.ImpactPoint = End;
HitTarget = End;
}
else
{
HitTarget = TraceHitResult.ImpactPoint;
DrawDebugSphere(
GetWorld(),
TraceHitResult.ImpactPoint,
@ -131,7 +133,7 @@ void UCombatComponent::MulticastFire_Implementation()
if (Character)
{
Character->PlayFireMontage(bAiming);
EquippedWeapon->Fire();
EquippedWeapon->Fire(HitTarget);
}
}

View File

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

View File

@ -3,3 +3,38 @@
#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
{
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)
{

View File

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