언리얼/게임 프로젝트

GameplayAbilitySystem을 이용한 RPG 프로젝트 - (24) UI와 GE의 Tag 연동 준비

monstro 2025. 1. 3. 01:47
728x90
반응형

이번 포스트에서는 이전 포스트에서 소개해드린,

GE의 Tag와 UI를 연동하는 작업의 준비를 해보도록 하겠습니다.

 

우선, 기존의 Ability System Component에서 수행하던 작업을 

델리게이트를 통해 UI Controller에게 넘겨주어 처리하도록 하겠습니다.

 

1) AuraAbilitySystemComponent

#pragma once

#include "CoreMinimal.h"
#include "AbilitySystemComponent.h"
#include "AuraAbilitySystemComponent.generated.h"

DECLARE_MULTICAST_DELEGATE_OneParam(FEffectAssetTags, const FGameplayTagContainer& /*AssetTags*/);

/**
 * 
 */
UCLASS()
class AURA_API UAuraAbilitySystemComponent : public UAbilitySystemComponent
{
	GENERATED_BODY()
	
public:
	.
	.
	.
	
	/*
	*  Delegate Section
	*/
	FEffectAssetTags EffectAssetTags;
	
	.
	.
	.
};

 

.
.
.
void UAuraAbilitySystemComponent::EffectApplied(UAbilitySystemComponent* AbilitySystemComponent, const FGameplayEffectSpec& EffectSpec, FActiveGameplayEffectHandle ActiveEffectHandle)
{
	FGameplayTagContainer TagContainer;
	EffectSpec.GetAllAssetTags(TagContainer);

	// GE가 발동된 후에, GE의 태그를 가져와 채워넣은 TagContainer를 
	// 델리게이트를 통해 ASC가 연결된 모든 오브젝트에 브로드캐스트
	EffectAssetTags.Broadcast(TagContainer);
}

 

GE의 적용 이후델리게이트를 통해

ASC에 연결된 모든 오브젝트에게 TagContainer를 브로드캐스트하게 됩니다.

 

ASC와 연결된 요소들 중에서

TagContainer를 받아 화면에 띄우는 것은 UI Controller의 몫입니다. 

따라서 이를 마저 구현하겠습니다.

 

2) AuraOverlayWidgetController

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

.
.
.

// 브로드캐스트된 TagContainer를 저장하기 위한, TableRow로부터 상속된 구조체
USTRUCT(BlueprintType)
struct FUIWidgetRow : public FTableRowBase
{
	GENERATED_BODY()

	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	FGameplayTag MessageTag = FGameplayTag();

	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	FText Message = FText();

	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	TSubclassOf<class UAuraUserWidget> MessageWidget;

	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	UTexture2D* Image = nullptr;
};

/**
 * 
 */
UCLASS(BlueprintType, Blueprintable)
class AURA_API UAuraOverlayWidgetController : public UAuraWidgetController
{
	
	.
	.
	.
    
	/*
	* WidgetData Sesction
	*/
protected:
	// TagContainer를 저장하기 위한 포인터
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Widget Data")
	TObjectPtr<UDataTable> MessageWidgetDataTable;
};

 

.
.
.

void UAuraOverlayWidgetController::BindCallbacksToDependencies()
{

	.
	.
	.

	// 기존에 ASC에서 수행하던 로직을 UI Controller에서 수행
	// 아직까지는 TagContainer를 채우지는 않음
	UAuraAbilitySystemComponent* AuraAbilitySystemComponent = Cast<UAuraAbilitySystemComponent>(AbilitySystemComponent);
	if (AuraAbilitySystemComponent)
	{
		AuraAbilitySystemComponent->EffectAssetTags.AddLambda(
			[](const FGameplayTagContainer& AssetTags) 
			{
				for (const FGameplayTag& Tag : AssetTags)
				{
					const FString TagMsg = FString::Printf(TEXT("GE Tag : %s"), *Tag.ToString());
					GEngine->AddOnScreenDebugMessage(-1, 8.f, FColor::Blue, TagMsg);
				}
			}
		);
	}
}

.
.
.

 

UI Controller에서 연결된 오브젝트의 이벤트로부터 콜백함수를 수행하는 

BindCallbacksToDependencies 메서드에서 기존의 ASC가 수행하던 로직을 수행하도록 하였습니다.

 

이때 별도의 함수를 따로 만들지 않고 람다식을 통해 로직을 수행하도록 하였습니다.

아직까지는 TagContainer 프로퍼티를 채우지는 않습니다.

 

이제 언리얼 에디터로 넘어가 필요한 부분을 채워가도록 하겠습니다.

 

3) 언리얼 에디터

먼저 UI Controller에 GE의 적용 시 보내지는 Tag를 설명하기 위한 Tag를 추가하였습니다.

 

 

다음으로 FUIWidgetRow로부터 상속받아 만든 Data Table인 DT_MessageWidgetData를 생성하였습니다.

해당 Data Table은 UI Controller의 프로퍼티로 사용되어

GE의 발동 이후에 Tag가 전달되면 내용을 채우게 됩니다.

 

마지막으로 UI Controller의 프로퍼티로 이전에 만든 DT를 설정해주겠습니다.

 

 

최종적으로 현재의 로직이 문제없이 동작하여

UI Controller가 화면에 GE의 Tag를 전달받아 문제없이 띄우는지 확인해보겠습니다.

 

위와 같이 문제없이 띄워지는 것을 확인할 수 있습니다.

728x90
반응형