이번 포스트에서는 이전에 만든 Data Table을 활용하여
GE가 발동된 경우, GameplayTag 그 자체를 출력하는 것이 아닌
GameplayTag 별 메세지를 출력하도록 수정해보겠습니다.
1) DT_MessageWidgetData
기존에 만든 DataTable을 다음과 같이 수정했습니다.
이제 DataTable에 저장된 정보대로
Message Tag와 GE의 GameplayTag를 대조하여 Message를 출력하게 됩니다.
따라서 이전에 만든 GE들의 태그를 Message Tag와 동일하게 변경해줘야 합니다.
2) 이전에 만든 GE 블루프린트
이전에 만든 4개의 GE 블루 프린트 모두 위와 같이 Message 태그를 갖도록 설정하였습니다.
이제 C++ 스크립트에서 몇 가지 수정을 해줘야 합니다.
3) AuraOverlayWidgetController
#pragma once
#include "CoreMinimal.h"
#include "UI/WidgetController/AuraWidgetController.h"
#include "GameplayTagContainer.h"
#include "AuraOverlayWidgetController.generated.h"
.
.
.
// UserWidget에서 연결되어 콜백함수를 호출하게 될 델리게이트
// 인자는 FUIWidgetRow임
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FMessageWidgetRowSignature, FUIWidgetRow, Row);
/**
*
*/
UCLASS(BlueprintType, Blueprintable)
class AURA_API UAuraOverlayWidgetController : public UAuraWidgetController
{
GENERATED_BODY()
public:
.
.
.
/*
* Delgate Section
*/
.
.
.
UPROPERTY(BlueprintAssignable, Category = "GAS|Messages")
FMessageWidgetRowSignature MessageWidgetRowDelegate;
protected:
.
.
.
/*
* WidgetData Sesction
*/
protected:
.
.
.
// GameplayTag를 통해 기존에 만든 DataTable의 행을 가져오는 템플릿 함수
template<typename T>
T* GetDataTableRowByTag(UDataTable* DataTable, const FGameplayTag& Tag);
};
// 템플릿의 경우 헤더 파일에서 정의하는 것이 좋음
template <typename T>
T* UAuraOverlayWidgetController::GetDataTableRowByTag(UDataTable* DataTable, const FGameplayTag& Tag)
{
return DataTable->FindRow<T>(Tag.GetTagName(), TEXT(""));
}
.
.
.
void UAuraOverlayWidgetController::BindCallbacksToDependencies()
{
.
.
.
UAuraAbilitySystemComponent* AuraAbilitySystemComponent = Cast<UAuraAbilitySystemComponent>(AbilitySystemComponent);
if (AuraAbilitySystemComponent)
{
AuraAbilitySystemComponent->EffectAssetTags.AddLambda(
[this](const FGameplayTagContainer& AssetTags)
{
for (const FGameplayTag& Tag : AssetTags)
{
// GameplayTag로부터 Message와 연결된 GameplayTag를 가져옴
FGameplayTag MessageTag = FGameplayTag::RequestGameplayTag(FName("Message"));
// 순회중인 Tag를 MessageTag와 비교하여 Message와 연결된 GameplayTag라면 로직을 수행함
// 이때 개별태그가 MatchesTag 메서드를 호출해야 함
if (Tag.MatchesTag(MessageTag))
{
const FUIWidgetRow* Row = GetDataTableRowByTag<FUIWidgetRow>(MessageWidgetDataTable, Tag);
MessageWidgetRowDelegate.Broadcast(*Row);
}
}
}
);
}
}
.
.
.
기존의 만든 로직에서 위와 같이 수정하였습니다.
이때 람다식에서 캡쳐란에 this 포인터를 넣어
람다식을 호출한 주체의 프로퍼티에 접근을 허용하도록 하였습니다.
FGameplayTag를 순회하면서
Message와 연결된 GameplayTag를 가져옵니다.
이때 MatchesTag 메서드를 사용하여 Message와 무관한 GameplayTag는 무시하도록 합니다.
MatchesTag 메서드는 비교해야하는대상.MatchesTag(비교대상) 의 방식으로 사용합니다.
찾은 FUIWidgetRow를 MessageWidgetRowDelegate로 연결된 모든 대상에게 브로드캐스트합니다.
이제 언리얼 에디터에서 작업을 수행합니다.
4) 언리얼 에디터
기존에 만든 OverlayUI의 블루프린트인 WBP_Overlay에서 다음의 로직으로 변경합니다.
WidgetController가 설정된 이후 시퀀스를 돌면서 로직을 수행합니다.
1) 첫 번째 시퀀스
설정된 WidgetController를 가져와 BP_OverlayWdigetController로 캐스팅한뒤, 캐싱합니다.
2) 두 번째 시퀀스
WidgetController와 연결될 UI를 설정합니다.
3) 세 번째 시퀀스
캐싱된 BPOverlayWidgetController의 델리게이트에서 호출할 콜백 함수를 연결합니다.
일단, GE 별로 설정된 Message를 출력합니다.
최종 실행 결과는 다음과 같습니다.
GE가 발동될 때마다 해당 GE의 메세지가 출력되는 것을 확인할 수 있습니다.
'언리얼 > 게임 프로젝트' 카테고리의 다른 글
GameplayAbilitySystem을 이용한 RPG 프로젝트 - (27) OverlayWidgetController 리팩토링 (0) | 2025.01.10 |
---|---|
GameplayAbilitySystem을 이용한 RPG 프로젝트 - (26) 메세지를 위한 전용 UI 만들기 (0) | 2025.01.09 |
Lyra 클론코딩 - (9 - 1) Camera_01 (0) | 2025.01.09 |
Lyra 클론코딩 - (8 - 3) PawnExtension_03 (0) | 2025.01.04 |
Lyra 클론코딩 - (8 - 2) PawnExtension_02 (0) | 2025.01.04 |