From e30e644b58398b9dfc54ab9aaf8b11692f67c909 Mon Sep 17 00:00:00 2001 From: baz Date: Fri, 8 Mar 2024 02:33:40 +0000 Subject: [PATCH] Add Healthbar to EnemyCharacter --- Source/Nakatomi/EnemyCharacter.cpp | 13 +++++++ Source/Nakatomi/EnemyCharacter.h | 4 +++ .../Nakatomi/UI/EnemyHealthbarUserWidget.cpp | 26 ++++++++++++++ Source/Nakatomi/UI/EnemyHealthbarUserWidget.h | 34 +++++++++++++++++++ 4 files changed, 77 insertions(+) create mode 100644 Source/Nakatomi/UI/EnemyHealthbarUserWidget.cpp create mode 100644 Source/Nakatomi/UI/EnemyHealthbarUserWidget.h diff --git a/Source/Nakatomi/EnemyCharacter.cpp b/Source/Nakatomi/EnemyCharacter.cpp index 62cc18d..3bef9c6 100644 --- a/Source/Nakatomi/EnemyCharacter.cpp +++ b/Source/Nakatomi/EnemyCharacter.cpp @@ -8,6 +8,7 @@ #include "BehaviorTree/BehaviorTree.h" #include "BehaviorTree/BlackboardComponent.h" #include "BehaviorTree/BlackboardData.h" +#include "UI/EnemyHealthbarUserWidget.h" #define COLLISION_WEAPON ECC_GameTraceChannel1 @@ -20,6 +21,12 @@ AEnemyCharacter::AEnemyCharacter(const FObjectInitializer& ObjectInitializer) : GetHealthComponent()->OnDamaged.BindUFunction(this, "OnDamaged"); GetHealthComponent()->OnDeath.BindUFunction(this, "OnDeath"); GetHealthComponent()->SetMaxHealth(100.0f); + + HealthbarWidgetComponent = CreateDefaultSubobject(TEXT("Healthbar")); + HealthbarWidgetComponent->SetupAttachment(RootComponent); + HealthbarWidgetComponent->SetRelativeLocation(FVector(0,0,90)); + HealthbarWidgetComponent->SetTwoSided(true); + HealthbarWidgetComponent->SetBackgroundColor(FLinearColor(1,1,1,0)); this->Tags.Add(FName("Enemy")); } @@ -63,6 +70,12 @@ void AEnemyCharacter::BeginPlay() AEnemyAIController* controller = Cast(GetController()); controller->GetBlackboardComponent()->SetValueAsFloat("CurrentHealth", GetHealthComponent()->GetCurrentHealth()); GetHealthComponent()->OnDamaged.BindUFunction(this, "OnDamaged"); + + if (HealthbarWidgetComponent->GetWidget()) + { + UEnemyHealthbarUserWidget* healthbar = Cast(HealthbarWidgetComponent->GetWidget()); + healthbar->BindOwner(this); + } } void AEnemyCharacter::PlayOnFireAnimations() diff --git a/Source/Nakatomi/EnemyCharacter.h b/Source/Nakatomi/EnemyCharacter.h index c86f489..8b7bd08 100644 --- a/Source/Nakatomi/EnemyCharacter.h +++ b/Source/Nakatomi/EnemyCharacter.h @@ -7,6 +7,7 @@ #include "PatrolRoute.h" #include "BehaviorTree/BehaviorTreeComponent.h" #include "RandomWeaponParameters.h" +#include "Components/WidgetComponent.h" #include "EnemyCharacter.generated.h" @@ -27,6 +28,9 @@ public: UPROPERTY(EditAnywhere) float DefendRadius = 500.0f; + + UPROPERTY(EditAnywhere) + UWidgetComponent* HealthbarWidgetComponent; private: UPROPERTY(EditDefaultsOnly, Meta = (AllowPrivateAccess = "true")) diff --git a/Source/Nakatomi/UI/EnemyHealthbarUserWidget.cpp b/Source/Nakatomi/UI/EnemyHealthbarUserWidget.cpp new file mode 100644 index 0000000..135f169 --- /dev/null +++ b/Source/Nakatomi/UI/EnemyHealthbarUserWidget.cpp @@ -0,0 +1,26 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "../UI/EnemyHealthbarUserWidget.h" + +#include "Nakatomi/EnemyCharacter.h" + +void UEnemyHealthbarUserWidget::BindOwner(AEnemyCharacter* NewOwner) +{ + Owner = NewOwner; + + if (Owner) + { + auto healthComponent = Owner->GetHealthComponent(); + healthComponent->OnDamaged.BindUFunction(this, "UpdateHealthbar"); + } +} + +void UEnemyHealthbarUserWidget::UpdateHealthbar() +{ + if (Owner) + { + float percent = Owner->GetHealthComponent()->GetCurrentHealth() / Owner->GetHealthComponent()->GetMaxHealth(); + Healthbar->SetPercent(percent); + } +} diff --git a/Source/Nakatomi/UI/EnemyHealthbarUserWidget.h b/Source/Nakatomi/UI/EnemyHealthbarUserWidget.h new file mode 100644 index 0000000..d48f0e9 --- /dev/null +++ b/Source/Nakatomi/UI/EnemyHealthbarUserWidget.h @@ -0,0 +1,34 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "Blueprint/UserWidget.h" +#include "Components/ProgressBar.h" +#include "Nakatomi/EnemyCharacter.h" +#include "EnemyHealthbarUserWidget.generated.h" + +/** + * + */ +UCLASS() +class NAKATOMI_API UEnemyHealthbarUserWidget : public UUserWidget +{ + GENERATED_BODY() + +public: + + UPROPERTY(BlueprintReadWrite, meta = (BindWidget)) + UProgressBar* Healthbar; + + AEnemyCharacter* Owner; + +public: + + void BindOwner(AEnemyCharacter* NewOwner); + +private: + + UFUNCTION() + void UpdateHealthbar(); +};