// Fill out your copyright notice in the Description page of Project Settings. #include "Enemy.h" #include "Kismet/GameplayStatics.h" #include "Sound/SoundCue.h" #include "Particles/ParticleSystemComponent.h" // Sets default values 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. PrimaryActorTick.bCanEverTick = true; } // Called when the game starts or when spawned void AEnemy::BeginPlay() { Super::BeginPlay(); 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 void AEnemy::Tick(float DeltaTime) { Super::Tick(DeltaTime); } // Called to bind functionality to input void AEnemy::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) { Super::SetupPlayerInputComponent(PlayerInputComponent); } void AEnemy::BulletHit_Implementation(FHitResult HitResult) { if (ImpactSound) { UGameplayStatics::PlaySoundAtLocation(this, ImpactSound, GetActorLocation()); } if (ImpactParticles) { 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; }