add values to the UI Widgets for Health and Mana Attributes

This commit is contained in:
Caleb Buhungiro
2025-06-27 14:33:53 +08:00
parent 3087d07dfc
commit c47347e635
10 changed files with 128 additions and 10 deletions

View File

@@ -3,7 +3,9 @@
#include "Crunch/Public/Player/CPlayerController.h"
#include "Blueprint/UserWidget.h"
#include "Character/CPlayerCharacter.h"
#include "Widgets/GameplayWidget.h"
void ACPlayerController::OnPossess(APawn* InPawn)
{
@@ -20,5 +22,13 @@ void ACPlayerController::AcknowledgePossession(APawn* P)
if (CPlayerCharacter = Cast<ACPlayerCharacter>(P); IsValid(CPlayerCharacter))
{
CPlayerCharacter->ClientSideInit();
SpawnGameplayWidget();
}
}
void ACPlayerController::SpawnGameplayWidget()
{
if (!IsLocalPlayerController()) return;
GameplayWidget = CreateWidget<UGameplayWidget>(this, GameplayWidgetClass);
if (GameplayWidget) GameplayWidget->AddToViewport();
}

View File

@@ -0,0 +1,27 @@
// Multiplayer By Caleb
#include "Widgets/GameplayWidget.h"
#include "AbilitySystemBlueprintLibrary.h"
#include "GAS/CAttributeSet.h"
#include "Widgets/ValueGauge.h"
void UGameplayWidget::NativeConstruct()
{
Super::NativeConstruct();
OwnerAbilitySystemComponent = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(GetOwningPlayerPawn());
if (OwnerAbilitySystemComponent)
{
HealthBar->SetAndBoundToGameplayAttribute(
OwnerAbilitySystemComponent,
UCAttributeSet::GetHealthAttribute(),
UCAttributeSet::GetMaxHealthAttribute()
);
ManaBar->SetAndBoundToGameplayAttribute(
OwnerAbilitySystemComponent,
UCAttributeSet::GetManaAttribute(),
UCAttributeSet::GetMaxManaAttribute()
);
}
}

View File

@@ -3,6 +3,7 @@
#include "Widgets/ValueGauge.h"
#include "AbilitySystemComponent.h"
#include "Components/ProgressBar.h"
#include "Components/TextBlock.h"
@@ -12,8 +13,27 @@ void UValueGauge::NativePreConstruct()
ProgressBar->SetFillColorAndOpacity(BarColor);
}
void UValueGauge::SetAndBoundToGameplayAttribute(UAbilitySystemComponent* AbilitySystemComponent,
const FGameplayAttribute& Attribute,
const FGameplayAttribute& MaxAttribute)
{
if (AbilitySystemComponent)
{
bool bFound{false};
const float Value{AbilitySystemComponent->GetGameplayAttributeValue(Attribute, bFound)};
const float MaxValue{AbilitySystemComponent->GetGameplayAttributeValue(MaxAttribute, bFound)};
if (bFound) SetValue(Value, MaxValue);
AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(Attribute).AddUObject(
this, &ThisClass::ValueChanged);
AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(MaxAttribute).AddUObject(
this, &ThisClass::MaxValueChanged);
}
}
void UValueGauge::SetValue(float NewValue, float NewMaxValue)
{
CachedValue = NewValue;
CachedMaxValue = NewMaxValue;
if (NewMaxValue == 0)
{
UE_LOG(LogTemp, Warning, TEXT("Value Gauge: %s, NewMaxValue can't be 0"), *GetName());
@@ -29,3 +49,13 @@ void UValueGauge::SetValue(float NewValue, float NewMaxValue)
FText::AsNumber(NewMaxValue, &FormatOps)
));
}
void UValueGauge::ValueChanged(const FOnAttributeChangeData& ChangedData)
{
SetValue(ChangedData.NewValue, CachedMaxValue);
}
void UValueGauge::MaxValueChanged(const FOnAttributeChangeData& ChangedData)
{
SetValue(CachedValue, ChangedData.NewValue);
}

View File

