언리얼/게임 프로젝트

GameplayAbilitySystem을 이용한 RPG 프로젝트 - (12) 체력 UI에 델리게이트 연결하기

monstro 2024. 11. 29. 01:28
728x90
반응형

이번에는 기존의 UI 시스템을 발전시켜 Attribute Set의 데이터를 UI가 반영할 수 있도록 하겠습니다.

우선 C++ 클래스의 일부를 손보도록 하겠습니다.

 

Model의 정보를 View에 반영하는 일은 UAuraWidgetController가 수행해야 합니다.

따라서 함수를 추가하겠습니다.

1) UAuraWidgetController

.
.
.
UCLASS()
class AURA_API UAuraWidgetController : public UObject
{
	GENERATED_BODY()
	
public:
	.
   	.
   	.

	virtual void BroadcastInitialValues();
	
protected:
	.
   	.
   	.
};

 

.
.
.
void UAuraWidgetController::BroadcastInitialValues()
{

}

 

추가된 함수인 BroadcastInitialValues는 WidgetController가 데이터를 받으면

연결된 UI에 데이터를 전달하는 역할을 수행합니다.

자세한 사항은 UI 별로 다르게 구현되야 하므로 빈 함수로 두겠습니다.

 

2) UAuraOverlayWidgetController

#pragma once

#include "CoreMinimal.h"
#include "UI/WidgetController/AuraWidgetController.h"
#include "AuraOverlayWidgetController.generated.h"

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnHealthChangedSignature, float, NewHealth);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnMaxHealthChangedSignature, float, NewMaxHealth);

/**
 * 
 */
UCLASS(BlueprintType, Blueprintable)
class AURA_API UAuraOverlayWidgetController : public UAuraWidgetController
{
	GENERATED_BODY()
	
public:
	virtual void BroadcastInitialValues() override;

	/*
	* Delgate Section
	*/
	UPROPERTY(BlueprintAssignable, Category = "GAS|Attributes")
	FOnHealthChangedSignature OnHealthChanged;

	UPROPERTY(BlueprintAssignable, Category = "GAS|Attributes")
	FOnMaxHealthChangedSignature OnMaxHealthChanged;
};

 

OverlayWidgetController는 위와 같이 변경되었습니다.

델리게이트를 2개 만들어 일단 Health와 MaxHealth에 대한 BroadcastInitialValues 함수를 호출하도록 합니다.

또한 클래스 타입을 BlueprintType, Blueprintable로 만들어 

블루 프린트 내에서 함수를 호출하거나 변수로 만들 수 있도록 설정하였습니다.

 

#include "UI/WidgetController/AuraOverlayWidgetController.h"
#include "AbilitySystem/AuraAttributeSet.h"

void UAuraOverlayWidgetController::BroadcastInitialValues()
{
	const UAuraAttributeSet* AuraAttributeSet = CastChecked<UAuraAttributeSet>(AttributeSet);

	OnHealthChanged.Broadcast(AuraAttributeSet->GetHealth());
	OnMaxHealthChanged.Broadcast(AuraAttributeSet->GetMaxHealth());
}

 

동작도 간단하게 이뤄집니다.

AttributeSet을 AuraAttributeSet으로 캐스팅하고 

각각 만들어진 델리게이트를 통해 해당 AS에서 얻어낼 수 있는 정보를 Broadcast 합니다.

 

3) AAuraHUD

.
.
.
// HUD에서 OverlayWidget을 설정하는 함수
void AAuraHUD::InitOverlay(APlayerController* InPlayerController, APlayerState* InPlayerState, UAbilitySystemComponent* InAbilitySystemComppnent, UAttributeSet* InAttributeSet)
{
	.
	.
   	.
	OverlayWidget->SetWidgetController(WidgetController);
	WidgetController->BroadcastInitialValues();
	Widget->AddToViewport();
}

 

AuraHUD의 InitOverlay 함수는 뷰포트 화면에 Overlay를 띄우도록 합니다.

이때 Overlay 위젯의 WidgetController가 BroadcastInitialValues 함수를 호출하여

AS의 기본값을 위젯에 반영할 수 있도록 합니다.

 

이제 언리얼 에디터에서 블루 프린트로 작업을 해보겠습니다.

 

4) 언리얼 에디터

WBP_Overlay 에서는 WidgetController가 설정될 때 기존의 체력 UI와 마나 UI가

올바른 WidgetController를 설정할 수 있도록 로직을 추가합니다.

 

WBP_ProgressBar에서는 ProgressBar의 퍼센트를 조정할 수 있는 함수를 생성하였습니다.

 

최종적으로 체력 UI인 WBP_HealthGlobe에서는 WidgetController가 설정되면 다음의 로직을 수행합니다.

우선 자신의 WidgetController를 가져와 캐스팅하여 확인합니다.

 

캐스팅되어 올바르게 가져온 WidgetController에 대해 OnHealthChanged_Event를 바인딩합니다.

 

마지막으로 OnMaxHealthChanged_Event에 대해서도 바인딩합니다.

 

최종 실행 결과는 다음과 같습니다.

 

728x90
반응형