리얼 개발

[UE5] 데이터 테이블 본문

Unreal Engine5

[UE5] 데이터 테이블

econo-my 2025. 3. 2. 15:44

게임에선 많은 데이터들이 사용된다. 

이러한 데이터를 저장하고 정리하는 방법들은 다양하다.

 

언리얼은 많은 데이터 저장 방법을 제공하며 대표적으로 데이터 애셋과 데이터 테이블이 있다.

여기선 데이터 테이블을 소개하고 사용법을 간단히 알아보고자 한다.

 

데이터 테이블 (Data Table)

데이터 테이블은 FTableRowBase 구조체를 기반으로 CSV, JSON 같은 형식의 데이터 파일을 가져와서 다룰 수 있는 방식이다.

 

특징은 다음과 같다.

  • FTableRowBase를 상속받은 구조체를 사용하여 데이터의 형식을 정의함.
  • 엑셀, CSV, JSON과 호환 가능하여 대량의 데이터를 쉽게 관리할 수 있음.
  • 게임 플레이 도중 데이터를 변경할 수 없음 (즉, 게임 시작 전에 데이터가 고정됨).
  • 고정된 대량의 데이터 관리에 적합 (예: 아이템 목록, 레벨 테이블, NPC 대사 목록 등).

 

장점은 다음과 같다.

  • CSV, JSON 같은 외부 데이터와 연동하여 엑셀에서 데이터 관리 가능.
  • 다수의 데이터를 한 번에 다룰 수 있어 일괄 편집이 쉬움.
  • 빠른 조회가 가능함 (인덱스를 통한 직접 접근).

 

단점은 다음과 같다.

  • UObject가 아니라서 동적 변경이 불가능함.
  • 계층 구조나 상속이 불가능하여 유연성이 낮음.

 

데이터 테이블을 활용해 애니메이션 몽타주를 관리해보자.

 

 

데이터 테이블 활용

먼저 언리얼 프로젝트 폴더로 들어가서 Source 폴더 내에 새 텍스트 파일을 만든 뒤 확장자를 .h 로 변경해준다. 이는 데이터 테이블이 UObject 를 상속받지 않기에 에디터에서 클래스를 생성할 수 없기 때문이다.

 

 

예를 누른후 구조체를 하나 만들고 FTableRowBase를 상속받아주자.

#pragma once

#include "CoreMinimal.h"
#include "Engine/DataTable.h"
#include "RWAnimMontageData.generated.h"

USTRUCT(BlueprintType)
struct FRWAnimMontageData : public FTableRowBase
{
	GENERATED_BODY()

public:
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Animation")
	TSoftObjectPtr<UAnimMontage> AttackMontage;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Animation")
	TSoftObjectPtr<UAnimMontage> DeadMontage;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Animation")
	TSoftObjectPtr<UAnimMontage> WarinessMontage;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Animation")
	TSoftObjectPtr<UAnimMontage> UnWarinessMontage;
};

약 참조를 위해 TSoftObjectPtr 스마트 포인터를 사용했다.

 

코드를 다 작성했다면 .uproject를 우클릭 하여 Generate Visual Studio project files 를 실행해주자. 

이는 Unreal Build Tool를 실행해주는 것으로 우리가 외부에서 만든 텍스트 파일(.h 로 변경한)을 해당 프로젝트에 포함시킨다.

 

모두 완료했다면 에디터로 들어가 아래 순서로 블루프린트를 하나 만들어주면 된다.

Content Browser 우클릭 -> Miscellaneous -> DataTable -> 아까 만든 구조체 이름 검색

 

 

Add 버튼을 눌러 데이터를 추가할 수 있다.

Row Name은 수퍼키로 중복되면 안된다.

그리고 구조체에서 선언했던 변수들이 순서대로 들어가 있는 모습이다.

 

이제 DataTable에 들어가 있는 데이터를 꺼내쓰기만 하면 끝이다.

아무 접근할 수 있는 클래스(난 싱글톤 클래스 사용)를 하나 만들어 다음과 같이 데이터에 접근하자.

//.h
public:
	FORCEINLINE FRWAnimMontageData GetAnimMontage(const FName& ClassName) const { return AnimMontageTable[ClassName]; }

private:
	UPROPERTY(VisibleAnywhere, Category = "Animation")
	TMap<FName, FRWAnimMontageData> AnimMontageTable;

//cpp
static ConstructorHelpers::FObjectFinder<UDataTable> AnimMontageDataTableRef(TEXT("/Script/Engine.DataTable'/Game/Data/RWAnimMontageDataTable.RWAnimMontageDataTable'"));
if (AnimMontageDataTableRef.Succeeded())
{
	const UDataTable* AnimMontageDataTable = AnimMontageDataTableRef.Object;
	check(AnimMontageDataTable->GetRowMap().Num() > 0);

	for (const auto& Elem : AnimMontageDataTable->GetRowMap())
	{
		const FName& RowName = Elem.Key;
		const FRWAnimMontageData* StatPtr = reinterpret_cast<const FRWAnimMontageData*>(Elem.Value);
		if (StatPtr)
		{
			AnimMontageTable.Add(RowName, *StatPtr);
		}
	}
}

 

 

마지막으로 약참조된 포인터(TSoftObjectPtr)은 다음과 같이 사용하면 된다.

if (AnimMontageData.DeadMontage.IsPending())
{
	AnimMontageData.DeadMontage.LoadSynchronous();
}

Anim->Montage_Play(AnimMontageData.DeadMontage.Get());

 

 

 

'Unreal Engine5' 카테고리의 다른 글

[UE5] AIPerception  (1) 2024.11.05
[UE5] 모션워핑과 풀바디 IK  (0) 2024.10.16
[UE5] 언리얼 빌드 시스템  (1) 2024.09.12
[UE5] 무기 선택 창으로 무기 교체하기  (0) 2024.09.11
[UE5] Vector 클래스 분석  (0) 2024.09.04