0. 개요
오버레이 위젯 컨트롤러 블루프린트에 연결된 행의 정보를 가져와 UI 위젯으로 넘겨오는 것을 구현한다.
1. 데이터 테이블에 값 입력하기
데이터 테이블에서 값을 가져오기 전에 미리 데이터를 채워둔다.
게임플레이 이펙트의 에셋 태그를 모두 제거하고 Message 하위의 태그로 변경한다.
2. C++에서 데이터 테이블 정보 읽기
오버레이 위젯 컨트롤러에서 데이터 테이블을 가져와 각 행의 데이터를 읽으려고 한다.
이 때, 확장성과 코드 재활용성을 위해 포괄적으로 함수를 만들기 위해 템플릿을 이용한다.
protected:
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Widget Data")
TObjectPtr<UDataTable> MessageWidgetDataTable;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
template<typename T>
T* GetDataTableRowByTag(UDataTable* DataTable, const FGameplayTag& Tag);
};
template <typename T>
inline T *UOverlayWidgetController::GetDataTableRowByTag(UDataTable *DataTable, const FGameplayTag &Tag)
{
return DataTable->FindRow<T>(Tag.GetTagName(), TEXT(""));
}
데이터 테이블을 가져와 태그의 이름을 행에서 찾는다.
FindRow의 두번째 인자는 검색에 실패했을 때 출력할 문자열, 세번째 인자는 실패했을 때 오류 출력여부를 나타낸
(기본적으로 true)
이제 기존의 람다 함수를 수정하여 위에서 정의한 템플릿 함수를 사용해 행의 값을 불러온다.
Cast<UAuraAbilitySystemComponent>(AbilitySystemComponent)->EffectAssetTags.AddLambda(
[this](const FGameplayTagContainer& AssetTags)
{ /* 멤버 변수에 접근하려면 캡쳐 */
for (const FGameplayTag& Tag : AssetTags)
{
const FString Msg = FString::Printf(TEXT("GE Tag: %s"), *Tag.ToString());
GEngine->AddOnScreenDebugMessage(-1, 8.f, FColor::Blue, Msg);
FUIWidgetRow* Row = GetDataTableRowByTag<FUIWidgetRow>(MessageWidgetDataTable, Tag);
}
}
);
람다 함수 내에서 멤버 변수에 접근하기 위해서는 객체를 캡쳐해야 한다.
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
5-11. UI - (4) 메세지 위젯 생성 (0) | 2024.09.02 |
---|---|
5-10. UI - (3) 데이터 테이블 행을 위젯에 전달하기 (0) | 2024.09.02 |
5-8. UI - (1) 위젯에 데이터 전달하기 - 데이터 테이블 (0) | 2024.09.02 |
5-7. 에셋 태그를 위젯 컨트롤러로 전달(Broadcast)하기 (1) | 2024.09.02 |
5-6. 액터가 보유한 태그 가져오기 - GetAllAssetTags (0) | 2024.08.30 |