34. Listening for Attribute Changes
This commit is contained in:
		| @@ -8,9 +8,9 @@ | ||||
|  | ||||
| UGasaAttributeSet::UGasaAttributeSet() | ||||
| { | ||||
| 	InitHealth( 80.f ); | ||||
| 	InitHealth( 50.f ); | ||||
| 	InitMaxHealth( 100.f ); | ||||
| 	InitMana( 20.f ); | ||||
| 	InitMana( 25.f ); | ||||
| 	InitMaxMana( 50.f ); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -14,6 +14,7 @@ | ||||
|  | ||||
| #pragma region Engine Forwards | ||||
| struct FInputActionValue; | ||||
| struct FOnAttributeChangeData; | ||||
|  | ||||
| class IAbilitySystemInterface; | ||||
|  | ||||
| @@ -34,6 +35,8 @@ class UCogWindowManager; | ||||
| // Gasa | ||||
|  | ||||
| #pragma region Forwards | ||||
| struct FWidgetControllerData; | ||||
|  | ||||
| class ACameraMount; | ||||
| class AGasaCharacter; | ||||
| class AGasaGameInstance; | ||||
| @@ -52,8 +55,6 @@ class UGasaSizeBox; | ||||
| class UHostWidgetController; | ||||
| class UHUDHostWidget; | ||||
| class UWidgetController; | ||||
|  | ||||
| struct FWidgetControllerData; | ||||
| #pragma endregion Forwards | ||||
|  | ||||
| #pragma region Logging | ||||
|   | ||||
| @@ -12,13 +12,18 @@ void FGasaDevOptionsCache::CachedDevOptions() | ||||
| 	UGasaDevOptions* DevOpts = GetMutDevOptions(); | ||||
|  | ||||
| 	Template_PlayerCamera = DevOpts->Template_PlayerCamera.LoadSynchronous(); | ||||
| 	ensureMsgf( Template_PlayerCamera != nullptr, TEXT( "Template_PlayerCamera is null, DO NOT RUN PIE or else you may get a crash if not handled in BP or C++" ) ); | ||||
| 	ensureMsgf( | ||||
| 	    Template_PlayerCamera != nullptr, TEXT( "Template_PlayerCamera is null, DO NOT RUN PIE or else you may get a crash if not handled in BP or C++" ) | ||||
| 	); | ||||
|  | ||||
| 	Template_HUD_HostUI = DevOpts->Template_HUD_HostUI.LoadSynchronous(); | ||||
| 	ensureMsgf( Template_HUD_HostUI != nullptr, TEXT( "Template_HUD_HostUI is null, DO NOT RUN PIE or else you may get a crash if not handled in BP or C++" ) ); | ||||
|  | ||||
| 	Template_HostWidgetController = DevOpts->Template_HostWidgetController.LoadSynchronous(); | ||||
| 	ensureMsgf( Template_HostWidgetController != nullptr, TEXT( "Template_HostWidgetController is null, DO NOT RUN PIE or else you may get a crash if not handled in BP or C++" ) ); | ||||
| 	ensureMsgf( | ||||
| 	    Template_HostWidgetController != nullptr, | ||||
| 	    TEXT( "Template_HostWidgetController is null, DO NOT RUN PIE or else you may get a crash if not handled in BP or C++" ) | ||||
| 	); | ||||
|  | ||||
| 	Tag_GlobalPPV = DevOpts->Tag_GlobalPPV; | ||||
| } | ||||
|   | ||||
| @@ -14,6 +14,7 @@ void AGasaHUD::InitHostWidget(FWidgetControllerData const* WidgetControllerData) | ||||
| 	HostWidgetController = NewObject<UHostWidgetController>(this, GetDevOptions()->Template_HostWidgetController.Get()); | ||||
| 	HostWidgetController->Data = (* WidgetControllerData); | ||||
| 	HostWidget->SetWidgetController(HostWidgetController); | ||||
| 	HostWidgetController->BindCallbacksToDependencies(); | ||||
| 	 | ||||
| 	HostWidgetController->BroadcastInitialValues(); | ||||
| 	HostWidget->AddToViewport(); | ||||
|   | ||||
| @@ -1,8 +1,34 @@ | ||||
| #include "HostWidgetController.h" | ||||
| #include "AbilitySystem/GasaAbilitySystemComponent_Inlines.h" | ||||
| #include "AbilitySystem/GasaAttributeSet.h" | ||||
| #include "GameplayEffectTypes.h" | ||||
|  | ||||
| #pragma region Attribute Changed Callbacks | ||||
| // Attribute Changed Callbacks are generated by GasaGen/GasaGen_HostWidgetController.cpp | ||||
|  | ||||
| void UHostWidgetController::HealthChanged( FOnAttributeChangeData const& Attribute ) | ||||
| { | ||||
| 	Event_OnHealthChanged.Broadcast( Attribute.NewValue ); | ||||
| } | ||||
|  | ||||
| void UHostWidgetController::MaxHealthChanged( FOnAttributeChangeData const& Attribute ) | ||||
| { | ||||
| 	Event_OnMaxHealthChanged.Broadcast( Attribute.NewValue ); | ||||
| } | ||||
|  | ||||
| void UHostWidgetController::ManaChanged( FOnAttributeChangeData const& Attribute ) | ||||
| { | ||||
| 	Event_OnManaChanged.Broadcast( Attribute.NewValue ); | ||||
| } | ||||
|  | ||||
| void UHostWidgetController::MaxManaChanged( FOnAttributeChangeData const& Attribute ) | ||||
| { | ||||
| 	Event_OnMaxManaChanged.Broadcast( Attribute.NewValue ); | ||||
| } | ||||
| #pragma endregion Attribute Changed Callbacks | ||||
|  | ||||
| void UHostWidgetController::BroadcastInitialValues() | ||||
| { | ||||
| 	Super::BroadcastInitialValues(); | ||||
| 	UGasaAttributeSet* GasaAttribs = Cast<UGasaAttributeSet>( Data.Attributes ); | ||||
| 	if ( GasaAttribs ) | ||||
| 	{ | ||||
| @@ -12,3 +38,24 @@ void UHostWidgetController::BroadcastInitialValues() | ||||
| 		Event_OnMaxManaChanged.Broadcast( GasaAttribs->GetMaxMana() ); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void UHostWidgetController::BindCallbacksToDependencies() | ||||
| { | ||||
| 	UGasaAbilitySystemComp* AbilitySystem = Cast<UGasaAbilitySystemComp>( Data.AbilitySystem ); | ||||
| 	UGasaAttributeSet*      GasaAttribs   = Cast<UGasaAttributeSet>( Data.Attributes ); | ||||
|  | ||||
| 	FOnGameplayAttributeValueChange& HealthAttributeChangedDelegate = | ||||
| 	    AbilitySystem->GetGameplayAttributeValueChangeDelegate( GasaAttribs->GetHealthAttribute() ); | ||||
| 	HealthAttributeChangedDelegate.AddUObject( this, &ThisClass::HealthChanged ); | ||||
|  | ||||
| 	FOnGameplayAttributeValueChange& MaxHealthAttributeChangedDelegate = | ||||
| 	    AbilitySystem->GetGameplayAttributeValueChangeDelegate( GasaAttribs->GetMaxHealthAttribute() ); | ||||
| 	MaxHealthAttributeChangedDelegate.AddUObject( this, &ThisClass::MaxHealthChanged ); | ||||
|  | ||||
| 	FOnGameplayAttributeValueChange& ManaAttributeChangedDelegate = AbilitySystem->GetGameplayAttributeValueChangeDelegate( GasaAttribs->GetManaAttribute() ); | ||||
| 	ManaAttributeChangedDelegate.AddUObject( this, &ThisClass::ManaChanged ); | ||||
|  | ||||
| 	FOnGameplayAttributeValueChange& MaxManaAttributeChangedDelegate = | ||||
| 	    AbilitySystem->GetGameplayAttributeValueChangeDelegate( GasaAttribs->GetMaxManaAttribute() ); | ||||
| 	MaxManaAttributeChangedDelegate.AddUObject( this, &ThisClass::MaxManaChanged ); | ||||
| } | ||||
|   | ||||
| @@ -23,9 +23,15 @@ public: | ||||
|  | ||||
| 	UPROPERTY( BlueprintAssignable, Category = "Attributes" ) | ||||
| 	FAttributeFloatChangedSig Event_OnMaxManaChanged; | ||||
|  | ||||
| 	void HealthChanged( FOnAttributeChangeData const& Data ); | ||||
| 	void MaxHealthChanged( FOnAttributeChangeData const& Data ); | ||||
| 	void ManaChanged( FOnAttributeChangeData const& Data ); | ||||
| 	void MaxManaChanged( FOnAttributeChangeData const& Data ); | ||||
| #pragma endregion Attribute Events | ||||
|  | ||||
| #pragma region WidgetController | ||||
| 	void BroadcastInitialValues() override; | ||||
| 	void BindCallbacksToDependencies() override; | ||||
| #pragma endregion WidgetController | ||||
| }; | ||||
|   | ||||
| @@ -45,4 +45,5 @@ public: | ||||
|  | ||||
| 	UFUNCTION() | ||||
| 	virtual void BroadcastInitialValues() {}; | ||||
| 	virtual void BindCallbacksToDependencies() {}; | ||||
| }; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user