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);
            }
        }
    );

 

람다 함수 내에서 멤버 변수에 접근하기 위해서는 객체를 캡쳐해야 한다.