Section 13: The Enemy Class - Lecture 258
Hide Health Bar
This commit is contained in:
parent
1de94528c8
commit
09827265de
BIN
Content/_Game/DataTable/WeaponDataTable.uasset (Stored with Git LFS)
BIN
Content/_Game/DataTable/WeaponDataTable.uasset (Stored with Git LFS)
Binary file not shown.
BIN
Content/_Game/Enemies/EnemyBP.uasset (Stored with Git LFS)
BIN
Content/_Game/Enemies/EnemyBP.uasset (Stored with Git LFS)
Binary file not shown.
Binary file not shown.
BIN
Content/_Game/Maps/DefaultMap.umap (Stored with Git LFS)
BIN
Content/_Game/Maps/DefaultMap.umap (Stored with Git LFS)
Binary file not shown.
|
@ -7,7 +7,10 @@
|
||||||
#include "Particles/ParticleSystemComponent.h"
|
#include "Particles/ParticleSystemComponent.h"
|
||||||
|
|
||||||
// Sets default values
|
// Sets default values
|
||||||
AEnemy::AEnemy()
|
AEnemy::AEnemy() :
|
||||||
|
Health(100.f),
|
||||||
|
MaxHealth(100.f),
|
||||||
|
HealthBarDisplayTime(4.f)
|
||||||
{
|
{
|
||||||
// Set this character to call Tick() every frame. You can turn this off to improve performance if you don't need it.
|
// Set this character to call Tick() every frame. You can turn this off to improve performance if you don't need it.
|
||||||
PrimaryActorTick.bCanEverTick = true;
|
PrimaryActorTick.bCanEverTick = true;
|
||||||
|
@ -22,6 +25,12 @@ void AEnemy::BeginPlay()
|
||||||
GetMesh()->SetCollisionResponseToChannel(ECollisionChannel::ECC_Visibility, ECollisionResponse::ECR_Block);
|
GetMesh()->SetCollisionResponseToChannel(ECollisionChannel::ECC_Visibility, ECollisionResponse::ECR_Block);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AEnemy::ShowHealthBar_Implementation()
|
||||||
|
{
|
||||||
|
GetWorldTimerManager().ClearTimer(HealthBarTimer);
|
||||||
|
GetWorldTimerManager().SetTimer(HealthBarTimer, this, &AEnemy::HideHealthBar, HealthBarDisplayTime);
|
||||||
|
}
|
||||||
|
|
||||||
// Called every frame
|
// Called every frame
|
||||||
void AEnemy::Tick(float DeltaTime)
|
void AEnemy::Tick(float DeltaTime)
|
||||||
{
|
{
|
||||||
|
@ -47,5 +56,23 @@ void AEnemy::BulletHit_Implementation(FHitResult HitResult)
|
||||||
{
|
{
|
||||||
UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), ImpactParticles, HitResult.Location, FRotator(0.f), true);
|
UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), ImpactParticles, HitResult.Location, FRotator(0.f), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ShowHealthBar();
|
||||||
|
}
|
||||||
|
|
||||||
|
float AEnemy::TakeDamage(float DamageAmount, FDamageEvent const& DamageEvent, AController* EventInstigator,
|
||||||
|
AActor* DamageCauser)
|
||||||
|
{
|
||||||
|
float DamageInflicted = DamageAmount;
|
||||||
|
if (Health - DamageAmount <= 0.f)
|
||||||
|
{
|
||||||
|
DamageInflicted = Health;
|
||||||
|
Health = 0.f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Health -= DamageAmount;
|
||||||
|
}
|
||||||
|
return DamageInflicted;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,14 @@ protected:
|
||||||
// Called when the game starts or when spawned
|
// Called when the game starts or when spawned
|
||||||
virtual void BeginPlay() override;
|
virtual void BeginPlay() override;
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintNativeEvent)
|
||||||
|
void ShowHealthBar();
|
||||||
|
void ShowHealthBar_Implementation();
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintImplementableEvent)
|
||||||
|
void HideHealthBar();
|
||||||
|
|
||||||
|
private:
|
||||||
/** Particles to spawn when hit by bullets */
|
/** Particles to spawn when hit by bullets */
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Combat, meta = (AllowPrivateAccess = true))
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Combat, meta = (AllowPrivateAccess = true))
|
||||||
UParticleSystem* ImpactParticles;
|
UParticleSystem* ImpactParticles;
|
||||||
|
@ -30,6 +38,23 @@ protected:
|
||||||
/** Sound to play when hit by bullets */
|
/** Sound to play when hit by bullets */
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Combat, meta = (AllowPrivateAccess = true))
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Combat, meta = (AllowPrivateAccess = true))
|
||||||
USoundCue* ImpactSound;
|
USoundCue* ImpactSound;
|
||||||
|
|
||||||
|
/** Current health */
|
||||||
|
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Combat, meta = (AllowPrivateAccess = true))
|
||||||
|
float Health;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Combat, meta = (AllowPrivateAccess = true))
|
||||||
|
float MaxHealth;
|
||||||
|
|
||||||
|
/** Name of the head bone */
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Combat, meta = (AllowPrivateAccess = true))
|
||||||
|
FString HeadBone;
|
||||||
|
|
||||||
|
/** Time to display health bar once shot */
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Combat, meta = (AllowPrivateAccess = true))
|
||||||
|
float HealthBarDisplayTime;
|
||||||
|
|
||||||
|
FTimerHandle HealthBarTimer;
|
||||||
public:
|
public:
|
||||||
// Called every frame
|
// Called every frame
|
||||||
virtual void Tick(float DeltaTime) override;
|
virtual void Tick(float DeltaTime) override;
|
||||||
|
@ -38,4 +63,8 @@ public:
|
||||||
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
|
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
|
||||||
|
|
||||||
virtual void BulletHit_Implementation(FHitResult HitResult) override;
|
virtual void BulletHit_Implementation(FHitResult HitResult) override;
|
||||||
|
|
||||||
|
virtual float TakeDamage(float DamageAmount, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser) override;
|
||||||
|
|
||||||
|
FORCEINLINE FString GetHeadBone() const { return HeadBone; }
|
||||||
};
|
};
|
||||||
|
|
|
@ -6,8 +6,6 @@
|
||||||
|
|
||||||
#include "Item.h"
|
#include "Item.h"
|
||||||
#include "Camera/CameraComponent.h"
|
#include "Camera/CameraComponent.h"
|
||||||
#include "Components/SphereComponent.h"
|
|
||||||
#include "Components/BoxComponent.h"
|
|
||||||
#include "Components/CapsuleComponent.h"
|
#include "Components/CapsuleComponent.h"
|
||||||
#include "Components/WidgetComponent.h"
|
#include "Components/WidgetComponent.h"
|
||||||
#include "Engine/SkeletalMeshSocket.h"
|
#include "Engine/SkeletalMeshSocket.h"
|
||||||
|
@ -18,8 +16,8 @@
|
||||||
#include "Sound/SoundCue.h"
|
#include "Sound/SoundCue.h"
|
||||||
#include "Ammo.h"
|
#include "Ammo.h"
|
||||||
#include "BulletHitInterface.h"
|
#include "BulletHitInterface.h"
|
||||||
|
#include "Enemy.h"
|
||||||
#include "PhysicalMaterials/PhysicalMaterial.h"
|
#include "PhysicalMaterials/PhysicalMaterial.h"
|
||||||
#include "Shooter.h"
|
|
||||||
|
|
||||||
// Sets default values
|
// Sets default values
|
||||||
AShooterCharacter::AShooterCharacter() :
|
AShooterCharacter::AShooterCharacter() :
|
||||||
|
@ -662,22 +660,46 @@ void AShooterCharacter::SendBullet()
|
||||||
// Spawn impact particles after updating BeamEndPoint
|
// Spawn impact particles after updating BeamEndPoint
|
||||||
|
|
||||||
// Does hit actor implement BulletHitInterface?
|
// Does hit actor implement BulletHitInterface?
|
||||||
IBulletHitInterface* BulletHitInterface = nullptr;
|
bool spawnGenericImpactParticles = false;
|
||||||
if (IsValid(BeamHitResult.GetActor()) &&
|
if (IsValid(BeamHitResult.GetActor()))
|
||||||
(BulletHitInterface = Cast<IBulletHitInterface>(BeamHitResult.GetActor())) != nullptr)
|
{
|
||||||
|
if (IBulletHitInterface* BulletHitInterface = Cast<IBulletHitInterface>(BeamHitResult.GetActor()))
|
||||||
{
|
{
|
||||||
BulletHitInterface->BulletHit_Implementation(BeamHitResult);
|
BulletHitInterface->BulletHit_Implementation(BeamHitResult);
|
||||||
UE_LOG(LogTemp, Warning, TEXT("actor particle"));
|
|
||||||
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("actor particle"));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (ImpactParticles)
|
spawnGenericImpactParticles = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (AEnemy* HitEnemy = Cast<AEnemy>(BeamHitResult.GetActor()))
|
||||||
|
{
|
||||||
|
float damageToApply;
|
||||||
|
if (BeamHitResult.BoneName.ToString() == HitEnemy->GetHeadBone())
|
||||||
|
{
|
||||||
|
damageToApply = EquippedWeapon->GetHeadshotDamage();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
damageToApply = EquippedWeapon->GetDamage();
|
||||||
|
}
|
||||||
|
|
||||||
|
UGameplayStatics::ApplyDamage(HitEnemy,
|
||||||
|
damageToApply,
|
||||||
|
GetController(), this,
|
||||||
|
UDamageType::StaticClass());
|
||||||
|
UE_LOG(LogTemp, Warning, TEXT("Hit Component: %s"), *BeamHitResult.BoneName.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
spawnGenericImpactParticles = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ImpactParticles && spawnGenericImpactParticles)
|
||||||
{
|
{
|
||||||
UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), ImpactParticles,
|
UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), ImpactParticles,
|
||||||
BeamHitResult.Location);
|
BeamHitResult.Location);
|
||||||
UE_LOG(LogTemp, Warning, TEXT("normal particle"));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Spawn smoke trail particles
|
// Spawn smoke trail particles
|
||||||
|
|
|
@ -156,6 +156,8 @@ void AWeapon::OnConstruction(const FTransform& Transform)
|
||||||
}
|
}
|
||||||
|
|
||||||
bAutomatic = WeaponDataRow->bAutomatic;
|
bAutomatic = WeaponDataRow->bAutomatic;
|
||||||
|
Damage = WeaponDataRow->Damage;
|
||||||
|
HeadshotDamage = WeaponDataRow->HeadshotDamage;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GetMaterialInstance())
|
if (GetMaterialInstance())
|
||||||
|
|
|
@ -90,6 +90,12 @@ struct FWeaponDataTable : public FTableRowBase
|
||||||
|
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
bool bAutomatic;
|
bool bAutomatic;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
float Damage;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
float HeadshotDamage;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -221,6 +227,12 @@ private:
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Weapon Properties", meta = (AllowPrivateAccess = "true"))
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Weapon Properties", meta = (AllowPrivateAccess = "true"))
|
||||||
bool bAutomatic;
|
bool bAutomatic;
|
||||||
|
|
||||||
|
/** Amount of damage caused by bullet */
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Weapon Properties", meta = (AllowPrivateAccess = "true"))
|
||||||
|
float Damage;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Weapon Properties", meta = (AllowPrivateAccess = "true"))
|
||||||
|
float HeadshotDamage;
|
||||||
public:
|
public:
|
||||||
/** Adds an impulse to the weapon */
|
/** Adds an impulse to the weapon */
|
||||||
void ThrowWeapon();
|
void ThrowWeapon();
|
||||||
|
@ -239,6 +251,8 @@ public:
|
||||||
FORCEINLINE UParticleSystem* GetMuzzleFlash() const { return MuzzleFlash; }
|
FORCEINLINE UParticleSystem* GetMuzzleFlash() const { return MuzzleFlash; }
|
||||||
FORCEINLINE USoundCue* GetFireSound() const { return FireSound; }
|
FORCEINLINE USoundCue* GetFireSound() const { return FireSound; }
|
||||||
FORCEINLINE bool GetAutomatic() const { return bAutomatic; }
|
FORCEINLINE bool GetAutomatic() const { return bAutomatic; }
|
||||||
|
FORCEINLINE float GetDamage() const { return Damage; }
|
||||||
|
FORCEINLINE float GetHeadshotDamage() const { return HeadshotDamage; }
|
||||||
|
|
||||||
void StartSlideTimer();
|
void StartSlideTimer();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue