UE 5 스터디/Gameplay Ability System(GAS)
5-9. UI - (2) 데이터 테이블에서 정보 가져오기
Crat3
2024. 9. 2. 18:14
0. 개요
오버레이 위젯 컨트롤러 블루프린트에 연결된 행의 정보를 가져와 UI 위젯으로 넘겨오는 것을 구현한다.
1. 데이터 테이블에 값 입력하기
데이터 테이블에서 값을 가져오기 전에 미리 데이터를 채워둔다.
게임플레이 이펙트의 에셋 태그를 모두 제거하고 Message 하위의 태그로 변경한다.
2. C++에서 데이터 테이블 정보 읽기
오버레이 위젯 컨트롤러에서 데이터 테이블을 가져와 각 행의 데이터를 읽으려고 한다.
이 때, 확장성과 코드 재활용성을 위해 포괄적으로 함수를 만들기 위해 템플릿을 이용한다.
8-5. 템플릿 기초(2) - 클래스 템플릿
1. 클래스 템플릿 ex) 랜덤박스의 데이터를 반환하기 class RandomBox { public: int GetRandomData() { int idx = rand() % 10; return _data[idx]; } public: int _data[10]; }; int main() { srand(static_cast(time(nullptr))); RandomBox rb1; for (i
crat.tistory.com
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);
}
}
);
람다 함수 내에서 멤버 변수에 접근하기 위해서는 객체를 캡쳐해야 한다.