@@ -39,23 +39,24 @@ class CRUNCH_API UCAttributeSet : public UAttributeSet
public:
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
ATTRIBUTE_ACCESSORS(UCAttributeSet, Health);
ATTRIBUTE_ACCESSORS(UCAttributeSet, MaxHealth);
ATTRIBUTE_ACCESSORS(UCAttributeSet, Mana);
ATTRIBUTE_ACCESSORS(UCAttributeSet, MaxMana);
private:
UPROPERTY(ReplicatedUsing=OnRep_Health)
FGameplayAttributeData Health;
ATTRIBUTE_ACCESSORS(UCAttributeSet, Health);
UPROPERTY(ReplicatedUsing=OnRep_MaxHealth)
FGameplayAttributeData MaxHealth;
ATTRIBUTE_ACCESSORS(UCAttributeSet, MaxHealth);
UPROPERTY(ReplicatedUsing=OnRep_Mana)
FGameplayAttributeData Mana;
ATTRIBUTE_ACCESSORS(UCAttributeSet, Mana);
UPROPERTY(ReplicatedUsing=OnRep_MaxMana)
FGameplayAttributeData MaxMana;
ATTRIBUTE_ACCESSORS(UCAttributeSet, MaxMana);
UFUNCTION()
void OnRep_Health(const FGameplayAttributeData& OldValue);

View File

@@ -6,6 +6,7 @@
#include "GameFramework/PlayerController.h"
#include "CPlayerController.generated.h"
class UGameplayWidget;
class ACPlayerCharacter;
UCLASS()
@@ -18,6 +19,12 @@ public:
virtual void AcknowledgePossession(APawn* P) override;
private:
void SpawnGameplayWidget();
UPROPERTY()
TObjectPtr<ACPlayerCharacter> CPlayerCharacter;
UPROPERTY(EditDefaultsOnly, Category= "UI")
TSubclassOf<UGameplayWidget> GameplayWidgetClass;
UPROPERTY()
TObjectPtr<UGameplayWidget> GameplayWidget;
};

View File

@@ -0,0 +1,29 @@
// Multiplayer By Caleb
#pragma once
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "GameplayWidget.generated.h"
class UAbilitySystemComponent;
class UValueGauge;
/**
*
*/
UCLASS()
class CRUNCH_API UGameplayWidget : public UUserWidget
{
GENERATED_BODY()
public:
virtual void NativeConstruct() override;
private:
UPROPERTY(meta=(BindWidget))
TObjectPtr<UValueGauge> HealthBar;
UPROPERTY(meta=(BindWidget))
TObjectPtr<UValueGauge> ManaBar;
UPROPERTY()
TObjectPtr<UAbilitySystemComponent> OwnerAbilitySystemComponent;
};

View File

@@ -6,6 +6,9 @@
#include "Blueprint/UserWidget.h"
#include "ValueGauge.generated.h"
class UAbilitySystemComponent;
struct FOnAttributeChangeData;
struct FGameplayAttribute;
class UTextBlock;
class UProgressBar;
/**
@@ -17,14 +20,22 @@ class CRUNCH_API UValueGauge : public UUserWidget
GENERATED_BODY()
public:
virtual void NativePreConstruct() override;
void SetAndBoundToGameplayAttribute(UAbilitySystemComponent* AbilitySystemComponent, const FGameplayAttribute& Attribute, const FGameplayAttribute& MaxAttribute);
void SetValue(float NewValue, float NewMaxValue);
private:
void ValueChanged(const FOnAttributeChangeData& ChangedData);
void MaxValueChanged(const FOnAttributeChangeData& ChangedData);
float CachedValue;
float CachedMaxValue;
UPROPERTY(EditAnywhere, Category="Visual")
FLinearColor BarColor;
UPROPERTY(EditAnywhere, meta=(BindWidget))
UPROPERTY(VisibleAnywhere, meta=(BindWidget))
TObjectPtr<UProgressBar> ProgressBar;
UPROPERTY(EditAnywhere, meta=(BindWidget))
UPROPERTY(VisibleAnywhere, meta=(BindWidget))
TObjectPtr<UTextBlock> ValueText;