1. 데이터 테이블에서 원하는 데이터 찾기
데이터 테이블에서 태그로 해당 로우를 찾아내도록 하자. 이것은 함수로 구현할 것이다.
template<typename T>
T* GetDataTableRowByTag(UDataTable* DataTable, const FGameplayTag& Tag);
데이터 테이블에는 다향한 타입의 데이터들이 있고 이 모든 데이터 중 원하는 것을 받아오는 것이 가능하게 템블릿 함수로 만들어주었다.
이제 이 함수를 정의하자. 템플릿 함수는 선언이 파일과 동일한 파일에서 구현해야 한다. (이 경우 헤더파일에서 선언과 정의 전부 한다)
template <typename T>
T* UOverlayWidgetController::GetDataTableRowByTag(UDataTable* DataTable, const FGameplayTag& Tag)
{
return DataTable->FindRow<T>(Tag.GetTagName(), TEXT(""));
}
이제 위젯 컨트롤러 cpp 파일에서 이 함수를 호출하도록 하자.
Cast<UAuraAbilitySystemComponent>(AbilitySystemComponent)->EffectAssetTags.AddLambda(
[this](const FGameplayTagContainer& AssetTags)
{
for (const FGameplayTag& Tag : AssetTags)
{
FUIWidgetRow* Row = GetDataTableRowByTag<FUIWidgetRow>(MessageWidgetDataTable, Tag);
}
}
);
이제 이 Row 정보를 위젯으로 브로드 캐스트 해야한다.
2. Row 정보 위젯으로 브로드캐스트 하기
이제 델리게이트를 만들어 위젯에서 이를 수신할 수 있게 해야한다. 체력과 마나에 대한 델리게이트를 만들었던 것처럼 만들면 된다.
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FMessageWidgetRowSignature, FUIWidgetRow, Row);
델리게이트를 선언하였다.
이제 이 델리게이트 타입으로 인스턴스를 생성하자.
UPROPERTY(BlueprintAssignable, Category = "GAS|Messages")
FMessageWidgetRowSignature MessageWidgetRowDelegate;
이제 이 델리게이트를 브로드캐스트 하자.
Cast<UAuraAbilitySystemComponent>(AbilitySystemComponent)->EffectAssetTags.AddLambda(
[this](const FGameplayTagContainer& AssetTags)
{
for (const FGameplayTag& Tag : AssetTags)
{
FGameplayTag MessageTag = FGameplayTag::RequestGameplayTag(FName("Message"));
if (Tag.MatchesTag(MessageTag))
{
FUIWidgetRow* Row = GetDataTableRowByTag<FUIWidgetRow>(MessageWidgetDataTable, Tag);
MessageWidgetRowDelegate.Broadcast(*Row);
}
}
}
);
에셋 태그 컨테이너 안에 있는 태그가 메세지 태그에 속하는지 확인하고 트루일 경우 브로드 캐스트 한다.
이제 위젯 클래스에서 이를 수신해서 적절한 메세지를 보여주면 될 것이다.
이런식으로 사용하면 될 것이다. 현재 메세지 위젯을 만들지 않았다. 이것을 만들고 작업을 이어나가야 할 것이다.
'게임프로그래밍 > 실습2' 카테고리의 다른 글
[실습2] 30. 게임플레이 이펙트로 어트리뷰트 초기화 하기 (0) | 2024.12.01 |
---|---|
[실습 2] 29. 클램핑 버그 고치기 (0) | 2024.11.30 |
[실습2] 27. 태그 브로드 캐스팅 하기 - 1 (0) | 2024.11.30 |
[실습2] 26. 게임 플레이 이펙트에 게임플레이 태그 적용하고 태그 출력하기 (0) | 2024.11.30 |
[실습2] 25. PostGameplayEffectExecute() - 어트리뷰트 변경 후 호출되는 함수 (0) | 2024.11.30 |